package com.hzs.system.base.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzs.common.core.constant.CacheConstants;
import com.hzs.common.core.constant.CountryConstants;
import com.hzs.common.core.constant.MagicNumberConstants;
import com.hzs.common.core.enums.EYesNo;
import com.hzs.common.core.service.RedisService;
import com.hzs.common.domain.system.base.BdArea;
import com.hzs.common.domain.system.base.ext.AreaCache;
import com.hzs.system.base.dto.AreaDTO;
import com.hzs.system.base.mapper.BdAreaMapper;
import com.hzs.system.base.service.IBdAreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 行政区划 服务实现类
 */
@Service
public class BdAreaServiceImpl extends ServiceImpl<BdAreaMapper, BdArea> implements IBdAreaService {

    @Autowired
    private RedisService redisService;

    @Override
    public List<AreaCache> getAreaList(Integer pkCountry) {
        String redisKey = CacheConstants.BD_AREA + pkCountry;

        List<AreaCache> areaCacheList = redisService.getCacheList(redisKey);
        if (CollectionUtils.isEmpty(areaCacheList)) {
            LambdaQueryWrapper<BdArea> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(BdArea::getPkCountry, pkCountry);
            queryWrapper.eq(BdArea::getEnableState, EYesNo.YES.getIntValue());
            // 行政区划中不存国家信息了，此处去掉排除区域
            // queryWrapper.notIn("PARENT", 0);
            queryWrapper.orderByAsc(BdArea::getCode);
            List<BdArea> areaList = baseMapper.selectList(queryWrapper);
            if (!CollectionUtils.isEmpty(areaList)) {
                areaCacheList = BeanUtil.copyToList(areaList, AreaCache.class);
                redisService.setCacheList(redisKey, areaCacheList);
            }
        }
        return areaCacheList;
    }

    @Override
    public String updateArea(List<AreaDTO> provinceDTOList) {
        // 操作用户
        Long userId = MagicNumberConstants.PK_ADMIN;
        // 所属国家
        Integer pkCountry = CountryConstants.CHINA_COUNTRY;
        // 当前时间
        Date nowDate = new Date();

        LambdaQueryWrapper<BdArea> provinceQueryWrapper = new LambdaQueryWrapper<>();
        provinceQueryWrapper.eq(BdArea::getPkCountry, CountryConstants.CHINA_COUNTRY);
        provinceQueryWrapper.eq(BdArea::getParent, 0);
        provinceQueryWrapper.orderByAsc(BdArea::getCode);
        List<BdArea> provinceList = baseMapper.selectList(provinceQueryWrapper);
        // 省map
        Map<String, BdArea> provinceMap = provinceList.stream().collect(Collectors.toMap(BdArea::getCode, Function.identity()));

        // 以行政区划编码进行比较，名称不同，以同步下来的数据为准
        for (AreaDTO provinceDTO : provinceDTOList) {
            BdArea provinceArea = provinceMap.get(provinceDTO.getCode());
            if (null != provinceArea) {
                // 省已经在数据库中存在
                // 判断名称是否重复，如果不相同进行更新
                if (!provinceDTO.getName().equals(provinceArea.getName())) {
                    BdArea bdArea = new BdArea();
                    bdArea.setPkId(provinceArea.getPkId());
                    bdArea.setName(provinceDTO.getName());
                    bdArea.setPkModified(userId);
                    bdArea.setModifiedTime(nowDate);
                }

                // 查询省下的市列表

            } else {
                // 省没有在数据库中存在
                // 需要新添加省、市、县一套数据
                BdArea tmpProvinceArea = new BdArea();
                tmpProvinceArea.setCode(provinceDTO.getCode());
                tmpProvinceArea.setName(provinceDTO.getName());
                tmpProvinceArea.setParent(0);
                tmpProvinceArea.setPkCreator(userId);
                tmpProvinceArea.setCreationTime(nowDate);
                tmpProvinceArea.setPkCountry(pkCountry);

                // 市级列表
                List<AreaDTO> cityDTOList = provinceDTO.getChildList();
                for (AreaDTO cityDTO : cityDTOList) {
                    BdArea tmpCityArea = new BdArea();
                    tmpCityArea.setCode(cityDTO.getCode());
                    tmpCityArea.setName(cityDTO.getName());
                    tmpCityArea.setParent(0);
                    tmpCityArea.setPkCreator(userId);
                    tmpCityArea.setCreationTime(nowDate);
                    tmpCityArea.setPkCountry(pkCountry);
                }

            }
        }

        // 每个市补全一个 XXXX01 的市直辖，如果同步中有数据以同步数据为准，如果没有就补齐

        // 数据库中每个行划编码需要与同步下来的数据进行比较，如果不存在需要隐藏显示


        return null;
    }

}
