package cn.timer.api.controller.htzz;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

import cn.timer.api.utils.aliyun.OSSUtil;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import io.swagger.models.auth.In;
import org.bouncycastle.util.encoders.UrlBase64Encoder;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.UrlEncoded;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;

import cn.hutool.core.util.StrUtil;
import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import cn.timer.api.bean.htzz.HtzzAdminZzda;
import cn.timer.api.bean.htzz.HtzzAssoHtgx;
import cn.timer.api.bean.htzz.HtzzAssoZztx;
import cn.timer.api.bean.qyzx.businessService.QyzxRemainingQuantity;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.dao.htzz.HtzzAdminZzdaMapper;
import cn.timer.api.dto.htzz.HtzzQueryDto;
import cn.timer.api.dto.htzz.NotifyPersonDto;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Api(tags = "7.0合同证照")
@RestController
@Transactional
@RequestMapping(value = "/htzz", produces = {"application/json"})
public class HtzzController {

    @Autowired
    private HtzzAdminZzdaMapper htzzAdminZzdaMapper;
    @Autowired
    private OSSUtil oss;
    @Value("${config-8timer.Aliyun.project_package}")
    private String project_package;
    @Value("${zip.path}")
    private String zipPath;
    @Value("${config-8timer.Aliyun.endpoint}")
    private String endpoint;

    @Value("${sftp.client.root}")
    private String root;

    @Value("${sftp.client.targetPath}")
    private String targetPath;

    @Value("${sftp.client.serverUrl}")
    private String serverUrl;


    /**
     * 新增证件
     *
     * @param userBean
     * @param htzzAdminZzda 证照档案实体
     * @return 新增证件结果
     */
    @PostMapping("/addzj")
    @ApiOperation(value = "新增合同证件", httpMethod = "POST", notes = "接口发布说明")
    public Result<Object> addzj(@CurrentUser UserBean userBean, @RequestBody HtzzAdminZzda zzda) {
        Integer orgCode = userBean.getOrgCode();

        QyzxRemainingQuantity quantity = QyzxRemainingQuantity.builder().build().selectOne(
                new LambdaQueryWrapper<QyzxRemainingQuantity>().eq(QyzxRemainingQuantity::getOrgCode, orgCode)
                        .eq(QyzxRemainingQuantity::getPmid, 1).gt(QyzxRemainingQuantity::getRemainder, 0));
        Date date = null;
        Integer remainder = null;
        if (quantity != null) {
            remainder = quantity.getRemainder();
            date = quantity.getExpireDate();
        }
        if (quantity == null || remainder == null || remainder <= 0) { // 判断充了钱没
            return ResultUtil.error("请充值后使用短信功能!");
        }
        if (date != null && date.getTime() <= new Date().getTime()) {
            Logoutput("企业 " + orgCode + " :短信套餐已过期");
//			return ResultUtil.error("短信套餐已到期!");
        }
        if (zzda.getId() == null) {
            zzda.setTxkgType(1);//默认开启提醒
        }
        zzda.setLrrid(userBean.getEmpNum());
        zzda.setLrsjTime(new Date());
        zzda.setOrgCode(orgCode);

        zzda.setSendingStatus(0);//0:未发;1:已发
        zzda.setTemplateId(zzda.getTemplateId());//消息模板id
//		zzda.insert();
        zzda.insertOrUpdate();

        /**
         * 新增通知关系表,每人一个
         */
        List<NotifyPersonDto> ids = zzda.getIds();//通知人    用户id+手机号码
        List<HtzzAssoHtgx> htgxs = Lists.newArrayList();
        for (NotifyPersonDto pre : ids) {
//            HtzzAssoHtgx.builder().build().delete(new QueryWrapper<HtzzAssoHtgx>().lambda().eq(HtzzAssoHtgx::getOrgCode, orgCode).eq(HtzzAssoHtgx::getTzrid, pre.getEmpNum())
//                    .eq(HtzzAssoHtgx::getPhone, pre.getPhone()));
            HtzzAssoHtgx htgx = HtzzAssoHtgx.builder().build().selectOne(new QueryWrapper<HtzzAssoHtgx>().lambda().eq(HtzzAssoHtgx::getOrgCode, orgCode).eq(HtzzAssoHtgx::getTzrid, pre.getEmpNum())
                    .eq(HtzzAssoHtgx::getPhone, pre.getPhone()).eq(HtzzAssoHtgx::getHtid,zzda.getId()));
            if (htgx == null) {
                htgx = HtzzAssoHtgx.builder().build();
            }
            htgx.setHtid(zzda.getId());
            htgx.setTzrid(pre.getEmpNum());
            htgx.setName(pre.getEmpName());
            htgx.setPhone(pre.getPhone());
            htgx.setOrgCode(orgCode);
            htgx.insertOrUpdate();
            htgxs.add(htgx);
        }
        HtzzAssoZztx zztx = zzda.getZztx();
        zztx.setZzdaId(zzda.getId());
        zztx.setOrgCode(orgCode);
        zztx.setLrrid(userBean.getEmpNum());
        zztx.setLrsjTime(new Date());
        zztx.insertOrUpdate();

        return ResultUtil.datas(zzda, htgxs, "新增证件成功!");
    }

