package io.tryrook.rook.sdk;

import androidx.annotation.OptIn;
import androidx.core.content.ContextCompat;

import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
import com.rookmotion.rook.sdk.RookPermissionsManager;
import com.rookmotion.rook.sdk.domain.annotation.ExperimentalRookApi;
import com.rookmotion.rook_sdk_health_connect.permissions.AndroidPermissionsListener;
import com.rookmotion.rook_sdk_health_connect.permissions.AndroidPermissionsReceiverTransmitter;
import com.rookmotion.rook_sdk_health_connect.permissions.HealthConnectListener;
import com.rookmotion.rook_sdk_health_connect.permissions.HealthConnectPermissionsReceiverTransmitter;
import android.content.IntentFilter;

@CapacitorPlugin(name = "RookSDK")
public class RookSDKPlugin extends Plugin implements HealthConnectListener, AndroidPermissionsListener {
    private RookImplementation implementation = new RookImplementation();
    private HealthConnectPermissionsReceiverTransmitter healthConnectReceiver = new HealthConnectPermissionsReceiverTransmitter();
    private AndroidPermissionsReceiverTransmitter androidReceiver = new AndroidPermissionsReceiverTransmitter();

    @PluginMethod
    public void initRook(PluginCall call) {
        implementation.initRookConfigurationManager(this.getActivity().getApplicationContext());
        implementation.initRook(call);
        healthConnectReceiver.setListener(this);
        androidReceiver.setListener(this);
        ContextCompat.registerReceiver(
                this.getActivity().getApplicationContext(),
                healthConnectReceiver,
                new IntentFilter(RookPermissionsManager.ACTION_HEALTH_CONNECT_PERMISSIONS),
                ContextCompat.RECEIVER_EXPORTED);
        ContextCompat.registerReceiver(
                this.getActivity().getApplicationContext(),
                androidReceiver,
                new IntentFilter(RookPermissionsManager.ACTION_ANDROID_PERMISSIONS),
                ContextCompat.RECEIVER_EXPORTED);
    }

    @PluginMethod
    public void updateUserId(PluginCall call) {
        implementation.updateUserId(call);
    }

    @PluginMethod
    public void deleteUserFromRook(PluginCall call) {
        implementation.deleteUserFromRook(call);
    }

    @PluginMethod
    public void getUserId(PluginCall call) {
        implementation.getUserId(call);
    }

    @PluginMethod
    public void syncUserTimeZone(PluginCall call) {
        implementation.syncUserTimeZone(call);
    }

    @PluginMethod
    public void checkAvailability(PluginCall call) {
        implementation.checkAvailability(call);
    }

    @PluginMethod
    public void getDiagnostic(PluginCall call) {
        implementation.getDiagnostic(call);
    }

    // Permissions

    @PluginMethod
    public void requestSamsungHealthPermissions(PluginCall call) {
        implementation.requestSamsungHealthPermissions(call);
    }

    @PluginMethod
    public void requestHealthConnectPermissions(PluginCall call) {
        implementation.requestHealthConnectPermissions(call);
    }

    @PluginMethod
    public void requestAndroidPermissions(PluginCall call) {
        implementation.requestAndroidPermissions(call);
    }

    @PluginMethod
    public void checkAndroidPermissions(PluginCall call) {
        implementation.checkAndroidPermissions(call);
    }

    @PluginMethod
    public void openHealthConnectSettings(PluginCall call) {
        implementation.openHealthConnectSettings(call);
    }

    @PluginMethod
    public void checkHealthConnectPermissions(PluginCall call) {
        implementation.checkHealthConnectPermissions(call);
    }

    @PluginMethod
    public void revokeHealthConnectPermissions(PluginCall call) {
        implementation.revokeHealthConnectPermissions(call);
    }

    @PluginMethod
    public void checkHealthConnectPermissionsPartially(PluginCall call) {
        implementation.checkHealthPermissionsPartially(call);
    }

    @PluginMethod
    public void checkSamsungHealthAvailability(PluginCall call) {
        implementation.checkSamsungHealthAvailability(call);
    }

    @PluginMethod
    public void checkSamsungHealthPermission(PluginCall call) {
        implementation.checkSamsungHealthPermission(call);
    }

    @PluginMethod
    public void checkSamsungHealthPermissionPartially(PluginCall call) {
        implementation.checkSamsungHealthPermissionPartially(call);
    }

    @PluginMethod
    public void checkExactAlarmPermissions(PluginCall call) {
        implementation.checkExactAlarmPermissions(call);
    }
    @PluginMethod
    public void requestExactAlarmPermissions(PluginCall call) {
        implementation.requestExactAlarmPermissions(call);
    }
    @PluginMethod
    public void checkBatteryOptimizationsDisabled(PluginCall call) {
        implementation.checkBatteryOptimizationsDisabled(call);
    }
    @PluginMethod
    public void checkHistoryReadStatus(PluginCall call) {
        implementation.checkHistoryReadStatus(call);
    }
    @PluginMethod
    public void requestDisableBatteryOptimizations(PluginCall call) {
        implementation.requestDisableBatteryOptimizations(call);
    }
    @PluginMethod
    public void requiresOemAutoStartSetup(PluginCall call) {
        implementation.requiresOemAutoStartSetup(call);
    }
    @PluginMethod
    public void openOemAutoStartSetup(PluginCall call) {
        implementation.openOemAutoStartSetup(call);
    }

