package com.ruoyi.system.service.impl;

import com.alibaba.nacos.client.utils.LogUtils;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.domain.SysDeptJl;
import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.mapper.SysDeptJlMapper;
import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.system.service.ISysDeptJlService;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 吉林地区管理Service业务层处理
 *
 * @author CH
 * @date 2022-03-25
 */
@Service
public class SysDeptJlServiceImpl implements ISysDeptJlService {
    @Autowired
    private SysDeptJlMapper sysDeptJlMapper;

    @Autowired
    private ISysDeptService sysDeptService;

    @Autowired
    private SysDeptMapper deptMapper;

    @Autowired
    private RedisService redisService;

    /**
     * 查询吉林地区管理
     *
     * @param id 吉林地区管理主键
     * @return 吉林地区管理
     */
    @Override
    public SysDeptJl selectSysDeptJlById(String id) {
        return sysDeptJlMapper.selectSysDeptJlById(id);
    }

    /**
     * 查询吉林地区管理列表
     *
     * @param sysDeptJl 吉林地区管理
     * @return 吉林地区管理
     */
    @Override
    public List<SysDeptJl> selectSysDeptJlList(SysDeptJl sysDeptJl) {
        return sysDeptJlMapper.selectSysDeptJlList(sysDeptJl);
    }

    @Override
    public void checkParentId(String parentId) {
        if (StringUtils.isNull(sysDeptJlMapper.selectSysDeptJlById(parentId))) {
            throw new ServiceException("父级行政区划信息为空,请联系管理员");
        }
    }

    @Override
    public void checkChildrenLevel(String id) {
        if (sysDeptJlMapper.selectSysDeptJlByParentId(id).size() > 0) {
            throw new ServiceException("含有子级行政区，删除失败");
        }
    }

    /**
     * 新增吉林地区管理
     *
     * @param sysDeptJl 吉林地区管理
     * @return 结果
     */
    @Override
    public int insertSysDeptJl(SysDeptJl sysDeptJl) {
        SysDeptJl sysDeptJl1 = sysDeptJlMapper.selectSysDeptJlById(sysDeptJl.getParentId());
        String s = retCode(sysDeptJl1.getParentId(), sysDeptJl1.getCode(), sysDeptJl1.getLevel());
        sysDeptJl.setCode(s);
        sysDeptJl.setLevel(sysDeptJl1.getLevel() + 1);
        sysDeptJl.setId(IdUtils.simpleUUID());
        SecurityUtils.insertBaseEntity(sysDeptJl);
        return sysDeptJlMapper.insertSysDeptJl(sysDeptJl);
    }

    /**
     * 修改吉林地区管理
     *
     * @param sysDeptJl 吉林地区管理
     * @return 结果
     */
    @Override
    public int updateSysDeptJl(SysDeptJl sysDeptJl) {
        sysDeptJl.setParentId(null);
        sysDeptJl.setLevel(null);
        sysDeptJl.setCode(null);
        SecurityUtils.updateBaseEntity(sysDeptJl);
        return sysDeptJlMapper.updateSysDeptJl(sysDeptJl);
    }

    /**
     * 批量删除吉林地区管理
     *
     * @param ids 需要删除的吉林地区管理主键
     * @return 结果
     */
    @Override
    public int deleteSysDeptJlByIds(String[] ids) {
        return sysDeptJlMapper.deleteSysDeptJlByIds(ids);
    }

    /**
     * 删除吉林地区管理信息
     *
     * @param id 吉林地区管理主键
     * @return 结果
     */
    @Override
    public int deleteSysDeptJlById(String id) {
        return sysDeptJlMapper.deleteSysDeptJlById(id);
    }

