// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.physicalweb;

import android.app.PendingIntent;
import android.content.Intent;

import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.nearby.Nearby;

import org.chromium.base.ContextUtils;


/**
 * This class represents a connection to Google Play Services that does background
 * subscription/unsubscription to Nearby Eddystone-URLs.
 */
class NearbyBackgroundSubscription extends NearbySubscription {
    private static final String TAG = "PhysicalWeb";
    private final int mAction;
    private final Runnable mCallback;

    NearbyBackgroundSubscription(int action, Runnable callback) {
        super(ContextUtils.getApplicationContext());
        mAction = action;
        mCallback = callback;
    }

    NearbyBackgroundSubscription(int action) {
        this(action, null);
    }

    private PendingIntent createNearbySubscribeIntent() {
        Intent intent =
                new Intent(ContextUtils.getApplicationContext(), NearbyMessageIntentService.class);
        PendingIntent pendingIntent = PendingIntent.getService(
                ContextUtils.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    @Override
    protected void onConnected() {
        PendingResult<Status> pendingResult = null;
        String actionStr = null;
        if (mAction == SUBSCRIBE) {
            pendingResult = Nearby.Messages.subscribe(
                    getGoogleApiClient(), createNearbySubscribeIntent(), createSubscribeOptions());
            actionStr = "background subscribe";
        } else {
            pendingResult = Nearby.Messages.unsubscribe(
                    getGoogleApiClient(), createNearbySubscribeIntent());
            actionStr = "background unsubscribe";
        }
        pendingResult.setResultCallback(new SimpleResultCallback(actionStr) {
            @Override
            public void onResult(final Status status) {
                super.onResult(status);
                disconnect();
                if (mCallback != null) {
                    mCallback.run();
                }
            }
        });
    }

    void run() {
        connect();
    }
}