    // Sync

    @PluginMethod
    public void sync(PluginCall call) {
        implementation.sync(call);
    }

    @PluginMethod
    public void getSleepSummaries(PluginCall call) {
        implementation.getSleepSummary(call);
    }

    @PluginMethod
    public void getPhysicalSummary(PluginCall call) {
        implementation.getPhysicalSummary(call);
    }

    @PluginMethod
    public void getBodySummary(PluginCall call) {
        implementation.getBodySummary(call);
    }

    @PluginMethod
    public void getActivityEvents(PluginCall call) {
        implementation.getActivityEvents(call);
    }

    @PluginMethod
    public void reSyncFailedSummaries(PluginCall call) {
        implementation.reSyncFailedSummaries(call);
    }

    @PluginMethod
    public  void syncEvents(PluginCall call) {
        implementation.syncEvents(call);
    }

    @PluginMethod
    public void syncPendingEvents(PluginCall call) {
        implementation.syncPendingEvents(call);
    }

    @PluginMethod
    public void getTodayStepCount(PluginCall call) {
        implementation.syncTodayStepsCount(call);
    }

    @PluginMethod
    public void getTodayCalories(PluginCall call) {
        implementation.getTodayCaloriesCount(call);
    }

    @PluginMethod
    public void getTodayHeartRate(PluginCall call) {
        implementation.getTodayHeartRate(call);
    }

    @PluginMethod
    public  void writeNutritionEvent(PluginCall call) {
        implementation.writeNutritionEvent(call);
    }

    @PluginMethod
    public void syncTodayAndroidStepsCount(PluginCall call) { implementation.syncTodayAndroidStepsCount(call); }

    // Background

    @PluginMethod
    public void enableBackgroundAndroidSteps(PluginCall call) {
        implementation.enableBackgroundAndroidSteps(call);
    }

    @PluginMethod
    public void disableBackgroundAndroidSteps(PluginCall call) {
        implementation.disableBackgroundAndroidSteps(call);
    }

    @PluginMethod
    public void isBackgroundAndroidStepsActive(PluginCall call) {
        implementation.isBackgroundAndroidStepsActive(call);
    }

    @PluginMethod
    public void enableHealthConnectBackGround(PluginCall call) {
        implementation.scheduleBackground(call);
    }

    @PluginMethod
    public void disableHealthConnectBackGround(PluginCall call) {
        implementation.cancelBackground(call);
    }

    @PluginMethod
    public  void isHealthConnectBackgroundScheduled(PluginCall call) {
        implementation.isHealthConnectBackgroundScheduled(call);
    }

    @PluginMethod
    public void checkBackgroundReadStatus(PluginCall call) {
        implementation.checkBackgroundReadStatus(call);
    }

    @PluginMethod
    public void scheduleSamsungHealthBackGround(PluginCall call) {
        implementation.scheduleSamsungHealthBackGround(call);
    }
    @PluginMethod
    public void cancelSamsungHealthBackGround(PluginCall call) {
        implementation.cancelSamsungHealthBackGround(call);
    }
    @PluginMethod
    public void isSamsungHealthBackgroundScheduled(PluginCall call) {
        implementation.isSamsungHealthBackgroundScheduled(call);
    }

    @PluginMethod
    public void getDataSourcesAuthorized(PluginCall call) {
        implementation.getDataSourcesAuthorized(call);
    }

    @PluginMethod
    public void getDataSourceAuthorizer(PluginCall call) {
        implementation.getDataSourceAuthorizer(call);
    }

    @PluginMethod
    public void revokeDataSource(PluginCall call) {
        implementation.revokeDataSource(call);
    }

    @PluginMethod
    public void isRookStepsCounterAvailable(PluginCall call) {
        implementation.isRookStepsCounterAvailable(call);
    }

    @PluginMethod
    public void isRookStepsCounterActive(PluginCall call) {
        implementation.isRookStepsCounterActive(call);
    }

    @PluginMethod
    public void enableRookStepsCounter(PluginCall call) {
        implementation.enableRookStepsCounter(call);
    }

    @PluginMethod
    public void disableRookStepsCounter(PluginCall call) {
        implementation.disableRookStepsCounter(call);
    }

    @PluginMethod
    public void getRookTodayStepsCount(PluginCall call) {
        implementation.getRookTodayStepsCount(call);
    }

    @Override
    public void onHealthConnectPermissionGranted(boolean granted) {
        JSObject ret = new JSObject();
        ret.put("result", granted);
        notifyListeners("io.tryrook.permissions.healthConnect", ret);
    }

    @Override
    public void onAndroidPermissionGranted(boolean granted) {
        JSObject ret = new JSObject();
        ret.put("result", granted);
        notifyListeners("io.tryrook.permissions.android", ret);
    }
}
