package com.ruoyi.mall.service.impl;

import java.text.SimpleDateFormat;
import java.util.*;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.mall.mapper.MallDeviceMapper;
import com.ruoyi.mall.domain.MallDevice;
import com.ruoyi.mall.service.IMallDeviceService;

import javax.annotation.Resource;

/**
 * 设备Service业务层处理
 *
 * @author LCL
 * @date 2024-03-17
 */
@Service
public class MallDeviceServiceImpl implements IMallDeviceService
{
    private static final Logger log = LoggerFactory.getLogger(MallDeviceServiceImpl.class);

    @Resource
    private MallDeviceMapper mallDeviceMapper;

    /**
     * 查询设备
     *
     * @param deviceId 设备主键
     * @return 设备
     */
    @Override
    public MallDevice selectMallDeviceByDeviceId(Long deviceId)
    {
        return mallDeviceMapper.selectMallDeviceByDeviceId(deviceId);
    }

    /**
     * 查询设备列表
     *
     * @param mallDevice 设备
     * @return 设备
     */
    @Override
    public List<MallDevice> selectMallDeviceList(MallDevice mallDevice)
    {
        return mallDeviceMapper.selectMallDeviceList(mallDevice);
    }

    /**
     * 新增设备
     *
     * @param mallDevice 设备
     * @return 结果
     */
    @Override
    public int insertMallDevice(MallDevice mallDevice)
    {
        if (mallDevice.getCreateAt() == null) {
            mallDevice.setCreateAt(DateUtils.getTime());
        }
        return mallDeviceMapper.insertMallDevice(mallDevice);
    }

    /**
     * 修改设备
     *
     * @param mallDevice 设备
     * @return 结果
     */
    @Override
    public int updateMallDevice(MallDevice mallDevice)
    {
        mallDevice.setUpdateAt(DateUtils.getTime());
        return mallDeviceMapper.updateMallDevice(mallDevice);
    }

    /**
     * 批量删除设备
     *
     * @param deviceIds 需要删除的设备主键
     * @return 结果
     */
    @Override
    public int deleteMallDeviceByDeviceIds(Long[] deviceIds)
    {
        return mallDeviceMapper.deleteMallDeviceByDeviceIds(deviceIds);
    }

    /**
     * 删除设备信息
     *
     * @param deviceId 设备主键
     * @return 结果
     */
    @Override
    public int deleteMallDeviceByDeviceId(Long deviceId)
    {
        return mallDeviceMapper.deleteMallDeviceByDeviceId(deviceId);
    }

    /**
     * APP查询设备列表
     *
     * @param params 参数
     * @return 设备集合
     */
    @Override
    public List<Map<String, Object>> selectAppMallDeviceList(Map<String, Object> params) {
        return mallDeviceMapper.selectAppMallDeviceList(params);
    }

    /**
     * 根据设备类型获取设备名
     *
     * @param deviceType 设备类型：0-无，1-报警主机，2-摄像头，3-弹箱，4-语音喇叭，5-电源
     * @return 结果
     */
    @Override
    public String selectMallDeviceNameByDeviceType(String deviceType) {
        String deviceName = "";
        switch (deviceType) {
            case "1":
                deviceName = "报警主机";
                break;
            case "2":
                deviceName = "摄像头";
                break;
            case "3":
                deviceName = "弹箱";
                break;
            case "4":
                deviceName = "语音喇叭";
                break;
            case "5":
                deviceName = "电源";
                break;
            default:
                deviceName = "无";
                break;
        }
        return deviceName;
    }

    /**
     * APP查询弹箱统计列表
     *
     * @param params 参数
     * @return 设备集合
     */
    @Override
    public List<Map<String, Object>> selectAppMallDeviceBoxList(Map<String, Object> params) {
        return mallDeviceMapper.selectAppMallDeviceBoxList(params);
    }

    /**
     * 根据序列号查询设备
     *
     * @param serialNumber 序列号
     * @return 设备
     */
    @Override
    public MallDevice selectMallDeviceBySerialNumber(String serialNumber) {
        return mallDeviceMapper.selectMallDeviceBySerialNumber(serialNumber);
    }

    /**
     * 处理接收的数据
     *
     * @param message 数据
     * @return 结果
     */
    @Override
    public Map<String, Object> processingReceivedData(String message) {
        log.info("收到设备数据:{}", message);

        HashMap<String, Object> map = new HashMap<>();
        if (message != null && !"".equals(message)) {
            // 例：AA55 01 0066 0002 0007 FF 0000 C3 32

            // AA55：标识-说明是设备发来的
            String s = message.substring(0, 4);

            // AA55设备发来的
            if ("AA55".equals(s)) {

                // 01：功能
                String s1 = message.substring(4, 6);

                // 0066：主机板子的序列号（0000-9999）
                String s2 = message.substring(6, 10);

                // 0002：发送、接收+1（设备发我0001-我再发0002，握手：设备发0001我回0001说明通讯已建立）
                String s3 = message.substring(10, 14);

                // 回应
                String receivedDataResponse = this.receivedDataResponse(s1, s2, s3);

                // 0007：输入状态标记
                String s4 = message.substring(14, 18);

                // FF：输入状态（FF为十六进制，要转为二进制）
                String s5 = message.substring(18, 20);
                int is5 = Integer.parseInt(s5, 16);
                String s5_2 = Integer.toBinaryString(is5);

                // 0000：输出状态标记
                String s6 = message.substring(20, 24);

                // C3：输出状态（C3为十六进制，要转为二进制）
                String s7 = message.substring(24, 26);
                int is7 = Integer.parseInt(s7, 16);
                String s7_2 = Integer.toBinaryString(is7);

                // 32：校验位（32H=01+00+66+00+02+00+07+FF+00+00+C3）
                String s8 = message.substring(26, 28);


                map.put("s标识=", s);
                map.put("s1功能=", s1);
                map.put("s2序列号=", s2);
                map.put("s3握手=", s3);
                map.put("s4输入状态标记=", s4);
                map.put("s5输入状态=", s5_2);
                map.put("s6输出状态标记=", s6);
                map.put("s7输出状态=", s7_2);
                map.put("s8校验位=", s8);
            }
        }


        // 回应：AA 55 01 xxxx mm mm 秒 分  时 日  月 年 XX
        // 回应：AA 55 01 0066 00 02 20 30 18 15 08 23 XX

        return map;
    }

    /**
     * 接收发来的数据-回应
     *
     * @param ability 功能
     * @param serialNumber 序列号
     * @param handshake 握手
     * @return 结果
     */
    @Override
    public String receivedDataResponse(String ability, String serialNumber, String handshake) {
        String responseData = "AA55"+ability+serialNumber+handshake;
        // Calendar instance = Calendar.getInstance();
        // int y = instance.get(Calendar.YEAR);
        // int m = instance.get(Calendar.MONTH) + 1;
        // int d = instance.get(Calendar.DATE);
        // int	h = instance.get(Calendar.HOUR_OF_DAY);
        // int	mi = instance.get(Calendar.MINUTE);
        // int s = instance.get(Calendar.SECOND);

        SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd hh:mm:ss");
        Date date = new Date();
        String dateString = format.format(date);
        String y = dateString.substring(0, 2);
        String m = dateString.substring(3, 5);
        String d = dateString.substring(6, 8);
        String h = dateString.substring(9, 11);
        String mi = dateString.substring(12, 14);
        String s = dateString.substring(15, 17);

        responseData = responseData + s + mi + h + d + m + y;
        return responseData;
    }
}
