package com.zcloud.controller.bus;

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

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import com.zcloud.entity.Page;
import com.zcloud.service.hiddenApi.HiddenApiService;
import org.apache.logging.log4j.util.Strings;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.zcloud.controller.base.BaseController;
import com.zcloud.entity.PageData;
import com.zcloud.entity.system.Dictionaries;
import com.zcloud.entity.system.User;
import com.zcloud.service.announcement.TemplateAnnounService;
import com.zcloud.service.bus.*;
import com.zcloud.service.inspection.SafetyEnvironmentalService;
import com.zcloud.service.system.DepartmentService;
import com.zcloud.service.system.DictionariesService;
import com.zcloud.service.system.FHlogService;
import com.zcloud.service.system.UsersService;
import com.zcloud.util.*;
import com.zcloud.util.event.DeviceHiddenEvent;
import com.zcloud.util.message.MessageService;

/**
 * 说明:隐患 作者:luoxiaobao 时间:2021-01-04 官网:www.zcloudchina.com
 */
@Controller
@RequestMapping("/hiddenExcel")
public class HiddenExcelController extends BaseController {


    @Autowired
    private HiddenApiService hiddenApiService;
    @Autowired
    private DictionariesService dictionariesService;
    @Autowired
    private ImgFilesService imgFilesService;
    @Autowired
    private HiddenCheckService hiddenCheckService;

    @RequestMapping(value = "/exportExcelToSession")
//	// @RequiresPermissions("toExcel")
    @ResponseBody
    public Map exportExcelToSession() throws Exception {
        PageData pd = new PageData();
        pd = this.getPageData();
        Session session = Jurisdiction.getSession();
//		session.setAttribute("HIDDENTOSESSION_5ff9daf78e9a4fb1b40d77980656799d", "0");
        Object a = session.getAttribute(pd.getString("sessionID"));
        float progressA = 0f;
        if (!Tools.isEmpty(a)) {
            progressA = Float.parseFloat(a.toString());
        } else {
            progressA = 100f;
        }


        float progressB = 100f;
        float diff = 1e-6F;

        if (Math.abs(progressA - progressB) < diff) {
            session.removeAttribute(pd.getString("sessionID"));
        }
        Map<String, Object> map = new HashMap<>(); // 16886367956574190090011741
        map.put("progress", progressA);
        map.put("result", "success");
        return map;
    }

    /**
     * 导出到excel
     * 1.查询什么 导出什么
     * 2.增加 整改资金 字段
     * 3.导出慢
     * 4.没有图标
     * 5.增加进度条
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/excel2")
//	// @RequiresPermissions("toExcel")
    public ModelAndView exportExcel2() throws Exception {
        ModelAndView mv = new ModelAndView();
        PageData pdx = this.getPageData();
        PageData pd = new PageData();
        Set<Map.Entry<String, Object>> set = pdx.entrySet();
        for (Map.Entry<String, Object> stringObjectEntry : set) {
            if (!Tools.isEmpty(pdx.getString(stringObjectEntry.getKey()))) {
                pd.put(stringObjectEntry.getKey(), pdx.getString(stringObjectEntry.getKey()));
            }
        }


        Session session = Jurisdiction.getSession();

        session.setAttribute(pd.getString("sessionID"), "0");

        Map<String, Object> dataMap = new HashMap<>();

        List<PageData> varList = new ArrayList<PageData>();
        List<String> wertitles = this.setTitles();
        List<PageData> hiddenListAll = getHiddenList(pd);// 获取 隐患数据

        /**
         *  转义的数据.
         */
        // 隐患等级
        Map<String, PageData> levelMap = this.zyDicByIds("5ff9daf78e9a4fb1b40d77980656799d,efca93dcaf7a427785f0815ab2781a59");
        Integer imgCountToSession = 0;
        List<String> imgkey = new ArrayList<>();
        for (int i = 0; i < hiddenListAll.size(); i++) {
            imgkey.add(hiddenListAll.get(i).getString("HIDDEN_ID"));
        }
        Map<String, Object> accMap = this.getaccepMap(imgkey);
        List<String> acceptIds = new ArrayList<>();
        Map<String, Object> acceptMap = new HashMap<>();
        if (null != accMap) {
            acceptIds = (List<String>) accMap.get("accIds");//隐患验收人信息图片
            acceptMap = (Map<String, Object>) accMap.get("accMap");//隐患验收人信息
        }
        if (acceptIds != null) {
            for (int i = 0; i < acceptIds.size(); i++) {
                imgkey.add(acceptIds.get(i));
            }
        }
        Map<String, List<PageData>> imgMap = this.getHiddenImgs(imgkey);//隐患图片信息

