package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_0020_hu_infrared_temp.viewmodel

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDataCmdUtils
import cn.net.aicare.modulelibrary.module.ble_0020_hu_infrared_temp.HpInfraredTempBleDeviceData
import com.pingwang.bluetoothlib.device.BleDevice

/**
 * 华普红外测温枪视图模型
 * @author xing
 * @date 2025/03/27
 * @constructor 创建[Ble0020HpTempViewModel]
 */
class Ble0020HpTempViewModel : ViewModel(), HpInfraredTempBleDeviceData.OnBleDeviceInfoListener, HpInfraredTempBleDeviceData.OnBleSetStatusListener,
    HpInfraredTempBleDeviceData.OnBleAlarmResultListener {

    val showLogLiveData by lazy { MutableLiveData<String>() }

    var mHpInfraredTempBleDeviceData: HpInfraredTempBleDeviceData? = null

    fun initDevice(bleDevice: BleDevice) {
        HpInfraredTempBleDeviceData.init(bleDevice)
        mHpInfraredTempBleDeviceData = HpInfraredTempBleDeviceData.getInstance()

    }

    /**
     * 发送获取设备状态
     */
    fun sendGetDeviceStatus() {
        val checkDeviceStatus = HpInfraredTempBleDataCmdUtils.checkDeviceStatus()
        mHpInfraredTempBleDeviceData?.sendData(checkDeviceStatus)
    }

    /**
     * 发送按钮CMD
     * @param [type] 类型 {@link HpInfraredTempBleConfig#CMD_WAKEUP ...}
     */
    fun sendButtonCmd(type: Int) {
        val setCmd = HpInfraredTempBleDataCmdUtils.setCmd(type)
        mHpInfraredTempBleDeviceData?.sendData(setCmd)
    }

    /**
     * 发送发射率
     * @param [emissivity] 发射率
     */
    fun sendEmissivity(emissivity: Int) {
        val setEmissivity = HpInfraredTempBleDataCmdUtils.setEmissivity(emissivity)
        mHpInfraredTempBleDeviceData?.sendData(setEmissivity)
    }


    /**
     * 发送自动关机
     * @param [time] 时间s
     */
    fun sendAutoShutdown(time: Int) {
        val setAutoShutdown = HpInfraredTempBleDataCmdUtils.setAutoShutdown(time)
        mHpInfraredTempBleDeviceData?.sendData(setAutoShutdown)


    }


    /**
     * 发送报警信息
     */
    fun sendWarmInfo(unit: Int, signH: Int, signL: Int, tempH: Int, tempL: Int) {
        val setWarmInfo = HpInfraredTempBleDataCmdUtils.setWarm(unit, signH, signL, tempH, tempL)
        mHpInfraredTempBleDeviceData?.sendData(setWarmInfo)
    }

    /**
     * 发送获取设备参数
     */
    fun sendGetDeviceParameter() {
        val getDeviceParameter = HpInfraredTempBleDataCmdUtils.getDeviceParameter()
        mHpInfraredTempBleDeviceData?.sendData(getDeviceParameter)
    }


    /**
     * 设备状态1
     *
     * @param scanOrHold   状态 0：SCAN。1：HOLD
     * @param tempUnit     单位 0：℃ 。 1：℉
     * @param laser        激光灯 0：关闭 。1：打开
     * @param backLamp     背光灯 0：关闭 。1：打开
     * @param lowBattery   低电 0：不低电 。1：低电
     * @param alarmH       高位报警 0：不报警 。 1：正在报警
     * @param alarmL       低温报警 0：不报警 。 1：正在报警
     * @param flashlight   手电筒灯 0：关闭 。1：打开
     * @param mode         模式 0x00：REC（设备端查看历史记录时发送该模式，APP 不保存该模式的数据）
     *                     0x01：MAX;0x02：AVG;0x03：MIN;0x04：DIF;0x05：LAL;0x06：HAL;0x07：EMS（设备端查看发射率）;0x08：HAL—Warming—T;0x09：LAL—Warming—T
     *                     0x0A：EMS（设备端设置发射率）
     * @param mainTag      主区数据标识:显示标识：0：不显示。1：显示
     * @param mainSign     主区数据标识:数据正负：0：正值。 1：负值
     * @param mainDecimal  主区数据标识:数据小数点：0：无小数点。1：带 1 位小数
     * @param subTag       附区数据标识:显示标识：0：不显示。1：显示
     * @param subSign      附区数据标识:数据正负：0：正值。 1：负值
     * @param subDecimal   附区数据标识:数据小数点：0：无小数点。1：带 1 位小数
     * @param mainValue    主区数值
     * @param subValue     附区数值
     * @param ems          EMS 数值 10~100(显示0.10 ~1.00)
     * @param autoShutdown 自动睡眠时间
     */
    override fun onDeviceStatus1(
        scanOrHold: Int, tempUnit: Int, laser: Int, backLamp: Int, lowBattery: Int, alarmH: Int, alarmL: Int,
        flashlight: Int, mode: Int, mainTag: Int, mainSign: Int, mainDecimal: Int, subTag: Int, subSign: Int, subDecimal: Int, mainValue: Int,
        subValue: Int, ems: Int, autoShutdown: Int
    ) {

        var msg = ""
        msg += "状态:" + if (scanOrHold == 0) {
            "SCAN"
        } else {
            "HOLD"
        } + "\n"
        msg += "  单位:" + if (tempUnit == 0) {
            "℃"
        } else {
            "℉"
        }
        msg += "  激光灯:" + if (laser == 0) {
            "关闭"
        } else {
            "打开"
        }
        msg += "背光灯:" + if (backLamp == 0) {
            "关闭"
        } else {
            "打开"
        } + "\n"
        msg += "  低电:" + if (lowBattery == 0) {
            "不低电"
        } else {
            "低电"
        }
        msg += "  高温报警:" + if (alarmH == 0) {
            "不报警"
        } else {
            "正在报警"
        } + "\n"
        msg += "  低温报警:" + if (alarmL == 0) {
            "不报警"
        } else {
            "正在报警"
        }
        msg += "  手电筒灯:" + if (flashlight == 0) {
            "关闭"
        } else {
            "打开"
        } + "\n"
        msg += "模式:" + when (mode) {
            0x00 -> {
                "REC"
            }

            0x01 -> {
                "MAX"
            }

            0x02 -> {
                "AVG"
            }

            0x03 -> {
                "MIN"
            }

            0x04 -> {
                "DIF"
            }

            0x05 -> {
                "LAL"
            }

            0x06 -> {
                "HAL"
            }

            0x07 -> {
                "EMS"
            }

            0x08 -> {
                "HAL—Warming—T"
            }

            0x09 -> {
                "LAL—Warming—T"
            }

            0x0A -> {
                "EMS"
            }

            else -> {
                "未知"
            }
        } + "\n"
        if (mainTag == 1) {
            var showMainValue = mainValue.toFloat()
            if (mainDecimal == 1) {
                showMainValue /= 10F
            }
            if (mainSign == 1) {
                showMainValue = -showMainValue
            }
            msg += "主区数值:${showMainValue}"
        }
        if (subTag == 1) {
            var showSubValue = subValue.toFloat()
            if (subDecimal == 1) {
                showSubValue /= 10F
            }
            if (subSign == 1) {
                showSubValue = -showSubValue
            }
            msg += "附区数值:${showSubValue}"
        }
        msg += "附区数值:${subValue}"
        msg += "EMS 数值:${ems / 100F}"
        msg += "自动睡眠时间:$autoShutdown"
        showLogLiveData.postValue(msg)
    }

    /**
     * 设备状态2
     *
     * @param scanOrHold     状态 0：SCAN。1：HOLD
     * @param dewTempSign    露点温度标志:0：正数 ， 1：负数
     * @param dewTempDecimal 露点温度小数点： 0：无小数， 1: 1 个小数
     * @param dewTemp        露点温度
     * @param humidity       环境湿度：单位%
     * @param envTempSign    环境温度正负：0：正数 ， 1：负数
     * @param envTempDecimal 环境温度小数点： 0：无小数， 1: 1 个小数
     * @param envTemp        环境温度
     */
    override fun onDeviceStatus2(
        scanOrHold: Int, dewTempSign: Int, dewTempDecimal: Int, dewTemp: Int, humidity: Int, envTempSign: Int,
        envTempDecimal: Int, envTemp: Int
    ) {
        var msg = ""
        msg += "状态:" + if (scanOrHold == 0) {
            "SCAN"
        } else {
            "HOLD"
        } + "\n"
        msg += "环境湿度:${humidity}%"
        var showDewTemp = dewTemp.toFloat()
        if (dewTempDecimal == 1) {
            showDewTemp /= 10F
        }
        if (dewTempSign == 1) {
            showDewTemp = -showDewTemp
        }
        msg += "露点温度:${showDewTemp}"
        var showEnvTemp = envTemp.toFloat()
        if (envTempDecimal == 1) {
            showEnvTemp /= 10F
        }
        if (envTempSign == 1) {
            showEnvTemp = -showEnvTemp
        }
        msg += "环境温度:${showEnvTemp}"
        showLogLiveData.postValue(msg)
    }

    /**
     * 设备参数
     *
     * @param emissivity   发射率：2 个小数;范围 0.10 ~ 1.00 （对应的是 10-100）
     * @param autoShutdown 自动关机时间
     * @param alarmHSign   数据标识:高温报警数据(正负值：0：正值 。1：负值)
     * @param alarmHUnit   数据标识:高温报警数据(单位：0：℃ 。1：℉)
     * @param alarmLSign   数据标识:低温报警数据(正负值：0：正值 。1：负值)
     * @param alarmLUnit   数据标识:低温报警数据(单位：0：℃ 。1：℉)
     * @param alarmH       高温报警数据
     * @param alarmL       低温报警数据
     */
    override fun onDeviceParameter(
        emissivity: Int, autoShutdown: Int, alarmHSign: Int, alarmHUnit: Int, alarmLSign: Int, alarmLUnit: Int, alarmH: Int, alarmL: Int
    ) {
        var msg = "发射率:${emissivity / 100F}    自动关机时间:${autoShutdown}\n"
        var showAlarmHValue = alarmH.toFloat()
        if (alarmHSign == 1) {
            showAlarmHValue = -showAlarmHValue
        }
        msg += "高温报警数据:${showAlarmHValue}${
            if (alarmHUnit == 0) {
                "℃"
            } else {
                "℉"
            }
        }\n"
        var showAlarmLValue = alarmH.toFloat()
        if (alarmLSign == 1) {
            showAlarmLValue = -showAlarmLValue
        }
        msg += "低温报警数据:${showAlarmLValue}${
            if (alarmLUnit == 0) {
                "℃"
            } else {
                "℉"
            }
        }"
        showLogLiveData.postValue(msg)
    }

    /**
     * 关于发射率结果
     * @param [status] 状态
     */
    override fun onEmissivityResult(status: Int) {
        showLogLiveData.postValue(
            "发射率设置:${
                if (status == 0) {
                    "成功"
                } else {
                    "失败"
                }
            }"
        )
    }

    /**
     * 自动关机结果
     * @param [status] 状态
     */
    override fun onAutoShutDownResult(status: Int) {
        showLogLiveData.postValue(
            "自动关机时间设置:${
                if (status == 0) {
                    "成功"
                } else {
                    "失败"
                }
            }"
        )
    }

    /**
     * 报警结果
     * @param [status] 状态
     */
    override fun onAlarmResult(status: Int) {
        showLogLiveData.postValue(
            "高低温报警值设置:${
                if (status == 0) {
                    "成功"
                } else {
                    "失败"
                }
            }"
        )
    }
}