package com.njcn.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.system.mapper.DeptMapMapper;
import com.njcn.system.pojo.param.DeptConfigParam;
import com.njcn.system.pojo.po.DeptMap;
import com.njcn.system.pojo.vo.Dept;
import com.njcn.system.pojo.vo.DeptConfigVO;
import com.njcn.system.service.DeptMapService;
import com.njcn.web.utils.RequestUtil;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @version 1.0.0
 * @author: chenchao
 * @date: 2022/08/04 11:38
 */
@Service
@AllArgsConstructor
public class DeptMapServiceImpl implements DeptMapService {

    private final DeptMapMapper deptMapMapper;

    @Override
    public List<DeptConfigVO> getDeptMapConfig() {
        List<DeptConfigVO> deptConfigVOS = new ArrayList<>();
        List<DeptMap> deptMaps = deptMapMapper.selectList(new QueryWrapper<DeptMap>().eq("sys_dept_map.State",DataStateEnum.ENABLE.getCode()));
        if (!CollectionUtils.isEmpty(deptMaps)) {
            List<String> deptIndexes = deptMaps.stream().map(DeptMap::getDeptId).collect(Collectors.toList());
            List<Dept> deptList = deptMapMapper.selectDeptListName(deptIndexes);
            for (DeptMap dept: deptMaps) {
                DeptConfigVO configVO = new DeptConfigVO();
                BeanUtils.copyProperties(dept, configVO);
                List<Dept> deptData = deptList.stream().filter(item -> item.getDeptId().equals(configVO.getDeptId())).collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(deptData)) {
                    configVO.setDeptName(deptData.get(0).getDeptName());
                }
                deptConfigVOS.add(configVO);
            }
            return deptConfigVOS;
        }
        return null;
    }

    @Override
    public DeptConfigVO getDeptMapConfigById(String id) {
        DeptConfigVO deptConfigVO = new DeptConfigVO();
        DeptMap deptMap = deptMapMapper.selectById(id);
        if (!Objects.isNull(deptMap) && deptMap.getState().equals(DataStateEnum.ENABLE.getCode())) {
            BeanUtils.copyProperties(deptMap, deptConfigVO);
            deptConfigVO.setDeptName(deptMapMapper.selectDeptName(deptMap.getDeptId()));
            return deptConfigVO;
        }
        return null;
    }

    @Override
    public DeptConfigVO getConfigByDeptId(String deptId) {
        DeptConfigVO deptConfigVO = new DeptConfigVO();
        DeptMap deptMap = deptMapMapper.selectOne(new QueryWrapper<DeptMap>().eq("sys_dept_map.Dept_Id", deptId));
        if (!Objects.isNull(deptMap) && deptMap.getState().equals(DataStateEnum.ENABLE.getCode())) {
            BeanUtils.copyProperties(deptMap, deptConfigVO);
            deptConfigVO.setDeptName(deptMapMapper.selectDeptName(deptMap.getDeptId()));
            return deptConfigVO;
        }
        return null;
    }

    @Override
    public boolean addDeptMapConfig(DeptConfigParam deptConfigParam) {
        if (deptMapMapper.selectCountByDept(deptConfigParam.getDeptId())==0) {
            throw new BusinessException(CommonResponseEnum.DEPT_NOT_EXIST);
        }
        QueryWrapper<DeptMap> deptMapQueryWrapper = new QueryWrapper<>();
        deptMapQueryWrapper.eq("sys_dept_map.Dept_Id",deptConfigParam.getDeptId());
        Integer count = deptMapMapper.selectCount(deptMapQueryWrapper);
        if (count==0) {
            DeptMap deptMap = new DeptMap();
            BeanUtils.copyProperties(deptConfigParam,deptMap);
            deptMap.setCreateBy(RequestUtil.getUserIndex());
            deptMap.setCreateTime(LocalDateTime.now());
            deptMap.setUpdateBy(RequestUtil.getUserIndex());
            deptMap.setUpdateTime(LocalDateTime.now());
            deptMapMapper.insert(deptMap);
            return true;
        } else {
            throw new BusinessException(CommonResponseEnum.DEPT_BINDED);
        }
    }

    @Override
    public boolean updateDeptMapConfigById(DeptConfigParam.DeptConfigUpdateParam deptConfigUpdateParam) {
        DeptMap deptMap = deptMapMapper.selectOne(new QueryWrapper<DeptMap>().eq("sys_dept_map.Id", deptConfigUpdateParam.getId()));
        if (!Objects.isNull(deptMap) && deptMap.getState().equals(DataStateEnum.ENABLE.getCode())) {
            deptMap.setLongitude(deptConfigUpdateParam.getLongitude());
            deptMap.setLatitude(deptConfigUpdateParam.getLatitude());
            deptMap.setMaxValue(deptConfigUpdateParam.getMaxValue());
            deptMap.setMinValue(deptConfigUpdateParam.getMinValue());
            deptMap.setBeValue(deptConfigUpdateParam.getBeValue());
            deptMap.setMapType(deptConfigUpdateParam.getMapType());
            deptMap.setDeptId(deptConfigUpdateParam.getDeptId());
            deptMap.setUpdateBy(RequestUtil.getUserIndex());
            deptMap.setUpdateTime(LocalDateTime.now());
            deptMapMapper.updateById(deptMap);
            return true;
        }
        return false;
    }

    @Override
    public boolean removeDeptMapConfigById(String id) {
        DeptMap deptMap = deptMapMapper.selectOne(new QueryWrapper<DeptMap>().eq("sys_dept_map.Id", id));
        if (!Objects.isNull(deptMap) && deptMap.getState().equals(DataStateEnum.ENABLE.getCode())) {
            deptMap.setState(DataStateEnum.DELETED.getCode());
            deptMapMapper.updateById(deptMap);
            return true;
        }
        return false;
    }


}