        for (int i = 0; i < hiddenListAll.size(); i++) {
            PageData hidden = hiddenListAll.get(i);
            PageData vpd = new PageData();
            vpd.put("var1", this.zySourec(hidden.getString("SOURCE"))); // 隐患来源
            if (levelMap.containsKey(hidden.getString("HIDDENLEVEL"))) {
                vpd.put("var2", levelMap.get(hidden.getString("HIDDENLEVEL")).getString("NAME")); // 隐患级别
            }
            vpd.put("var3", hidden.getString("type1Name")); // 隐患类型
            vpd.put("var4", this.zyState(hidden.getString("STATE"))); // 隐患状态
            vpd.put("var5", hidden.getString("HIDDENDESCR")); // 隐患描述
            vpd.put("var6", hidden.getString("HIDDENPARTNAME")); //隐患部位
            vpd.put("var7", hidden.getString("POSITIONDESC")); // 隐患位置描述
            vpd.put("var8", hidden.getString("fxUserDeptName"));//隐患发现部门
            vpd.put("var9", hidden.getString("fxUserName")); // 发现人
            vpd.put("var10", hidden.getString("DISCOVERYTIME")); //发现时间
            vpd.put("var11", this.zyRectificationtype(hidden.getString("RECTIFICATIONTYPE"))); //隐患处置
            vpd.put("var12", hidden.getString("conUsername"));
            vpd.put("var13", hidden.getString("CONFIRM_TIME"));
            vpd.put("var14", hidden.getString("RECTIFICATIONDEADLINE"));

            if (imgMap.containsKey(hidden.getString("HIDDEN_ID") + "--" + "3")) { // 隐患图片
                List<PageData> hiddenimg = imgMap.get(hidden.getString("HIDDEN_ID") + "--" + "3");
                for (int himg = 0; himg < 4; himg++) {
                    if (himg < hiddenimg.size()) {
                        vpd.put("img" + (15 + himg), hiddenimg.get(himg).getString("FILEPATH"));
                        imgCountToSession++;
                    } else {
                        vpd.put("var" + (15 + himg), "");
                    }
                }
            }
            vpd.put("var19", hidden.getString("RECTIFYDESCR"));//整改描述
            vpd.put("var20", hidden.getString("zgUserDeptName"));
            vpd.put("var21", hidden.getString("zgUserName")); // 整改人
            vpd.put("var22", hidden.getString("RECTIFICATIONTIME"));//整改时间
            vpd.put("var23", hidden.getString("INVESTMENT_FUNDS"));//投入资金

            if (imgMap.containsKey(hidden.getString("HIDDEN_ID") + "--" + "4")) { //整改后图片
                List<PageData> hiddenimg = imgMap.get(hidden.getString("HIDDEN_ID") + "--" + "4");
                for (int himg = 0; himg < 4; himg++) {
                    if (himg < hiddenimg.size()) {
                        vpd.put("img" + (24 + himg), hiddenimg.get(himg).getString("FILEPATH"));
                        imgCountToSession++;
                    } else {
                        vpd.put("var" + (24 + himg), "");
                    }
                }
            }

            if ("1".equals(hidden.getString("HAVESCHEME"))) { //整改方案
                vpd.put("var28", "有");
            } else {
                vpd.put("var28", "无");
            }
            if (acceptMap.containsKey(hidden.getString("HIDDEN_ID"))) {
                PageData acc = (PageData) acceptMap.get(hidden.getString("HIDDEN_ID"));
                vpd.put("var29", acc.getString("CHECKDESCR")); //验收描述
                if ("1".equals(acc.getString("STATUS"))) {//是否合格
                    vpd.put("var30", "合格");
                } else if ("2".equals(acc.getString("STATUS"))) {//是否合格
                    vpd.put("var30", "不合格");
                }
                vpd.put("var31", acc.getString("DEPARTMENT_NAME"));//验收部门
                vpd.put("var32", acc.getString("NAME")); //验收人
                vpd.put("var33", acc.getString("CHECK_TIME")); // 验收时间
                if (imgMap.containsKey(acc.getString("HIDDENCHECK_ID") + "--" + "5")) { //验收照片
                    List<PageData> hiddenimg = imgMap.get(acc.getString("HIDDENCHECK_ID") + "--" + "5");
                    for (int himg = 0; himg < 4; himg++) {
                        if (himg < hiddenimg.size()) {
                            vpd.put("img" + (34 + himg), hiddenimg.get(himg).getString("FILEPATH"));
                            imgCountToSession++;
                        } else {
                            vpd.put("var" + (34 + himg), "");
                        }
                    }
                }
            }

            varList.add(vpd);
        }
        dataMap.put("titles", wertitles);
        dataMap.put("varList", varList);
        dataMap.put("sessionID", pd.getString("sessionID"));
        dataMap.put("imgCountToSession", imgCountToSession);

