package com.yeejoin.amos.boot.module.tzs.biz.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.common.api.dto.AttachmentDto;
import com.yeejoin.amos.boot.module.common.api.service.ISourceFileService;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledFormDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledObjsDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledQueryDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledRecordDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertHandlerDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertHandlerInfoDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertPaperInfoDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.DutySeatDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.FormValue;
import com.yeejoin.amos.boot.module.tzs.api.dto.WechatMyBusinessListDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.WechatMyBussinessDto;
import com.yeejoin.amos.boot.module.tzs.api.entity.AlertCalled;
import com.yeejoin.amos.boot.module.tzs.api.entity.AlertFormValue;
import com.yeejoin.amos.boot.module.tzs.api.entity.DispatchPaper;
import com.yeejoin.amos.boot.module.tzs.api.entity.DispatchTask;
import com.yeejoin.amos.boot.module.tzs.api.entity.Elevator;
import com.yeejoin.amos.boot.module.tzs.api.entity.VoiceRecordFile;
import com.yeejoin.amos.boot.module.tzs.api.enums.AlertStageEnums;
import com.yeejoin.amos.boot.module.tzs.api.enums.DispatchPaperEnums;
import com.yeejoin.amos.boot.module.tzs.api.enums.TzsCommonParam;
import com.yeejoin.amos.boot.module.tzs.api.mapper.AlertCalledMapper;
import com.yeejoin.amos.boot.module.tzs.api.service.IAlertCalledService;
import com.yeejoin.amos.boot.module.tzs.api.service.TzsAuthService;
import com.yeejoin.amos.boot.module.tzs.biz.utils.BeanDtoVoUtils;
import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.RegionModel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 特种设备权限服务实现类
 */
@Service
public class TzsAuthServiceImpl implements TzsAuthService {


    @Override
    public List<String> getUserRegionCode() {
        List<String> regionList = new ArrayList<>();
        AgencyUserModel me = Privilege.agencyUserClient.getme().getResult();
        regionList.add("610100");
        regionList.add("610300");
        regionList.add("610725");
        regionList.add("610822");
        return regionList;
    }

    @Override
    public List<RegionModel> getUserReginTree() {
        List<String> regionList = this.getUserRegionCode();
        AgencyUserModel me = Privilege.agencyUserClient.getme().getResult();
        List<RegionModel> tree = (List<RegionModel>) Systemctl.regionClient.queryForTree(null).getResult();
        // 循环list 将List 封装为 省市区 SET
        Set<String> city = new HashSet<>();
        Set<String> district = new HashSet<>();
        for(String regionCode : regionList) {
            // 判断是否是某个县
            String districtCode = regionCode.substring(4,6);
            if("00".equals(districtCode)) { // 为市
                city.add(regionCode);
            } else { // 为区
                district.add(regionCode);
            }
        }
        // 判断市区是否存在区域码的市，如果存在则移除区
        Iterator<String> disIt = district.iterator();
        while(disIt.hasNext()) {
            String regionCode = disIt.next();
            String tempCity = regionCode.substring(0,4) + "00";
            if(city.contains(tempCity)) {
                disIt.remove();
            }
        }
        // 将tree 转换为K-V形式便于处理
        Map<Integer, RegionModel> tempMap = new HashMap<Integer, RegionModel>();
        RegionModel start = tree.get(0); // 省
        setMap(tempMap,start);
        List<RegionModel> newTree = new ArrayList<RegionModel>();
        List<RegionModel> newCity = new ArrayList<RegionModel>();
        // 如果管理市 取得整个市的数据 如果管理某个县 取得某市某县数据
        Map<String, RegionModel> tempCityMap = new HashMap<String, RegionModel>();
        for(String regionCode : district) {
            // 先拿市 再封装新的城市
            String cityCode = regionCode.substring(0,4) + "00";
            RegionModel tempCity = tempCityMap.get(cityCode);
            if(tempCity == null) {
                List<RegionModel> tempDisList = new ArrayList<RegionModel>();
                tempDisList.add(tempMap.get(Integer.parseInt(regionCode)));
                tempCity = tempMap.get(Integer.parseInt(cityCode));
                tempCity.setChildren(tempDisList);
                tempCityMap.put(cityCode,tempCity);
            } else {
                List<RegionModel> tempDisList = (List<RegionModel>) tempCity.getChildren();
                tempDisList.add(tempMap.get(Integer.parseInt(regionCode)));
            }
        }
        for(String regionCode : city) {// 获取城市
            newCity.add(tempMap.get(Integer.parseInt(regionCode)));
        }
        // 拼接城市
        for(Map.Entry<String, RegionModel> entries : tempCityMap.entrySet()) {
            newCity.add(entries.getValue());
        }
        start.setChildren(newCity);
        newTree.add(start);
        return newTree;
    }


    private void setMap(Map<Integer, RegionModel> tempMap, RegionModel start) {
        tempMap.put(start.getRegionCode(),start);
        if(start.getChildren() != null) {
            List<RegionModel> children = (List<RegionModel>) start.getChildren();
            for (RegionModel temp : children) {
                setMap(tempMap,temp);
            }
        }

    }
}