using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Android;

public class Example : MonoBehaviour, AidlabDelegate {

    void Start() {

        enableBluetooth();
        requestBluetoothPermissions();
        aidlab = new AidlabAndroid(this);
    }

    void Update() {

        var cube = GameObject.Find("Cube");
        Vector3 position = cube.transform.position;
        position.y = normalizeRespiration(currentRespirationSample);
        cube.transform.position = position;
    }

    //-- AidlabDelegate ---------------------------------------------------------------
    
    public void didConnectAidlab(IAidlab aidlab) {}

    public void didDisconnectAidlab(IAidlab aidlab, DisconnectReason reason) {}

    public void didReceiveECG(IAidlab aidlab, Int64 timestamp, float value) {}

    public void didReceiveRespiration(IAidlab aidlab, Int64 timestamp, float value) => currentRespirationSample = value;

    public void didReceiveBatteryLevel(IAidlab aidlab, int stateOfCharge) {}

    public void didReceiveSkinTemperature(IAidlab aidlab, Int64 timestamp, float value) {}

    public void didReceiveAccelerometer(IAidlab aidlab, Int64 timestamp, float ax, float ay, float az) {}
    
    public void didReceiveGyroscope(IAidlab aidlab, Int64 timestamp, float qx, float qy, float qz) {}
    
    public void didReceiveMagnetometer(IAidlab aidlab, Int64 timestamp, float mx, float my, float mz) {}
    
    public void didReceiveQuaternion(IAidlab aidlab, Int64 timestamp, float qw, float qx, float qy, float qz) {}

    public void didReceiveOrientation(IAidlab aidlab, Int64 timestamp, float roll, float pitch, float yaw) {}

    public void didReceiveEDA(IAidlab aidlab, long timestamp, float conductance) {}

    public void didReceiveGPS(IAidlab aidlab, long timestamp, double latitude, double longitude, double altitude, float speed, float heading, float hdop) {}

    public void didReceiveBodyPosition(IAidlab aidlab, Int64 timestamp, BodyPosition bodyPosition) {}

    public void didReceiveActivity(IAidlab aidlab, Int64 timestamp, ActivityType activity) {}

    public void didReceiveSteps(IAidlab aidlab, Int64 timestamp, long value) {}

    public void didReceiveHeartRate(IAidlab aidlab, Int64 timestamp, int heartRate) {}

    public void didReceiveRr(IAidlab aidlab, Int64 timestamp, int rr) {}

    public void didReceiveRespirationRate(IAidlab aidlab, Int64 timestamp, int value) {}

    public void didReceivePressure(IAidlab aidlab, long timestamp, int value) {}

    public void pressureWearStateDidChange(IAidlab aidlab, WearState wearState) {}

    public void wearStateDidChange(IAidlab aidlab, WearState wearState) {}

    public void didDetectExercise(IAidlab aidlab, Exercise exercise) {}

    public void didReceiveSoundVolume(IAidlab aidlab, long timestamp, int value) {}

    public void didReceiveSignalQuality(IAidlab aidlab, long timestamp, int value) {}

    public void syncStateDidChange(IAidlab aidlab, SyncState state) {}

    public void didReceiveUnsynchronizedSize(IAidlab aidlab, int unsynchronizedSize, float syncBytesPerSecond) {}

    public void didReceivePastECG(IAidlab aidlab, long timestamp, float value) {}

    public void didReceivePastRespiration(IAidlab aidlab, long timestamp, float value) {}

    public void didReceivePastSkinTemperature(IAidlab aidlab, long timestamp, float value) {}

    public void didReceivePastHeartRate(IAidlab aidlab, long timestamp, int heartRate) {}

    public void didReceivePastRr(IAidlab aidlab, long timestamp, int rr) {}

    public void didReceivePastRespirationRate(IAidlab aidlab, long timestamp, int value) {}

    public void didReceivePastActivity(IAidlab aidlab, long timestamp, ActivityType activity) {}

    public void didReceivePastSteps(IAidlab aidlab, long timestamp, long value) {}

    public void didReceivePastAccelerometer(IAidlab aidlab, long timestamp, float ax, float ay, float az) {}

    public void didReceivePastGyroscope(IAidlab aidlab, long timestamp, float qx, float qy, float qz) {}

    public void didReceivePastMagnetometer(IAidlab aidlab, long timestamp, float mx, float my, float mz) {}

    public void didReceivePastQuaternion(IAidlab aidlab, long timestamp, float qw, float qx, float qy, float qz) {}

    public void didReceivePastOrientation(IAidlab aidlab, long timestamp, float roll, float pitch, float yaw) {}

    public void didReceivePastEDA(IAidlab aidlab, long timestamp, float conductance) {}

    public void didReceivePastGPS(IAidlab aidlab, long timestamp, double latitude, double longitude, double altitude, float speed, float heading, float hdop) {}

    public void didReceivePastBodyPosition(IAidlab aidlab, long timestamp, BodyPosition bodyPosition) {}

    public void didReceivePastSoundVolume(IAidlab aidlab, long timestamp, int value) {}

    public void didReceivePastPressure(IAidlab aidlab, long timestamp, int value) {}

    public void didReceivePastSignalQuality(IAidlab aidlab, long timestamp, int value) {}

    public void didDetectPastUserEvent(long timestamp) {}

    public void didReceiveError(string error) {}

    public void didReceivePayload(IAidlab aidlab, string process, byte[] payload) {}

    //-- Private ---------------------------------------------------------------

    private AidlabAndroid aidlab;

    private float currentRespirationSample = 0.0f;

    private void enableBluetooth() {
      
        using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")) {
            try {
                using (var BluetoothManager = activity.Call<AndroidJavaObject>("getSystemService", "bluetooth")) {
                    using (var BluetoothAdapter = BluetoothManager.Call<AndroidJavaObject>("getAdapter")) {
                        BluetoothAdapter.Call<bool>("enable");
                    }
                }
            } catch (Exception e) {
                
                Debug.Log(e);
            }
        }
    }

    private void requestBluetoothPermissions() {

        if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation)) {
            Permission.RequestUserPermission(Permission.FineLocation);
        }

        Permission.RequestUserPermission("android.permission.BLUETOOTH_SCAN");
        Permission.RequestUserPermission("android.permission.BLUETOOTH_CONNECT");
    }

    private float normalizeRespiration(float sample) {

        return Mathf.Clamp(sample * 10, -4, 4);
    }


}