        session.setAttribute(pd.getString("sessionID"), "10");
        HiddenExcelImgToSessionView erv2 = new HiddenExcelImgToSessionView();
        mv = new ModelAndView(erv2, dataMap);

        System.out.println("");
        System.out.println("");
        System.out.println("");
        System.out.println("");
        System.out.println("");
        System.out.println("|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
        System.out.println("");
        System.out.println("");
        System.out.println("");
        System.out.println("");
        System.out.println("");

        return mv;
    }


    public List<PageData> getHiddenList(PageData pd) throws Exception {
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        if (!Jurisdiction.getIS_MAIN().equals("1")) { //主账号
            pd.put("queryUserId", Jurisdiction.getUSER_ID());
        }
        if ("confirm".equals(pd.getString("hiddenVueType"))) { // 确认隐患
            if (!"1".equals(Jurisdiction.getIS_MAIN())) {
                pd.put("CONFIRM_USER", Jurisdiction.getUSER_ID());
            }
        }
        if ("rectify".equals(pd.getString("hiddenVueType"))) { // 整改隐患
            if (!"1".equals(Jurisdiction.getIS_MAIN())) {
                pd.put("SELFUSERID", Jurisdiction.getUSER_ID());
            }
        }
        if ("check".equals(pd.getString("hiddenVueType"))) { // 验收隐患  只显示我验收的隐患
            pd.put("checkUser", Jurisdiction.getUSER_ID());
        }
        if ("list".equals(pd.getString("hiddenVueType"))) { // 整改隐患
            pd = Jurisdiction.getUserDataJurisdiction(pd);
        }

        List<PageData> getListAll = hiddenApiService.getListAll(pd); // 列出Hidden列表
        return getListAll;
    }

    /**
     * 写入上方的列信息
     *
     * @return
     */
    public List<String> setTitles() {
        List<String> titles = new ArrayList<String>();
        titles.add("隐患来源");    //1
        titles.add("隐患级别");    //1
        titles.add("隐患类型");    //2
        titles.add("隐患状态");    //3
        titles.add("隐患描述");    //4
        titles.add("隐患部位");    //5
        titles.add("隐患位置描述");    //6
        titles.add("隐患发现部门");    //7
        titles.add("发现人");    //8
        titles.add("发现时间");    //9
        titles.add("隐患处置");    //10
        titles.add("确认人");    //11
        titles.add("确认时间");    //12
        titles.add("整改期限");    //13
        titles.add("隐患图片");    //14
        titles.add("隐患图片");    //15
        titles.add("隐患图片");    //16
        titles.add("隐患图片");    //17
        titles.add("整改描述");    //18
        titles.add("整改部门");    //19
        titles.add("整改人");    //20
        titles.add("整改时间");    //21
        titles.add("投入资金");    //22
        titles.add("整改后图片");    //23
        titles.add("整改后图片");    //24
        titles.add("整改后图片");    //25
        titles.add("整改后图片");    //26
        titles.add("整改方案");    //27
        titles.add("验收描述");    //28
        titles.add("是否合格");    //29
        titles.add("验收部门");    //30
        titles.add("验收人");    //31
        titles.add("验收时间");    //32
        titles.add("验收图片");    //33
        titles.add("验收图片");    //34
        titles.add("验收图片");    //35
        titles.add("验收图片");    //36

        return titles;
    }

    /**
     * 转义 隐患来源
     *
     * @param hiddenSourec
     * @return
     */
    public String zySourec(String hiddenSourec) {
        if ("1".equals(hiddenSourec)) {
            return "隐患快报";
        } else if ("2".equals(hiddenSourec)) {
            return "清单排查";
        } else if ("3".equals(hiddenSourec)) {
            return "清单排查";
        } else if ("4".equals(hiddenSourec)) {
            return "安全环保检查(监管端)";
        } else if ("5".equals(hiddenSourec)) {
            return "安全环保检查(企业端)";
        } else if ("6".equals(hiddenSourec)) {
            return "消防检查";
        }
        return "";
    }

