//package com.yida.data.server.service.impl;
//
//import cc.mrbird.febs.common.redis.service.RedisService;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.NumberUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONObject;
//import com.yida.data.common.core.entity.constant.CachePrefixConstant;
//import com.yida.data.common.core.entity.constant.LockPrefixConstant;
//import com.yida.data.common.core.utils.Asserts;
//import com.yida.data.common.core.utils.LocationUtil;
//import com.yida.data.server.constants.CardConstants;
//import com.yida.data.server.constants.MsgType;
//import com.yida.data.server.dto.DisturbDTO;
//import com.yida.data.server.dto.FenceDTO;
//import com.yida.data.server.dto.WhiteListDTO;
//import com.yida.data.server.service.OperationService;
//import com.yida.data.server.utils.ChannelUtil;
//import io.netty.channel.Channel;
//import java.time.LocalTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class OperationServiceImpl implements OperationService {
//
//    private final RedisService redisService;
//
//    @Override
//    public void getLocation(String imei) {
//
//    }
//
//    @Override
//    public void whiteList(WhiteListDTO dto) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + dto.getImei()), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, dto.getImei()).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(dto.getImei());
//        cmd.add(MsgType.WHITE_ALL.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        for (int i = 1; i <= 20; i++) {
//            cmd.add(String.valueOf(i));
//            cmd.add(dto.getMobiles().size() >= i ? dto.getMobiles().get(i - 1) : "");
//            cmd.add(String.valueOf(1));
//        }
//        sendMsg(dto.getImei(), cmd);
//    }
//
//    @Override
//    public void fenceSwitch(String imei, Integer type) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + imei), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, imei).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(imei);
//        cmd.add(MsgType.FENCE_SWITCH.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        cmd.add(type.toString());
//        sendMsg(imei, cmd);
//    }
//
//    @Override
//    public void fence(FenceDTO dto) {
//        if (dto.getType() == 0) {
//            Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + dto.getImei()), "设备不在线");
//            String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, dto.getImei()).toString();
//            List<String> cmd = new ArrayList<>();
//            cmd.add(vendor);
//            cmd.add(dto.getImei());
//            cmd.add(MsgType.FENCE.getValue());
//            cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//            cmd.add(dto.getId().toString());
//            cmd.add(transferPosition(dto.getLat().get(0)));
//            cmd.add(transferPosition(dto.getLng().get(0)));
//            cmd.add(dto.getRadius().toString());
//            sendMsg(dto.getImei(), cmd);
//        }
//    }
//
//    @Override
//    public void disturbTime(DisturbDTO dto) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + dto.getImei()), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, dto.getImei()).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(dto.getImei());
//        cmd.add(MsgType.DISTURB_TIME.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        for (int i = 0; i < dto.getNum(); i++) {
//            cmd.add(String.valueOf(i + 1));
//            StringBuilder time = new StringBuilder();
//            time.append(dto.getStartTime().get(i).format(DateTimeFormatter.ofPattern("HHmm")))
//                .append(dto.getEndTime().get(i).format(DateTimeFormatter.ofPattern("HHmm")));
//            String week = dto.getWeekFlag().get(i);
//            for (int j = 0; j < 7; j++) {
//                time.append(String.valueOf(j + 1))
//                    .append(week.charAt(j));
//            }
//            cmd.add(time.toString());
//        }
//        sendMsg(dto.getImei(), cmd);
//    }
//
//    @Override
//    public void disturbSwitch(String imei, Integer type) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + imei), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, imei).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(imei);
//        cmd.add(MsgType.DISTURB_SWITCH.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        cmd.add(type.toString());
//        sendMsg(imei, cmd);
//    }
//
//    @Override
//    public void nowLocation(String imei) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + imei), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, imei).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(imei);
//        cmd.add(MsgType.LOCATION.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        sendMsg(imei, cmd);
//    }
//
//    @Override
//    public void weather(String imei, String adCode) {
//        Asserts.isTrue(redisService.hasKey(CachePrefixConstant.DEVICE_CARD_ONLINE + imei), "设备不在线");
//        String vendor = redisService.hget(CachePrefixConstant.DEVICE_CARD_IMEI_VENDOR, imei).toString();
//        List<String> cmd = new ArrayList<>();
//        cmd.add(vendor);
//        cmd.add(imei);
//        cmd.add(MsgType.WEATHER.getValue());
//        cmd.add(LocalTime.now().format(DateTimeFormatter.ofPattern("HHmmss")));
//        // 天气数据是否存在
//        JSONObject weather = (JSONObject) redisService.get(CachePrefixConstant.DEVICE_CARD_CITY_WEATHER + adCode);
//        if (weather == null) {
//            weather = LocationUtil.getWeather(adCode);
//            redisService.set(CachePrefixConstant.DEVICE_CARD_CITY_WEATHER + adCode, weather, 43200L);
//        }
//        // 天气状况
//        String weatherStr = weatherToCode(weather.getStr("weather"));
//        if (StrUtil.isBlank(weatherStr)) {
//            return;
//        }
//        // 风向
//        String weatherDir = weatherDirToCode(weather.getStr("winddirection"));
//        // 风力
//        String weatherPower = weatherPowerToCode(weather.getStr("windpower"));
//        if (StrUtil.isBlank(weatherStr) || StrUtil.isBlank(weatherDir) || StrUtil.isBlank(weatherPower)) {
//            return;
//        }
//        //气温
//        String temp = weather.getStr("temperature");
//        cmd.add(weatherStr);
//        cmd.add(temp);
//        cmd.add(weatherDir);
//        cmd.add(weatherPower);
//        sendMsg(imei, cmd);
//    }
//
//    @Override
//    public void cmd(String imei, String cmd) {
//        cmd = CardConstants.START_WITH + cmd + CardConstants.END_WITH;
//        Channel channel = ChannelUtil.getChannel(imei);
//        Asserts.isNotNull(channel, "设备不在线");
//        redisService.falseLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//        channel.writeAndFlush(cmd);
//        log.info("发送指令：:[{}]", cmd);
//        redisService.falseLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//        redisService.falseUnLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//    }
//
//    private void sendMsg(String imei, List<String> msg) {
//        String cmd = CardConstants.START_WITH + CollUtil.join(msg, ",") + CardConstants.END_WITH;
//        Channel channel = ChannelUtil.getChannel(imei);
//        Asserts.isNotNull(channel, "设备不在线");
//        redisService.falseLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//        channel.writeAndFlush(cmd);
//        log.info("发送指令：:[{}]", cmd);
//        redisService.falseLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//        redisService.falseUnLock(LockPrefixConstant.CARD_CMD_LOCK + imei);
//    }
//
//    private String transferPosition(Double data) {
//        double m = data.intValue();
//        m += (data - m) * 60;
//        return NumberUtil.decimalFormat("#.0000", m);
//    }
//
//    private String weatherToCode(String weather) {
//        // 晴
//        if (weather.equals("晴")) {
//            return "0";
//        } else if (weather.contains("云")) {
//            return "1";
//        } else if (weather.equals("阴")) {
//            return "2";
//        } else if (weather.equals("阵雨")) {
//            return "3";
//        } else if (weather.equals("雷阵雨")) {
//            return "4";
//        } else if (weather.equals("雷阵雨并伴有冰雹")) {
//            return "5";
//        } else if (weather.contains("雨") && weather.contains("雪")) {
//            return "6";
//        } else if (weather.equals("小雨")) {
//            return "7";
//        } else if (weather.equals("中雨")) {
//            return "8";
//        } else if (weather.equals("大雨")) {
//            return "9";
//        } else if (weather.equals("暴雨")) {
//            return "10";
//        } else if (weather.equals("大暴雨")) {
//            return "11";
//        } else if (weather.equals("特大暴雨")) {
//            return "12";
//        } else if (weather.equals("阵雪")) {
//            return "13";
//        } else if (weather.equals("小雪")) {
//            return "14";
//        } else if (weather.equals("中雪")) {
//            return "15";
//        } else if (weather.equals("大雪")) {
//            return "16";
//        } else if (weather.equals("暴雪")) {
//            return "17";
//        } else if (weather.equals("雾")) {
//            return "18";
//        } else if (weather.equals("冻雨")) {
//            return "19";
//        } else if (weather.equals("沙尘暴")) {
//            return "20";
//        } else if (weather.equals("小雨-中雨")) {
//            return "21";
//        } else if (weather.equals("中雨-大雨")) {
//            return "22";
//        } else if (weather.equals("大雨-暴雨 ")) {
//            return "23";
//        } else if (weather.equals("暴雨-大暴雨")) {
//            return "24";
//        } else if (weather.equals("大暴雨-特大暴雨")) {
//            return "25";
//        } else if (weather.equals("小雪-中雪")) {
//            return "26";
//        } else if (weather.equals("中雪-大雪")) {
//            return "27";
//        } else if (weather.equals("大雪-暴雪")) {
//            return "28";
//        } else if (weather.equals("浮尘")) {
//            return "29";
//        } else if (weather.equals("扬沙")) {
//            return "30";
//        } else if (weather.equals("强沙尘暴")) {
//            return "31";
//        } else if (weather.equals("龙卷风")) {
//            return "33";
//        } else if (weather.equals("轻雾")) {
//            return "35";
//        } else if (weather.equals("霾")) {
//            return "53";
//        }
//        return null;
//    }
//
//    private String weatherDirToCode(String dir) {
//        if (dir.equals("无风向")) {
//            return "0";
//        } else if (dir.equals("东北")) {
//            return "1";
//        } else if (dir.equals("东")) {
//            return "2";
//        } else if (dir.equals("东南")) {
//            return "3";
//        } else if (dir.equals("南")) {
//            return "4";
//        } else if (dir.equals("西南")) {
//            return "5";
//        } else if (dir.equals("西")) {
//            return "6";
//        } else if (dir.equals("西北")) {
//            return "7";
//        } else if (dir.equals("北")) {
//            return "8";
//        } else if (dir.equals("旋转不定")) {
//            return "9";
//        }
//        return null;
//    }
//
//    private String weatherPowerToCode(String power) {
//        if (power.equals("≤3")) {
//            return "0";
//        } else if (power.equals("4")) {
//            return "1";
//        } else if (power.equals("5")) {
//            return "2";
//        } else if (power.equals("6")) {
//            return "3";
//        } else if (power.equals("7")) {
//            return "4";
//        } else if (power.equals("8")) {
//            return "5";
//        } else if (power.equals("9")) {
//            return "6";
//        } else if (power.equals("10")) {
//            return "7";
//        } else if (power.equals("11")) {
//            return "8";
//        } else if (power.equals("12")) {
//            return "9";
//        }
//        return null;
//    }
//}
