package cn.wisenergy.chnmuseum.party.service.impl;


import cn.wisenergy.chnmuseum.party.common.util.DateUtil80;
import cn.wisenergy.chnmuseum.party.mapper.TAreaMapper;
import cn.wisenergy.chnmuseum.party.model.TArea;
import cn.wisenergy.chnmuseum.party.model.TOrgan;
import cn.wisenergy.chnmuseum.party.mapper.TOrganMapper;
import cn.wisenergy.chnmuseum.party.service.TOrganService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.rmi.server.ExportException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <pre>
 * 用户 服务实现类
 * </pre>
 *
 * @author Danny Lee
 * @since 2021-03-22
 */
@Slf4j
@Service
public class TOrganServiceImpl extends ServiceImpl<TOrganMapper, TOrgan> implements TOrganService {

    @Resource
    private TOrganMapper organMapper;

    @Resource
    private TAreaMapper areaMapper;

    @Override
    public List<TOrgan> getTree(String orgCode) {
        List<TOrgan> list = list(Wrappers.<TOrgan>lambdaQuery().eq(TOrgan::getIsDeleted, 0).likeRight(TOrgan::getCode,orgCode).orderByDesc(TOrgan::getLevel));
        HashMap<String, TOrgan> map = new HashMap<>();
        list.forEach(o-> map.put(o.getId(),o));
        for (TOrgan o : list) {
            TOrgan parentOrg= map.get(o.getParentId());
            if(parentOrg!=null){
                //说明有值
                if(parentOrg.getChildren()==null){
                    parentOrg.setChildren(new ArrayList<>());
                }
                parentOrg.getChildren().add(o);
            }
        }
        list = list.stream().filter(o -> o.getLevel() == 1).collect(Collectors.toList());
        return list;
    }

    @Override
    public boolean batchUpload(List excelList) throws Exception{
        boolean flag =false;

        if (excelList.size()<1){
            throw new Exception("文件没有数据!");
        }
        List<TOrgan> list1 = list();
        HashMap<String, TOrgan> map1 = new HashMap<>();
        list1.stream().forEach(o-> map1.put(o.getName(),o));

        HashMap<String, String> area = new HashMap<>();

        List<Map<String, Object>> mapList = organMapper.selectArea();
        mapList.stream().forEach(m->area.put(m.get("name").toString(),m.get("id").toString()));

        for (int i = 0; i < excelList.size(); i++) {
            Map<String, String> map = null;
            map = (Map<String, String>) excelList.get(i);
            TOrgan organ = new TOrgan();


            //机构名称不能重复
            QueryWrapper<TOrgan> ew = new QueryWrapper<>();
            if (StringUtils.isNotBlank(map.get("名称"))) {
                organ.setName(organ.getName().trim());
                ew.eq("is_deleted", 0);
                ew.eq("name", organ.getName());
                List<TOrgan> list = list(ew);
                if (list != null&&list.size()>0&&list.get(0)!=null) {
                    throw new Exception("机构名称不能重复!");
                }
                organ.setName(map.get("名称"));
            }else {
                throw new Exception("没有填写机构名称!");
            }
            try {
            String parent = map.get("上级机构");
            if (map1.get(parent)==null){
                organ.setParentId("0");
                organ.setLevel(1);
            }else {
                organ.setParentId(map1.get(parent).getId());
                organ.setLevel(map1.get(parent).getLevel()+1);
            }
            if (organ.getLevel()>3){
                return false;
            }
            String organCode = getOrganCode(organ.getParentId());
            organ.setCode(organCode);
            organ.setAreaId(area.get(map.get("区域")));
            organ.setRemarks(map.get("备注"));
            organ.setIsDeleted(false);
            organ.setCreateTime(DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis()));
            organ.setUpdateTime(LocalDateTime.now());

                flag = save(organ);
//            list.add(organ);
            } catch (Exception e) {
                throw new Exception("文件数据错误!");
            }
        }

//        flag = saveBatch(list);
        return flag;
    }

    @Override
    public TOrgan selectById(String id) {
        TOrgan organ = organMapper.getById(id);
        String s = areaMapper.selectParent(organ.getAreaId());
        List<TOrgan> list1 = list(new UpdateWrapper<TOrgan>().eq("parent_id", organ.getId()).eq("is_deleted",false));
        organ.setAreas(Arrays.asList(s.split(",")));
        organ.setChildren(list1);
        return organ;
    }

    @Override
    public TOrgan selectCodeMax(String parentId) {
        return organMapper.selectCodeMax(parentId);
    }

    @Override
    public List<TOrgan> getAllList(TOrgan tOrgan) {
        return organMapper.getAllList(tOrgan);
    }


    private String getOrganCode(String parentId) {
        TOrgan max = selectCodeMax(parentId);
        if (max==null){
            max = getById(parentId);
            String s = max.getCode() + "001";
            return s;
        }
        String s = max.getCode().substring(max.getCode().length() - 3);
        String s1 = max.getCode().substring(0,max.getCode().length() - 3);
        Integer integer = Integer.valueOf(s)+1;
        if (integer<10){
            s1=s1+"00"+integer.toString();
        }else if (integer<100){
            s1=s1+"0"+integer.toString();
        }else {
            s1=s1+integer.toString();
        }
        return s1;
    }
}