    public String zyRectificationtype(String rectificationtype) {
        if ("1".equals(rectificationtype)) {
            return "立即整改";
        } else if ("2".equals(rectificationtype)) {
            return "限期整改";
        }
        return "";
    }

    /**
     * 转义 隐患状态
     *
     * @param hiddenState
     * @return
     */
    public String zyState(String hiddenState) {
        if ("-2".equals(hiddenState)) {
            return "待确认";
        } else if ("-1".equals(hiddenState)) {
            return "已过期";
        } else if ("0".equals(hiddenState)) {
            return "未提交";
        } else if ("1".equals(hiddenState)) {
            return "未整改";
        } else if ("2".equals(hiddenState)) {
            return "已整改";
        } else if ("3".equals(hiddenState)) {
            return "已复查";
        } else if ("4".equals(hiddenState)) {
            return "已验收";
        } else if ("5".equals(hiddenState)) {
            return "忽略隐患";
        } else if ("6".equals(hiddenState)) {
            return "重大隐患";
        } else if ("7".equals(hiddenState)) {
            return "待处理的特殊隐患";
        } else if ("8".equals(hiddenState)) {
            return "已处理的特殊隐患";
        } else if ("10".equals(hiddenState)) {
            return "验收打回";
        }
        return "";
    }

    /**
     * 数据字典转换
     *
     * @param dicPids
     * @return
     * @throws Exception
     */
    public Map<String, PageData> zyDicByIds(String dicPids) throws Exception {

        List<String> ids = new ArrayList<>();
        String[] idsString = dicPids.split(",");
        for (int i = 0; i < idsString.length; i++) {
            ids.add(idsString[i]);
        }

        Map<String, PageData> map = new HashMap<>();

        List<PageData> dicList = dictionariesService.getIdsByParentIds(ids);
        for (PageData pageData : dicList) {
            map.put(pageData.getString("BIANMA"), pageData);
        }
        return map;
    }

    /**
     * 获取隐患相关的照片信息
     *
     * @param imgIdList
     * @return
     * @throws Exception
     */
    public Map<String, List<PageData>> getHiddenImgs(List<String> imgIdList) throws Exception {
        Map<String, List<PageData>> map = new HashMap<>();
        String[] imgId = new String[imgIdList.size()];
        for (int i = 0; i < imgIdList.size(); i++) {
            imgId[i] = imgIdList.get(i);
        }

        PageData imgpd2 = new PageData();
        imgpd2.put("ArrayDATA_IDS", imgId);
        if (imgId.length == 0) {
            return map;
        }
        List<PageData> imgList = imgFilesService.listAllByIds(imgpd2);
        for (PageData pageData : imgList) {
            String FOREIGN_KEY = pageData.getString("FOREIGN_KEY");
            String TYPE = pageData.getString("TYPE");
            String mapKey = FOREIGN_KEY + "--" + TYPE;
            List<PageData> vallist = new ArrayList<>();
            if (map.containsKey(mapKey)) {
                vallist = map.get(mapKey);
            }
            vallist.add(pageData);
            map.put(mapKey, vallist);
        }
        return map;
    }

    /**
     * 获取隐患验收信息
     *
     * @return
     * @throws Exception
     */
    public Map<String, Object> getaccepMap(List<String> hiddenIds) throws Exception {
        Map<String, Object> map = new HashMap<>();
        String[] imgId = new String[hiddenIds.size()];
        for (int i = 0; i < hiddenIds.size(); i++) {
            imgId[i] = hiddenIds.get(i);
        }
        PageData hiddenIdsMap = new PageData();
        hiddenIdsMap.put("ArrayDATA_IDS", imgId);
        if (hiddenIds.size() == 0) {
            return map;
        }
        List<PageData> acceptlist = hiddenCheckService.listAllByIds(hiddenIdsMap);
        Map<String, Object> accMap = new HashMap<>();
        List<String> accIds = new ArrayList<>();
        for (PageData pageData : acceptlist) {
            accMap.put(pageData.getString("HIDDEN_ID"), pageData);
            accIds.add(pageData.getString("HIDDENCHECK_ID"));
        }
        map.put("accMap", accMap);
        map.put("accIds", accIds);
        return map;
    }
}