package com.zehong.system.service.impl;

import cn.hutool.core.date.DateTime;
import com.zehong.common.core.domain.entity.SysUser;
import com.zehong.common.core.domain.model.LoginUser;
import com.zehong.common.utils.DateUtils;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.system.domain.TNews;
import com.zehong.system.domain.TStaningBook;
import com.zehong.system.domain.vo.HiddenStatVO;
import com.zehong.system.mapper.SysDeptMapper;
import com.zehong.system.mapper.THiddenTroubleWorkMapper;
import com.zehong.system.mapper.TStaningBookMapper;
import com.zehong.system.mapper.TTrainCourseMapper;
import com.zehong.system.service.ITStaningBookService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 隐患台账Service业务层处理
 *
 * @author zehong
 * @date 2022-07-09
 */
@Service
public class TStaningBookServiceImpl implements ITStaningBookService
{
    private static final Logger logger = LoggerFactory.getLogger(TStaningBookServiceImpl.class);
    @Autowired
    private TStaningBookMapper tStaningBookMapper;
    @Autowired
    private THiddenTroubleWorkMapper tHiddenTroubleWorkMapper;
    @Autowired
    private SysDeptMapper deptMapper;
    @Autowired
    private TTrainCourseMapper tTrainCourseMapper;
    /**
     * 查询隐患台账
     *
     * @param bookId 隐患台账ID
     * @return 隐患台账
     */
    @Override
    public TStaningBook selectTStaningBookById(Long bookId)
    {
        return tStaningBookMapper.selectTStaningBookById(bookId);
    }

    /**
     * 查询隐患台账列表
     *
     * @param tStaningBook 隐患台账
     * @return 隐患台账
     */
    @Override
    public List<TStaningBook> selectTStaningBookList(TStaningBook tStaningBook,Long roleId)
    {
        if(roleId!=3){//当角色是管理员时候查询全部
            tStaningBook.setUserId(0l);
        }
        List<TStaningBook> list = tStaningBookMapper.selectTStaningBookList(tStaningBook);
        for (TStaningBook t : list){
            if(t.getRectificationTerm()!=null&&t.getRectificationTerm().getTime()<new Date().getTime()&&t.getState()==0){
                t.setFinishDay(1l);
            }else {
                t.setFinishDay(0l);
            }
        }
        return  list;
    }
    public List<Long> selectDeptIds(List<Long> list,List<Long> deptIds){
        List<Long> resultlist = deptMapper.selectDeptByParentId(deptIds);
        if(resultlist.size()==0){
            return list;
        }
        list.addAll(resultlist);
        return selectDeptIds(list,resultlist);
    }
    /**
     * 新增隐患台账
     *
     * @param tStaningBook 隐患台账
     * @return 结果
     */
    @Override
    public int insertTStaningBook(TStaningBook tStaningBook)
    {
        tStaningBook.setCreateTime(DateUtils.getNowDate());
            /** 手机端消息新封装类 */
            TNews tNews=new TNews();
            /**设置所属模块*/
            tNews.setModule(2);
            //查询接收人姓名
//            String nickName = tTrainCourseMapper.selectRecipient(tStaningBook.getRectification());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String myDate = simpleDateFormat.format(tStaningBook.getRectificationTerm());
            /**设置内容*/
            tNews.setMessageContent("隐患排查:"+tStaningBook.getTroubleName()+",请于"+myDate+"前整改完毕。");
            LoginUser loginUser = SecurityUtils.getLoginUser();
            SysUser user = loginUser.getUser();
            Long userId = user.getUserId();
            /** 发布人ID*/
            tNews.setPublisherId(userId);
            /** 接收人id*/
            tNews.setRecipientId(Math.toIntExact(tStaningBook.getRectification()));
            int i = tStaningBookMapper.insertTStaningBook(tStaningBook);
             /** 所属模块id*/
            tNews.setModuleId(Long.valueOf(tStaningBook.getBookId()));
            tNews.setReleaseTime(new DateTime());
            /**
             * 消息添加
             */
            tTrainCourseMapper.insertNews(tNews);


        return i;
    }

    /**
     * 修改隐患台账
     *
     * @param tStaningBook 隐患台账
     * @return 结果
     */
    @Override
    public int updateTStaningBook(TStaningBook tStaningBook)
    {
        return tStaningBookMapper.updateTStaningBook(tStaningBook);
    }

    /**
     * 批量删除隐患台账
     *
     * @param bookIds 需要删除的隐患台账ID
     * @return 结果
     */
    @Override
    public int deleteTStaningBookByIds(Long[] bookIds)
    {
        return tStaningBookMapper.deleteTStaningBookByIds(bookIds);
    }

    /**
     * 删除隐患台账信息
     *
     * @param bookId 隐患台账ID
     * @return 结果
     */
    @Override
    public int deleteTStaningBookById(Long bookId)
    {
        return tStaningBookMapper.deleteTStaningBookById(bookId);
    }

    @Override
    public Map statics(String type) {
        return tStaningBookMapper.statics(type);
    }

    @Override
    public Map<String,List> hiddenStat(Integer troubleLevel, Date beginTime, Date endTime){
        Map<String,List> result = new HashMap<>(16);
        try {
            List<HiddenStatVO> barData = tStaningBookMapper.hiddenBarStat(troubleLevel,beginTime,endTime);
            //柱状图月份数据
            List<String> months = getMonthBetweenDate(beginTime,endTime);
            //柱状图隐患数量
            List<Integer> hiddens = new ArrayList<>();
            //柱状图整改数量
            List<Integer> rectifieds = new ArrayList<>();
            for(String month : months){
                boolean isHas = false;
                for(HiddenStatVO hidden : barData){
                    if(month.equals(hidden.getMonth())){
                        isHas = true;
                        hiddens.add(hidden.getHiddenCount());
                        rectifieds.add(hidden.getRectifiedCount());
                        break;
                    }
                }
                if(!isHas){
                    hiddens.add(0);
                    rectifieds.add(0);
                }
            }
            result.put("months",months);
            result.put("hiddens",hiddens);
            result.put("rectifieds",rectifieds);
            //环状统计图
            Map<String,Integer> pieData = tStaningBookMapper.hiddenPieStat(troubleLevel,beginTime,endTime);
            List<Map<String,Object>> pieResult = new ArrayList<>();
            Map<String,Object> rectifiedMap = new HashMap<>(16);
            rectifiedMap.put("name","已整改");
            rectifiedMap.put("value",pieData.get("rectifiedCount"));
            pieResult.add(rectifiedMap);
            Map<String,Object> stayRectifiedMap = new HashMap<>(16);
            stayRectifiedMap.put("name","未整改");
            stayRectifiedMap.put("value",pieData.get("stayRectifiedCount"));
            pieResult.add(stayRectifiedMap);
            result.put("pieData",pieResult);
        } catch (Exception e) {
            logger.error("隐患统计错误:" + e);
        }

        return result;
    }


    /**
     * 获取两个日期之间的所有月份 (年月)
     *
     * @param startTime
     * @param endTime
     * @return:YYYY-MM
     */
    private List<String> getMonthBetweenDate(Date startTime, Date endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 声明保存日期集合
        List<String> list = new ArrayList<String>();
        //用Calendar 进行日期比较判断
        Calendar calendar = Calendar.getInstance();
        while (startTime.getTime()<=endTime.getTime()){
            // 把日期添加到集合
            list.add(sdf.format(startTime));
            // 设置日期
            calendar.setTime(startTime);
            //把日期增加一天
            calendar.add(Calendar.MONTH, 1);
            // 获取增加后的日期
            startTime=calendar.getTime();
        }
        return list;
    }

}