package com.example.sleep.sensors;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.Toast;

import com.example.sleep.database.GetRecord;
import com.example.sleep.database.RecordBean;

import java.util.Calendar;

import static android.content.ContentValues.TAG;
import static com.example.sleep.database.GetRecord.getRecord;

public class Sensors {
    private int deepTime; // 深度睡眠时间
    private int swallowTime; // 浅层睡眠时间
    private int awakeTime; // 清醒时间
    private int size = 0; // 计数器
    private float k = 0; // 欧氏距离
    private SensorManager mSensorManager; // 传感器管理器
    private Sensor Accelerometer; // 加速度传感器
    private RecordBean mRecord; // 记录数据的Bean类
    private GetRecord mGetRecord; // 获取记录的类

    // 构造函数，初始化传感器管理器和开始传感器监听
    public Sensors(Context context, RecordBean mRecord) {
        getSensorManager(context);
        startSensor();
        this.mRecord = mRecord;
        mGetRecord = getRecord();
    }

    /**
     * 开始记录的算法，主要是取欧氏距离
     */
    private SensorEventListener listener = new SensorEventListener() {
        // 传感器精度变化回调方法
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

        // 传感器数值变化回调方法
        public void onSensorChanged(SensorEvent event) {
            float x, y, z;
            if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
                x = event.values[0];
                y = event.values[1];
                z = event.values[2];
                ++size; // 计数器加一
                k += (float) Math.sqrt(x * x + y * y + z * z); // 欧氏距离累加
                System.out.println("k: " + k);
                if (size == 600) { // 每收集600个数据进行处理
                    size = 0;
                    k /= 3f; // 欧氏距离求平均
                    if (k > 1.0f)
                        k = k / 20 + 1.0f; // 根据欧氏距离计算睡眠状态
                    if (k >= 5.01f)
                        ++awakeTime; // 清醒时间加一
                    else if (k >= 2.01f)
                        ++swallowTime; // 浅层睡眠时间加一
                    else
                        ++deepTime; // 深度睡眠时间加一
                    Log.e(TAG, "onSensorChanged: go k: " + k);
                    if (k >= 10)
                        k /= 10;
                    Log.e(TAG, "onSensorChanged: go");
                    mGetRecord.update(mRecord, getTime() + "," + k + " "); // 更新记录数据
                    k = 0; // 重置欧氏距离
                }
            }
        }
    };

    // 获取传感器管理器
    private void getSensorManager(Context context) {
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        if (mSensorManager != null) {
            Accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); // 获取加速度传感器
        } else {
            Toast.makeText(context, "无法获取传感器，请在设置中授权！", Toast.LENGTH_SHORT).show();
        }
    }

    // 开始传感器监听
    private void startSensor() {
        if (mSensorManager != null) {
            mSensorManager.registerListener(listener, Accelerometer, 100000); // 监听加速度传感器
        }
    }

    // 停止传感器监听
    public int[] stopSensor() {
        if (mSensorManager != null) {
            mSensorManager.unregisterListener(listener);
        }
        size = 0; // 重置计数器
        return new int[]{deepTime, swallowTime, awakeTime}; // 返回睡眠时间数据
    }

    // 获取当前时间
    private String getTime() {
        int TimeDay;
        int TimeHour;
        int TimeMin;
        Calendar calendar = Calendar.getInstance();
        TimeDay = calendar.get(Calendar.DAY_OF_YEAR);
        TimeHour = calendar.get(Calendar.HOUR_OF_DAY);
        TimeMin = calendar.get(Calendar.MINUTE);
        return String.valueOf(TimeDay * 1440 + TimeHour * 60 + TimeMin); // 返回当前时间的分钟数
    }
}