    @GetMapping("/modifytx/{id}")
    @ApiOperation(value = "修改提醒数据", httpMethod = "GET", notes = "接口发布说明")
    public Result<Object> modifytx(@CurrentUser UserBean userBean, @PathVariable Integer id) {


        List<NotifyPersonDto> tzids = new ArrayList<NotifyPersonDto>();
        List<HtzzAssoHtgx> httxs = HtzzAssoHtgx.builder().build().selectList(new QueryWrapper<HtzzAssoHtgx>().lambda().eq(HtzzAssoHtgx::getHtid, id));
        for (HtzzAssoHtgx gx : httxs) {
            NotifyPersonDto predto = NotifyPersonDto.builder().build();
            predto.setEmpName(gx.getName());
            predto.setEmpNum(gx.getTzrid());
            predto.setPhone(gx.getPhone());
            tzids.add(predto);
        }

        HtzzAdminZzda zzda = HtzzAdminZzda.builder().id(id).build().selectById();
        HtzzAssoZztx zztx = HtzzAssoZztx.builder().build().selectOne(new QueryWrapper<HtzzAssoZztx>().lambda().eq(HtzzAssoZztx::getZzdaId, id));
        zzda.setZztx(zztx);
        zzda.setIds(tzids);

        return ResultUtil.data(zzda, "新增成功");
    }


    /**
     * 按条件搜索(关键字、到期时间)
     *
     * @param userBean
     * @return
     */
    @GetMapping("/queryht")
    @ApiOperation(value = "按条件搜索(关键字、到期时间)", httpMethod = "GET", notes = "接口发布说明")
    public Result<Object> queryht(@CurrentUser UserBean userBean, HtzzQueryDto htzzQueryDto) {
        String e = htzzQueryDto.getEndTime();
        String q = htzzQueryDto.getQuery();
        Page<HtzzAdminZzda> page = new Page<HtzzAdminZzda>(
                htzzQueryDto.getCurrentPage() == null ? 1 : htzzQueryDto.getCurrentPage(),
                htzzQueryDto.getTotalPage() == null ? 10 : htzzQueryDto.getTotalPage());

        QueryWrapper<HtzzAdminZzda> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("org_code", userBean.getOrgCode())
                .select("id", "zjmc", "czry", "fzjg", "fzrq", "yxdqr", "txkg_type").eq("is_delete", 0).eq("document_type", htzzQueryDto.getDocumentType())
                .gt(!StrUtil.hasBlank(e), "yxdqr", !StrUtil.hasBlank(e) ? e : "9999-01-01 00:00:00")
                .and(!StrUtil.hasBlank(q), wq -> wq.like("zjmc", q).or().like("czry", q)).orderByDesc("lrsj_time");

        IPage<HtzzAdminZzda> zPage = HtzzAdminZzda.builder().build().selectPage(page, queryWrapper);
        List<HtzzAdminZzda> zccrkgls = zPage.getRecords();
        zPage.getCurrent();
        zPage.getPages();
        zPage.getTotal();
        zPage.getSize();
        return ResultUtil.data(zPage, zccrkgls, "搜索成功");
    }

    /**
     * 根据id查合同
     *
     * @param id
     * @return
     */
    @PostMapping(value = "/queryHt/{id}")
    @ApiOperation(value = "根据id查合同", httpMethod = "POST", notes = "接口发布说明")
    public Result<Object> queryHt(@CurrentUser UserBean userBean, @PathVariable Integer id) {
        List<Object> list = new ArrayList<Object>();
        list.add(HtzzAdminZzda.builder().build().selectOne(new QueryWrapper<HtzzAdminZzda>()
                .eq("org_code", userBean.getOrgCode()).eq("is_delete", 0).eq("id", id)));
        QueryWrapper<HtzzAssoHtgx> q = new QueryWrapper<HtzzAssoHtgx>();
        q.select("id", "name").eq("htid", id);
        List<HtzzAssoHtgx> htgx = HtzzAssoHtgx.builder().build().selectList(q);
        for (HtzzAssoHtgx gx : htgx) {
            String name = gx.getName();
            list.add(name);
        }
        return ResultUtil.data(list);
    }

    /**
     * 根据id删除合同
     *
     * @param id
     * @return
     */
    @DeleteMapping(value = "/delHt")
    @ApiOperation(value = "根据id删除合同", httpMethod = "DELETE", notes = "接口发布说明")
    public Result<Object> delHt(@CurrentUser UserBean userBean, @RequestParam Integer htid) {
        // 删除提醒关系
        HtzzAssoHtgx.builder().build().delete(new QueryWrapper<HtzzAssoHtgx>().eq("org_code", userBean.getOrgCode()).eq("htid", htid));

        //删除证照提醒表配置
        HtzzAssoZztx.builder().build().delete(new QueryWrapper<HtzzAssoZztx>().lambda().eq(HtzzAssoZztx::getZzdaId, htid));

        // 设置证照删除状态
        return ResultUtil.data(HtzzAdminZzda.builder().id(htid).isDelete(1).build().updateById());
    }

