package com.tofly.xrtygis.custom.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tofly.common.oauth.exception.ToflyDeniedException;
import com.tofly.common.oauth.util.SecurityUtils;
import com.tofly.xrtygis.config.CallCenterFeign;
import com.tofly.xrtygis.custom.entity.vo.UserDeptHotlineVo;
import com.tofly.xrtygis.custom.mapper.NewHotlineMapper;
import com.tofly.xrtygis.custom.service.NewHotlineService;
import com.tofly.xrtygis.custom.service.callCenter.RecordService;
import com.tofly.xrtygis.custom.util.CommonMethod;
import com.tofly.xrtygis.em.Constant;
import com.tofly.xrtygis.em.ExcelExportFileTypeEnum;
import com.tofly.xrtygis.entity.Pfrecord;
import com.tofly.xrtygis.entity.Rxgdbzinfo;
import com.tofly.xrtygis.entity.Rxgdzjlr;
import com.tofly.xrtygis.service.RxgdbzinfoService;
import com.tofly.xrtygis.service.RxgdzjlrService;
import com.tofly.xrtygis.strategy.ExcelStrategyContext;
import com.tofly.xrtygis.util.ExcelUtil;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 泡泡
 */
@Service
@AllArgsConstructor
public class NewHotlineServiceImpl implements NewHotlineService {

    private final NewHotlineMapper newHotlineMapper;
    private final ExcelStrategyContext excelStrategyContext;
    private final RxgdzjlrService rxgdzjlrService;
    private final RxgdbzinfoService rxgdbzinfoService;
    private final RecordService recordService;


    /**
     * 获取联系人消息
     *
     * @param dto  查询条件 为0：编码、姓名、地址、电话  为1：部门、姓名、电话
     * @param code 0：客户消息   1：员工信息
     * @return page
     */
    @Override
    public Page<Map> getContactsInfo(Page page, String dto, String code) {
        if (StringUtils.isEmpty(code)) {
            throw new ToflyDeniedException("未明确查询对象");
        }
        Page<Map> result;
        if ("0".equals(code)) {
            result = newHotlineMapper.getClientInfo(page, dto);
        } else {
            result = newHotlineMapper.getEmployeeInfo(page, dto);
        }
        return result;
    }

    /**
     * 呼叫转移-信息查询
     *
     * @param dept 部门
     * @param dto  人员名字/电话
     * @return list
     */
    @Override
    public List<Map> callShiftQuery(String dept, String dto) {
        return newHotlineMapper.callShiftQuery(dept, dto);
    }

    /**
     * 获取工单登记人员信息
     *
     * @return list
     */
    @Override
    public List<Map> getCrewInfo() {
        return newHotlineMapper.getCrewInfo();
    }

    /**
     * 获取工单类型信息
     *
     * @return list
     */
    @Override
    public List<Map> getworkOrderType() {
        return newHotlineMapper.getworkOrderType();
    }

    /**
     * 录音评分统计
     *
     * @param page  page
     * @param crew  人员
     * @param start 开始时间
     * @param end   结束时间
     * @return page
     */
    @Override
    public Page<Map> recordingStatistics(Page page, String crew, String start, String end) {
        //录音总数
        Map<String, Integer> map = recordService.queryRecordNum(crew,start,end);
        List<Map<String, Object>> recordGrade = newHotlineMapper.getRecordGrade(page, crew, start, end);
        if (recordGrade.isEmpty()){
            return page;
        }else {
            recordGrade.forEach(m->{
                Object pfZxry = m.get("pfZxry");
                if (map.containsKey(pfZxry)){
                    m.put("sumNum",map.get(pfZxry));
                }
            });
            return CommonMethod.listToPage(page,recordGrade);
        }

    }