    /**
     * 同步行政区到部门表
     *
     * @return 结果
     */
    @Override
    public boolean syncToDept() {
        Object sync_time = redisService.getCacheObject("sync_time");
        if (sync_time!=null){
            throw new ServiceException("正在同步中，请稍后重试");
        }
        redisService.setCacheObject("sync_time",1,5L, TimeUnit.MINUTES);
        HashMap<Integer,String> map = new HashMap<>();
        map.put(0,"民政部");
        map.put(1,"民政厅");
        map.put(2,"民政局");
        map.put(3,"民政局");
        map.put(4,"民政办");
        map.put(5,"民政办");

        // 同步一级地区
        SysDeptJl item = sysDeptJlMapper.selectSysDeptJlById("db8ad5e5977540d29a4eb7b57c1e2f7b");
        syncD(item, 0L,map);
        // 同步二级地区
        List<SysDeptJl> sysDeptJls2 = sysDeptJlMapper.selectSysDeptJlByParentId(item.getId());
        for (SysDeptJl item2 : sysDeptJls2) {
            syncD(item2, Long.parseLong(item.getCode()),map);

            List<SysDeptJl> sysDeptJls3 = sysDeptJlMapper.selectSysDeptJlByParentId(item2.getId());
            for (SysDeptJl item3 : sysDeptJls3) {
                syncD(item3, Long.parseLong(item2.getCode()),map);

                List<SysDeptJl> sysDeptJls4 = sysDeptJlMapper.selectSysDeptJlByParentId(item3.getId());
                for (SysDeptJl item4 : sysDeptJls4) {
                    syncD(item4, Long.parseLong(item3.getCode()),map);

                    List<SysDeptJl> sysDeptJls5 = sysDeptJlMapper.selectSysDeptJlByParentId(item4.getId());
                    for (SysDeptJl item5 : sysDeptJls5) {
                        syncD(item5, Long.parseLong(item4.getCode()),map);

                    }
                }
            }
        }
        return true;
    }

    private void syncD(SysDeptJl item, Long parentId, HashMap<Integer,String> map) {
        try {
            SysDept sysDept = new SysDept();
            sysDept.setDeptId(Long.parseLong(item.getCode()));
            sysDept.setDeptName(item.getName() + map.get(item.getLevel()));
            sysDept.setOrderNum("0");
            sysDept.setStatus("0");
            sysDept.setParentId(parentId);
            sysDept.setLocationId(item.getId());
            sysDeptService.insertDept(sysDept);
        } catch (Exception e) {
            LogUtils.logger("sql同步异常:"+e.getMessage());
        }


    }

    public String retCode(String pid, String code, Integer level) {

        SysDeptJl sysDeptJl1 = new SysDeptJl();
        sysDeptJl1.setParentId(pid);
        List<SysDeptJl> sysDeptJls = sysDeptJlMapper.selectSysDeptJlList(sysDeptJl1);
        if (sysDeptJls.size() == 0) {
            return newAddCompany(code, level);
        } else {
            SysDeptJl sysDeptJlMaxCode = sysDeptJls.stream().max(Comparator.comparing(SysDeptJl::getCode)).get();
            return addCompany(sysDeptJlMaxCode.getCode(), code, level + 1);
        }
    }

    /**
     * 单位新增
     *
     * @param code
     * @param level
     * @return
     */
    public String newAddCompany(String code, Integer level) {
        /**
         * 省22
         * 市01
         * 县01
         * 街道001
         * 单位001
         */
        String codeSub = "";
        if (level == 1) {
            codeSub = code.substring(0, 2) + "0100000000";
        } else if (level == 2) {
            codeSub = code.substring(0, 4) + "01000000";
        } else if (level == 3) {
            codeSub = code.substring(0, 6) + "001000";
        } else if (level == 4) {
            codeSub = code.substring(0, 9) + "001";
        }
        return codeSub;
    }

    /**
     * 单位追加
     *
     * @param testStr
     * @param code
     * @return
     */
    public String addCompany(String testStr, String code, Integer level) {
        String codeSta = "";
        String codeEnd = "";
        DecimalFormat decimalFormat = null;
        if (level == 1) {
            codeSta = testStr.substring(0, 2);
            codeEnd = testStr.substring(2, 12);
            decimalFormat = new DecimalFormat("00");
        } else if (level == 2) {
            codeSta = testStr.substring(0, 4);
            codeEnd = testStr.substring(4, 12);
            decimalFormat = new DecimalFormat("0000");
        } else if (level == 3) {
            codeSta = testStr.substring(0, 6);
            codeEnd = testStr.substring(6, 12);
            decimalFormat = new DecimalFormat("000000");
        } else if (level == 4) {
            codeSta = testStr.substring(0, 9);
            codeEnd = testStr.substring(9, 12);
            decimalFormat = new DecimalFormat("000000000");
        } else if (level == 5) {
            codeEnd = testStr.substring(9, 12);
            if (Integer.parseInt(codeEnd) == 999) {
                throw new ServiceException("该第五级地区的code编码已达到最大值,请联系管理员");
            }
            Long insertCode = Long.parseLong(testStr) + 1L;
            return String.valueOf(insertCode);
        }
        int i = Integer.parseInt(codeSta) + 1;
        String k = decimalFormat.format(i);
        return k + codeEnd;
    }
}
