package com.zcloud.controller.video;

import com.alibaba.fastjson.JSONObject;
import com.zcloud.controller.base.BaseController;
import com.zcloud.entity.Page;
import com.zcloud.entity.PageData;
import com.zcloud.logs.LogAnno;
import com.zcloud.service.corp.CorpInfoService;
import com.zcloud.service.video.TokenService;
import com.zcloud.service.video.VideoManagerService;
import com.zcloud.util.*;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.util.*;

/**
 * 说明：视频管理
 * 作者：luoxiaobao
 * 时间：2021-05-10
 * 官网：www.zcloudchina.com
 */
@Controller
@RequestMapping("/videomanager")
public class VideoManagerController extends BaseController {

    @Autowired
    private VideoManagerService videomanagerService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private CorpInfoService corpInfoService;
    @Resource
    private InitPageDataUtil initPageDataUtil;

    /**
     * 新增
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/add")
//	// @RequiresPermissions("videomanager:add")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "新增")
    public Object add() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        pd.put("VIDEOMANAGER_ID", this.get32UUID());    //主键
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        pd.put("OPDATE", DateUtil.date2Str(new Date()));    //操作日期
        pd.put("OPUSER", Jurisdiction.getUsername());    //操作人
        pd.put("ISDELETE", "0");    //是否删除
        if ("0".equals(Jurisdiction.getPERSONNEL_POSITION())) {
            if ("0".equals(Jurisdiction.getPERSONNEL_TYPE())) {
                JSONObject jsonObject = PLSUtil.saveCamera(Jurisdiction.getCORPINFO_ID(), pd);
                if (!"200".equals(jsonObject.getString("code"))) {
                    return ReturnMap.error("三方系统摄像头对接失败");
                }
                pd.put("PLS_ID", jsonObject.get("data"));
                videomanagerService.save(pd);
                map.put("result", errInfo);
                return map;
            }
        }
        videomanagerService.save(pd);
        return ReturnMap.ok();
    }

    /**
     * 删除
     *
     * @param out
     * @throws Exception
     */
    @RequestMapping(value = "/delete")
//	// @RequiresPermissions("videomanager:del")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "删除")
    public Object delete() throws Exception {
        Map<String, String> map = new HashMap<String, String>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        if ("0".equals(Jurisdiction.getPERSONNEL_POSITION())) {
            if ("0".equals(Jurisdiction.getPERSONNEL_TYPE())) {
                JSONObject jsonObject = PLSUtil.removeCamera(Jurisdiction.getCORPINFO_ID(), pd);
                if (!"200".equals(jsonObject.getString("code"))) {
                    return ReturnMap.error("三方系统摄像头对接失败");
                }
                videomanagerService.delete(pd);
                map.put("result", errInfo);                //返回结果
                return map;
            }
        }
        videomanagerService.delete(pd);
        return ReturnMap.ok();
    }

    /**
     * 列表 数据置顶
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/editZhiding")
    // @RequiresPermissions("video:edit")
    @ResponseBody
//	@LogAnno(menuType= "综合管理",menuServer= "学习园地",instructionsOperate = "企业视频",instructionsType = "数据置顶列表")
    public Object editZhiding() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        pd.put("ISSHOW", "1");
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        videomanagerService.editZhiding(pd);//置顶信息
        map.put("pd", pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 修改
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/edit")
//	// @RequiresPermissions("videomanager:edit")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "修改")
    public Object edit() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        PageData data = corpInfoService.findById(pd);
        if ("1".equals(data.getString("PERSONNEL_POSITION"))) {
            videomanagerService.edit(pd);
            return ReturnMap.ok();
        }
        JSONObject jsonObject = PLSUtil.editCamera(Jurisdiction.getCORPINFO_ID(), pd);
        if (!"200".equals(jsonObject.getString("code"))) {
            return ReturnMap.error("三方系统摄像头对接失败，禁止修改");
        }
        videomanagerService.edit(pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 修改人员定位系统ID
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/editPls")
//	// @RequiresPermissions("videomanager:edit")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "修改")
    public Object editPls() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        PageData data = corpInfoService.findById(pd);
        if ("1".equals(data.getString("PERSONNEL_POSITION"))) {
            return ReturnMap.error("人员定位服务未开启");
        }
        videomanagerService.editPls(pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 列表
     *
     * @param page
     * @throws Exception
     */
    @RequestMapping(value = "/list")
//	// @RequiresPermissions("videomanager:list")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "列表")
    public Object list(Page page) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        String KEYWORDS = pd.getString("KEYWORDS");                        //关键词检索条件
        if (Tools.notEmpty(KEYWORDS)) pd.put("KEYWORDS", KEYWORDS.trim());

        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        page.setPd(pd);