    /**
     * 坐席人员详细信息
     *
     * @param page  page
     * @param crew  人员
     * @param start 开始时间
     * @param end   结束时间
     * @param code  0：不导出  1：导出
     * @return page
     */
    @Override
    public Page getRecordInfo(HttpServletResponse response, Page page, String crew, String start, String end, String code) {
        if (StringUtils.isEmpty(code)) {
            throw new ToflyDeniedException("请选择查看方式");
        }
        if ("0".equals(code)) {
            return newHotlineMapper.getRecordInfo(page, crew, start, end);
        } else {
            List<Pfrecord> mapList = newHotlineMapper.getRecordInfo(crew, start, end);
            // 根据templateServiceType,templateFlag获取对应模板数据
            ExcelExportFileTypeEnum excelExportFileTypeEnum = ExcelExportFileTypeEnum.getExcelExportFileTypeEnum("pfrecordExcelService", "1");
            if (null == excelExportFileTypeEnum) {
                throw new ToflyDeniedException("导出失败");
            }
            //将查询的结果转json字符串的格式，因为导出的时候只能传一个字符串
            String resultListToString = JSONArray.toJSONStringWithDateFormat(mapList, "yyyy-MM-dd HH:mm:ss");
            // 从模型类型枚举根据templateServiceType获取策略对应模板数据
            List<Map<String, Object>> dataList = excelStrategyContext.getExportData("pfrecordExcelService", "1", resultListToString);
            ExcelUtil.export(dataList.get(0), excelExportFileTypeEnum, Constant.FILE_PATH_TEST_EXPORT_EXCEL, response);
            return null;
        }
    }

    /**
     * 工单统计
     *
     * @return page
     */
    @Override
    public Page workOrderStatistics(Page page, String start, String end, String gdlx, String gdzt, String djry) {
        return newHotlineMapper.workOrderStatistics(page, start, end, gdlx, gdzt, djry);
    }

    /**
     * 查询数据统计工单详情
     *
     * @param page  page
     * @param gdlx  工单类型
     * @param start 开始时间
     * @param end   结束时间
     * @param type  0：接单/派单 1：已处理  2：终止  3：超时  4：未处理
     * @param code  0：不导出  1：导出
     * @return page
     */
    @Override
    public Page workOrderInfo(HttpServletResponse response, Page page, String gdlx, String start, String end, String type, String code, String gdzt, String djry) {
        if ("0".equals(code)) {
            return newHotlineMapper.workOrderInfo(page, gdlx, start, end, type, gdzt, djry);
        } else {
            List<Map> mapList = newHotlineMapper.workOrderInfo(gdlx, start, end, type, gdzt, djry);
            // 根据templateServiceType,templateFlag获取对应模板数据
            ExcelExportFileTypeEnum excelExportFileTypeEnum = ExcelExportFileTypeEnum.getExcelExportFileTypeEnum("workOrderInfoService", "1");
            if (null == excelExportFileTypeEnum) {
                throw new ToflyDeniedException("导出失败");
            }
            //将查询的结果转json字符串的格式，因为导出的时候只能传一个字符串
            String resultListToString = JSONArray.toJSONStringWithDateFormat(mapList, "yyyy-MM-dd HH:mm:ss");
            // 从模型类型枚举根据templateServiceType获取策略对应模板数据
            List<Map<String, Object>> dataList = excelStrategyContext.getExportData("workOrderInfoService", "1", resultListToString);
            ExcelUtil.export(dataList.get(0), excelExportFileTypeEnum, Constant.FILE_PATH_TEST_EXPORT_EXCEL, response);
            return null;
        }
    }

    /**
     * 查询回访工单详情
     *
     * @param response response
     * @param page     page
     * @param gdlx     工单类型
     * @param start    开始时间
     * @param end      结束时间
     * @param code     0：不导出  1：导出
     * @return page
     */
    @Override
    public Page returnVisitInfo(HttpServletResponse response, Page page, String gdlx, String start, String end, String code, String pass, String gdzt, String djry) {
        if ("0".equals(code)) {
            return newHotlineMapper.payAReturnVisitInfo(page, gdlx, start, end, pass, gdzt, djry);
        }
        {
            List<Map> mapList = newHotlineMapper.payAReturnVisitInfo(gdlx, start, end, pass, gdzt, djry);
            // 根据templateServiceType,templateFlag获取对应模板数据
            ExcelExportFileTypeEnum excelExportFileTypeEnum = ExcelExportFileTypeEnum.getExcelExportFileTypeEnum("returnVisitService", "1");
            if (null == excelExportFileTypeEnum) {
                throw new ToflyDeniedException("导出失败");
            }
            //将查询的结果转json字符串的格式，因为导出的时候只能传一个字符串
            String resultListToString = JSONArray.toJSONStringWithDateFormat(mapList, "yyyy-MM-dd HH:mm:ss");
            // 从模型类型枚举根据templateServiceType获取策略对应模板数据
            List<Map<String, Object>> dataList = excelStrategyContext.getExportData("returnVisitService", "1", resultListToString);
            ExcelUtil.export(dataList.get(0), excelExportFileTypeEnum, Constant.FILE_PATH_TEST_EXPORT_EXCEL, response);
            return null;
        }

    }

