/**
 * Copyright (c) 2017-present, Stanislav Doskalenko - [email protected]
 * All rights reserved.
 *
 * This source code is licensed under the MIT-style license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * Based on Asim Malik android source code, copyright (c) 2015
 *
 **/

package com.reactnative.googlefit;

import com.reactnative.googlefit.GoogleFitManager;

import com.facebook.react.bridge.ReactContext;

import android.support.annotation.NonNull;
import android.util.Log;

import com.google.android.gms.fitness.Fitness;
import com.google.android.gms.fitness.FitnessStatusCodes;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.fitness.data.DataType;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;

import com.google.android.gms.fitness.result.ListSubscriptionsResult;
import com.google.android.gms.fitness.data.Subscription;

import com.facebook.react.modules.core.DeviceEventManagerModule;
import android.support.annotation.Nullable;

import java.util.ArrayList;


public class RecordingApi {

    private ReactContext reactContext;
    private GoogleFitManager googleFitManager;

    private static final String TAG = "RecordingApi";

    @Nullable
    public static DataType getDataType(String dataTypeName) {
        switch (dataTypeName) {
            case "step":
                return DataType.TYPE_STEP_COUNT_DELTA;
            case "distance":
                return DataType.TYPE_DISTANCE_DELTA;
            case "activity":
                return DataType.TYPE_ACTIVITY_SAMPLES;
            default:
                Log.v(TAG, "Unknown data type " + dataTypeName);
                return null;
        }
    }

    public static String getEventName(String dataTypeName) {
        return dataTypeName.toUpperCase() + "_RECORDING";
    }

    public RecordingApi (ReactContext reactContext, GoogleFitManager googleFitManager) {

        this.reactContext = reactContext;
        this.googleFitManager = googleFitManager;

    }

    public void subscribe(ReadableArray dataTypes) {
        ArrayList<String> dataTypesList = new ArrayList<String>();

        for (Object type : dataTypes.toArrayList()) {
            dataTypesList.add(type.toString());
        }


        for (String dataTypeName : dataTypesList) {
            DataType dataType = getDataType(dataTypeName);

            // Just skip unknown data types
            if (dataType == null) {
                continue;
            }

            final String eventName = getEventName(dataTypeName);

            Fitness.RecordingApi.subscribe(googleFitManager.getGoogleApiClient(), dataType)
                    .setResultCallback(new ResultCallback<Status>() {
                        @Override
                        public void onResult(@NonNull Status status) {
                            WritableMap map = Arguments.createMap();

                            map.putString("type", eventName);

                            if (status.isSuccess()) {
                                map.putBoolean("recording", true);
                                Log.i(TAG, "RecordingAPI - Connected");
                                sendEvent(reactContext, eventName, map);
                            } else {
                                map.putBoolean("recording", false);
                                Log.i(TAG, "RecordingAPI - Error connecting");
                                sendEvent(reactContext, eventName, map);
                            }
                        }
                    });
        }
    }


    private void sendEvent(ReactContext reactContext,
        String eventName, @Nullable WritableMap params) {
        reactContext
            .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit(eventName, params);
    }
}