        List<PageData> varList = videomanagerService.list(page);    //列出VideoManager列表
        map.put("varList", varList);
        map.put("page", page);
        map.put("result", errInfo);
        return map;
    }


    /**
     * @Description: 摆放摄像头位置，修改
     * @Author: dearLin
     * @Date: 2024/2/22/022 17:25
     * @Param: [] []
     * @Return: java.lang.Object
     */
    @RequestMapping(value = "/setPositioning")
    @ResponseBody
    public Object setPositioning() throws Exception {
        PageData pageData = getPageData();
        if ("0".equals(Jurisdiction.getPERSONNEL_POSITION())) {
            if ("0".equals(Jurisdiction.getPERSONNEL_TYPE())) {
                PLSUtil.GeneralPut("/device/camera", pageData, Jurisdiction.getCORPINFO_ID());
                return ReturnMap.ok();
            } else {
                pageData.put("VIDEOMANAGER_ID", pageData.getString("camId"));
                videomanagerService.edit(pageData);
                return ReturnMap.ok();
            }
        }
        return ReturnMap.error("人员定位服务未开启");
    }

    @RequestMapping(value = "/getISshow")
    @ResponseBody
    public Object getISshow() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        pd.put("ISSHOW", "1");
        List<PageData> varList = videomanagerService.listAll(pd);    //根据ID读取
        List<PageData> tList = tokenService.listAll(pd);
        System.out.println(tList.get(0).getString("TOKEN"));
        map.put("pd", pd);
        map.put("varList", varList);
        map.put("token", tList.get(0).getString("TOKEN"));
        map.put("result", errInfo);
        return map;
    }

    @RequestMapping(value = "/editIsShow")
    @ResponseBody
    public Object editIsShow() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        PageData epd = new PageData();
        epd.put("ISSHOW", '0');
        epd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        videomanagerService.editIsShowBycorpinfoid(epd);    //根据ID读取

        pd.put("ISSHOW", '1');
        videomanagerService.editIsShow(pd);    //根据ID读取
        map.put("pd", pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 去修改页面获取数据
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/goEdit")
//	// @RequiresPermissions("videomanager:edit")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "去修改页面获取数据")
    public Object goEdit() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        pd = videomanagerService.findById(pd);    //根据ID读取
        map.put("pd", pd);
        map.put("result", errInfo);
        return map;
    }

    @RequestMapping(value = "/govideo")
    @ResponseBody
    public Object govideo() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = this.getPageData();
        pd = videomanagerService.findById(pd);    //根据ID读取
        List<PageData> varList = tokenService.listAll(pd);
        pd.put("token", varList.get(0).getString("TOKEN"));
        map.put("pd", pd);
        map.put("result", errInfo);
        return map;
    }

    @RequestMapping(value = "/govideoall")
    @ResponseBody
    public Object govideoall() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        List<PageData> videoList = videomanagerService.listAll(pd);    //根据ID读取
        String videostr = "";
        for (PageData video : videoList) {
            videostr += video.getString("VIDEOURL") + ",";
        }
        List<PageData> varList = tokenService.listAll(pd);
        pd.put("token", varList.get(0).getString("TOKEN"));
        map.put("pd", pd);
        map.put("videostr", videostr.substring(0, videostr.length() - 1));
        map.put("count", videoList.size());
        map.put("result", errInfo);
        return map;
    }

    /**
     * 批量删除
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/deleteAll")
    // @RequiresPermissions("videomanager:del")
    @ResponseBody
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "批量删除")
    public Object deleteAll() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        String DATA_IDS = pd.getString("DATA_IDS");
        if (Tools.notEmpty(DATA_IDS)) {
            String ArrayDATA_IDS[] = DATA_IDS.split(",");
            videomanagerService.deleteAll(ArrayDATA_IDS);
            errInfo = "success";
        } else {
            errInfo = "error";
        }
        map.put("result", errInfo);                //返回结果
        return map;
    }

    /**
     * 导出到excel
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/excel")
    // @RequiresPermissions("toExcel")
    @LogAnno(menuType = "监测预警", menuServer = "视频管理", instructionsOperate = "视频维护", instructionsType = "导出到excel")
    public ModelAndView exportExcel() throws Exception {
        ModelAndView mv = new ModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        Map<String, Object> dataMap = new HashMap<String, Object>();
        List<String> titles = new ArrayList<String>();
        titles.add("企业ID");    //1
        titles.add("视频名称");    //2
        titles.add("播放地址");    //3
        titles.add("操作日期");    //4
        titles.add("操作人");    //5
        titles.add("是否删除");    //6
        dataMap.put("titles", titles);
        List<PageData> varOList = videomanagerService.listAll(pd);
        List<PageData> varList = new ArrayList<PageData>();
        for (int i = 0; i < varOList.size(); i++) {
            PageData vpd = new PageData();
            vpd.put("var1", varOList.get(i).getString("CORPINFO_ID"));        //1
            vpd.put("var2", varOList.get(i).getString("VIDEONAME"));        //2
            vpd.put("var3", varOList.get(i).getString("VIDEOURL"));        //3
            vpd.put("var4", varOList.get(i).getString("OPDATE"));        //4
            vpd.put("var5", varOList.get(i).getString("OPUSER"));        //5
            vpd.put("var6", varOList.get(i).getString("ISDELETE"));        //6
            varList.add(vpd);
        }
        dataMap.put("varList", varList);
        ObjectExcelView erv = new ObjectExcelView();
        mv = new ModelAndView(erv, dataMap);
        return mv;
    }

    // 摄像头点播密钥
    @RequestMapping(value = "/setVideoPassWord")
    @ResponseBody
    public ReturnMap setVideoPassWord() {
        PageData pageData = getPageData();
        String source = pageData.getString("SOURCE");
        String key = new SimpleHash("SHA-1", source, "666666").toString();
        pageData.put("PASSWORD", key);
        pageData.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        initPageDataUtil.initSave(pageData);
        videomanagerService.setVideoPassWord(pageData);
        return ReturnMap.ok();
    }

    // 校验摄像头点播密钥
    @RequestMapping(value = "/verifyVideoPassWord")
    @ResponseBody
    public ReturnMap verifyVideoPassWord() {
        if (Jurisdiction.getSession().getAttribute("VIEDOPASS") != null && "1".equals(Jurisdiction.getSession().getAttribute("VIEDOPASS"))) {
            return ReturnMap.ok();
        }
        PageData pageData = getPageData();
        String source = pageData.getString("SOURCE");
        String key = new SimpleHash("SHA-1", source, "666666").toString();
        pageData.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        PageData videoPass = videomanagerService.getVideoPassWordByCorp(pageData);
        if (videoPass == null) {
            return ReturnMap.error("请联系管理员配置摄像头二级密码");
        }
        if (key.equals(videoPass.getString("PASSWORD"))) {
            Jurisdiction.getSession().setAttribute("VIEDOPASS", '1');
            return ReturnMap.ok();
        }
        return ReturnMap.error("密码错误");
    }
}