    /**
     * 修改提醒状态
     *
     * @param id
     * @return
     */
    @PostMapping(value = "/changeTx")
    @ApiOperation(value = "修改提醒状态", httpMethod = "POST", notes = "接口发布说明")
    public Result<Object> changeTx(@CurrentUser UserBean userBean, @RequestParam Integer htid) {

        QueryWrapper<HtzzAdminZzda> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("txkg_type").eq("id", htid);
        HtzzAdminZzda zzda = HtzzAdminZzda.builder().build().selectOne(queryWrapper);

        UpdateWrapper<HtzzAdminZzda> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", htid);
        HtzzAdminZzda w = HtzzAdminZzda.builder().orgCode(userBean.getOrgCode()).id(htid)
                .txkgType(zzda.getTxkgType() == 0 ? 1 : 0).build();
        htzzAdminZzdaMapper.update(w, updateWrapper);
        return ResultUtil.success("修改成功");

    }

    /**
     * 查詢全部員工id、姓名
     *
     * @param id
     * @return
     */
    @GetMapping(value = "/queryYg")
    @ApiOperation(value = "查詢全部員工id、姓名", httpMethod = "GET", notes = "接口发布说明")
    public Result<Object> queryYg(@CurrentUser UserBean userBean) {
        return ResultUtil.data(YgglMainEmp.builder().build().selectList(
                new QueryWrapper<YgglMainEmp>().select("emp_num", "name", "phone").eq("org_code", userBean.getOrgCode())));
    }

    @GetMapping(value = "/test")
    @ApiOperation(value = "test", httpMethod = "GET", notes = "接口发布说明")
    public Result<Void> test(String schedulingPattern) {
        CronUtil.schedule("*/2 * * 24 * *", new Task() {
            @Override
            public void execute() {
                Logoutput("start:" + new Date());
            }
        });

        CronUtil.setMatchSecond(true);
        CronUtil.start();
        return ResultUtil.success("操作成功");
    }


    @Value("${config-8timer.environmental-science}")
    public String environmental_science;

    public void Logoutput(String science) {

        if (!("pro").equals(environmental_science)) {

            System.out.println(science);
        } else {
            System.out.println("");
        }
    }

    /**
     * @Author wgd
     * @Description 导出勾选的合同
     * @Date 2021/12/2 17:05
     **/
    @PostMapping(value = "/exportContract")
    public Result<Object> exportContract(@CurrentUser UserBean userBean, @RequestBody List<Integer> ids, HttpServletRequest request, HttpServletResponse resp) {
        if (ids.size() <= 0) {
            return ResultUtil.error("操作失败");
        }
        Map<String, String> url = Maps.newHashMap();
        Map<String, String> ftp = Maps.newHashMap();
        ids.forEach(i -> {
            HtzzAdminZzda htzzAdminZzda = HtzzAdminZzda.builder().id(i).build().selectById();
            if (StringUtil.isNotBlank(htzzAdminZzda.getZjfj())) {
                /*格式化获取文字*/
                String urla = UrlEncoded.decodeString(htzzAdminZzda.getZjfj());
                /*判断是保存在oss还是服务器*/
                if (urla.contains(endpoint.replace("http://", "."))) {
                    int index = urla.indexOf(project_package);
                    url.put(htzzAdminZzda.getId() + "_" + htzzAdminZzda.getZjmc(), urla.substring(index));
                } else {
                    //TODO 区分出云盘文件暂时不下载
                    StringBuffer newUrl = new StringBuffer(root).append(targetPath).append(urla.substring(serverUrl.length()));
                    ftp.put(htzzAdminZzda.getId() + "_" + htzzAdminZzda.getZjmc(), newUrl.toString());
                }
            }
        });
        String zipUrl = null;
        try {
            zipUrl = oss.createZip(url);
            return ResultUtil.data(zipUrl);
        } catch (IOException e) {
            e.printStackTrace();
            return ResultUtil.error("操作失败");
        }
    }

    @GetMapping(value = "/exportContract")
    public void exportContract(@CurrentUser UserBean userBean, @RequestParam("url") String url, HttpServletRequest request, HttpServletResponse resp) {
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        OutputStream os;
        File filePath = null;
        try {
            resp.setContentType("application/octet-stream");
            resp.setHeader("content-disposition", "attachment; filename=" + new String(url.getBytes("UTF8"), "ISO-8859-1"));
            resp.setCharacterEncoding("UTF-8");
            filePath = new File(zipPath + url);
            byte[] buffer = new byte[1024];
            fis = new FileInputStream(filePath);
            bis = new BufferedInputStream(fis);
            os = resp.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            filePath.delete();
        }
    }
}