package com.moral.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moral.api.entity.*;
import com.moral.api.mapper.*;
import com.moral.api.pojo.redisBean.SpecialDeviceInfoDTO;
import com.moral.api.pojo.vo.device.DeviceVO;
import com.moral.api.service.SpecialDeviceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.util.AdjustDataUtils;
import com.moral.api.util.CacheUtils;
import com.moral.api.util.LogUtils;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.util.DateUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 
 *  服务实现类
 * 
 *
 * @author moral
 * @since 2021-08-11
 */
@Service
public class SpecialDeviceServiceImpl extends ServiceImpl implements SpecialDeviceService {
    @Autowired(required = false)
    private SpecialDeviceMapper specialDeviceMapper;
    @Autowired(required = false)
    private ManageAccountMapper manageAccountMapper;
    @Autowired(required = false)
    private VersionMapper versionMapper;
    @Autowired(required = false)
    private SysDictDataMapper sysDictDataMapper;
    @Autowired(required = false)
    private SpecialDeviceHistoryMapper specialDeviceHistoryMapper;
    @Autowired(required = false)
    private OrganizationMapper organizationMapper;
    @Autowired(required = false)
    private RedisTemplate redisTemplate;
    @Autowired(required = false)
    private OrganizationUnitAlarmMapper organizationUnitAlarmMapper;
    @Autowired(required = false)
    private VersionSensorUnitMapper versionSensorUnitMapper;
    @Autowired(required = false)
    private GovMonitorPointMapper govMonitorPointMapper;
    @Autowired
    private AdjustDataUtils adjustDataUtils;
    /*
     * 从redis获取设备信息
     * */
    private SpecialDeviceInfoDTO getDeviceInfoFromRedis(String mac) {
        return (SpecialDeviceInfoDTO) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE, mac);
    }
    /*
     * 设备信息存入redis
     */
    private void setDeviceInfoToRedis(String mac, SpecialDeviceInfoDTO specialDeviceInfoDTO) {
        redisTemplate.opsForHash().put(RedisConstants.SPECIAL_DEVICE, mac, specialDeviceInfoDTO);
    }
    /*
     * 从redis删除设备信息
     */
    private void delDeviceInfoFromRedis(String mac) {
        redisTemplate.opsForHash().delete(RedisConstants.SPECIAL_DEVICE, mac);
    }
    @Override
    public Map getDataByCondition(Map map) {
        Map resultMap = new HashMap<>();
        if (!map.containsKey("current")||!map.containsKey("size")){
            resultMap.put("code",ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode());
            resultMap.put("msg",ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
            return resultMap;
        }
        int current = Integer.parseInt(map.get("current").toString());
        int size = Integer.parseInt(map.get("size").toString());
        Page page = new Page<>(current,size);
        QueryWrapper wrapper_Condition = new QueryWrapper<>();
        wrapper_Condition.eq("is_delete",Constants.NOT_DELETE);
        if (!ObjectUtils.isEmpty(map.get("organization_id"))){
            wrapper_Condition.eq("organization_id",map.get("organization_id").toString());
        }
        if (!ObjectUtils.isEmpty(map.get("keyword"))){
            wrapper_Condition.and(wc -> wc.like("name",map.get("keyword").toString()).or().like("mac",map.get("keyword").toString()));
            //wrapper_Condition.like("name",map.get("keyword").toString()).or().like("mac",map.get("keyword").toString());
        }
        wrapper_Condition.orderByDesc("create_time");
        Page resultPage = specialDeviceMapper.selectPage(page,wrapper_Condition);
        int totalNumber = specialDeviceMapper.selectCount(wrapper_Condition);
        List specialDevices = resultPage.getRecords();
        SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List