    /**
     * 回访统计
     *
     * @param page  page
     * @param start 开始时间
     * @param end   结束时间
     * @return page
     */
    @Override
    public Page returnVisitCount(Page page, String start, String end, String gdlx, String gdzt, String djry) {
        return newHotlineMapper.returnVisitCount(page, start, end, gdlx, gdzt, djry);
    }

    /**
     * 客户查询
     *
     * @param dto 查询条件 编号、姓名、地址、电话
     * @return list
     */
    @Override
    public Page<Map> selectClientInfo(Page page, String dto) {
        return newHotlineMapper.selectClientInfo(page, dto);
    }

    /**
     * 热线工单质检
     *
     * @param page  page
     * @param start 开始时间
     * @param end   结束时间
     * @return page
     */
    @Override
    public Page<Map> orderQualityCount(Page page, String start, String end, String gdlx, String gdzt, String djry) {
        return newHotlineMapper.orderQualityCount(page, start, end, gdlx, gdzt, djry);
    }

    /**
     * 未质检工单详情
     *
     * @param page  page
     * @param type  工单类型
     * @param start 开始时间
     * @param end   结束时间
     * @return page
     */
    @Override
    public Page<Map> notTheQualityInfo(Page page, String type, String start, String end, String gdzt, String djry, String code) {
        return newHotlineMapper.notTheQualityInfo(page, type, start, end, gdzt, djry, code);
    }

    /**
     * 热线工单质检录入
     *
     * @param rxgdzjlr entity
     * @return boolean
     */
    @Override
    public boolean theQuality(Rxgdzjlr rxgdzjlr) {
        if (StringUtils.isEmpty(rxgdzjlr.getGdbh())) {
            throw new ToflyDeniedException("工单编号不允许为空");
        }
        rxgdzjlr.setZjsj(new Date());
        if (rxgdzjlrService.save(rxgdzjlr)) {
            newHotlineMapper.updateGdInfo(rxgdzjlr.getGdbh());
        }
        return true;
    }

    /**
     * 添加热线工单备注
     *
     * @param rxgdbzinfo rxgdbzinfo
     * @return boolean
     */
    @Override
    public boolean insertOrderNote(Rxgdbzinfo rxgdbzinfo) {
        return rxgdbzinfoService.save(rxgdbzinfo);
    }

    /**
     * 获取班长角色的信息
     *
     * @return list
     */
    @Override
    public List<Map<String, Object>> getRoleInfo() {
        return newHotlineMapper.getRoleInfo(SecurityUtils.getUserId());
    }

    /**
     * 通过电话获取客户信息
     *
     * @param tel 电话
     * @return list
     */
    @Override
    public List<Map> telGetInfo(String tel) {
        return newHotlineMapper.telGetInfo(tel);
    }

    @Override
    public Page<Map> allocation(Page page, String str, String qybm, String qydbm) {
        return newHotlineMapper.allocation(page, str,qybm,qydbm);
    }

    @Override
    public String getDeptNameById(Long deptId) {
        return newHotlineMapper.getDeptNameById(deptId);
    }

    @Override
    public List<UserDeptHotlineVo> gerDeptNameMap() {
        return newHotlineMapper.gerDeptNameMap();
    }

    @Override
    public List<UserDeptHotlineVo> getRealNameMap() {
        return newHotlineMapper.getRealNameMap();
    }

    @Override
    public String getRealNameById(String empcode) {
        return newHotlineMapper.getRealNameById(empcode);
    }

    @Override
    public List<Map> getHisTable() {
        return newHotlineMapper.getHisTable();
    }

}
