package com.engine.recruit.service.impl;

import com.engine.core.impl.Service;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.conn.RecruitDataMap;
import com.engine.recruit.conn.RecruitRecordSet;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.entity.record.ApplicantRecordPo;
import com.engine.recruit.enums.EntryStatusEnum;
import com.engine.recruit.enums.InfoCollectEnum;
import com.engine.recruit.enums.PositionOperateEnum;
import com.engine.recruit.enums.RecordOperateEnum;
import com.engine.recruit.exception.CustomizeRunTimeException;
import com.engine.recruit.service.InductionManageService;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.general.Util;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author:dxfeng
 * @createTime: 2023/10/23
 * @version: 1.0
 */
public class InductionManageServiceImpl extends Service implements InductionManageService {

    @Override
    public Map<String, Object> updateInductionManageInfo(Map<String, Object> param) {
        String operateType = Util.null2String(param.get("operateType"));

        if (PositionOperateEnum.PREPARE.getOperateType().equals(operateType)) {
            // 发起入职准备

            // 反填流程信息到建模表

        }
        return null;
    }

    @Override
    public Map<String, Object> sendCollectInfo(Map<String, Object> param) {
        String ids = Util.null2String(param.get("ids"));
        String[] split = ids.split(",");
        if (StringUtils.isBlank(RecruitConstant.MOBILE_APPID_COLLECT)) {
            throw new CustomizeRunTimeException("未获取到对应移动建模ID，请检查配置文件");
        }
        RecordSet rs = new RecordSet();
        rs.executeQuery("select noLoginUser from mobileappbaseinfo where id = ?", RecruitConstant.MOBILE_APPID_COLLECT);
        int creator = -1;
        if (rs.next()) {
            creator = rs.getInt("noLoginUser");
        }
        if (-1 == creator) {
            throw new CustomizeRunTimeException("未配置免登陆访问用户，请检查移动建模应用配置");
        }

        // 查询信息采集模板内容
        rs.executeQuery("select yjnr,yjzt from uf_jcl_yjtzmb where mblx = 3 and zt = 0");
        String yjnr = "";
        String yjzt = "";
        if (rs.next()) {
            yjnr = rs.getString("yjnr");
            yjzt = rs.getString("yjzt");
        }
        if (StringUtils.isBlank(yjnr)) {
            throw new CustomizeRunTimeException("未获取到信息采集邮件通知模板");
        }
        // 查询字段信息
        List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_rzgl");
        Map<String, List<Formfield>> fieldMapList = fieldList.stream().collect(Collectors.groupingBy(Formfield::getLabelName));

        for (String billId : split) {
            // 查询当前数据字段值
            rs.executeQuery("select * from uf_jcl_rzgl where id = ? ", billId);
            Map<String, Object> mainDataMap = RecruitRecordSet.getSingleRecordMap(rs);


            // 根据入职管理信息完善信息采集表单
            Map<String, Object> dataMap = new RecruitDataMap<>();
            String uuid = UUID.randomUUID().toString();
            dataMap.put("modeuuid", uuid);
            int formModeId = ApplicantCommonInfo.getModeIdByTableName("uf_jcl_xxcj");
            dataMap.put("formmodeid", formModeId);
            // 构建建模表基本数据
            RecruitRecordSet.buildModeInsertFields(dataMap, creator);
            dataMap.put("xm", RecruitModeUtil.parseBlankToNull(mainDataMap.get("xm")));
            dataMap.put("sfzh", RecruitModeUtil.parseBlankToNull(mainDataMap.get("sfzh")));
            dataMap.put("nl", RecruitModeUtil.parseBlankToNull(mainDataMap.get("nl")));
            dataMap.put("xb", RecruitModeUtil.parseBlankToNull(mainDataMap.get("xb")));
            dataMap.put("sjh", RecruitModeUtil.parseBlankToNull(mainDataMap.get("sjhm")));
            dataMap.put("yx", RecruitModeUtil.parseBlankToNull(mainDataMap.get("dzyx")));

            String xxcjid = Util.null2String(mainDataMap.get("xxcjid"));
            String password = "";
            // 已发送信息采集通知的可以继续发送邮件通知，沿用原先的账号、密码
            if (StringUtils.isNotBlank(xxcjid)) {
                // 查询密码、手机号，取信息采集表存储的账号、密码
                rs.executeQuery("select mm, sjh from uf_jcl_xxcj where id = ?", xxcjid);
                if(rs.next()){
                    password = rs.getString("mm");
                    mainDataMap.put("sjhm", RecruitModeUtil.parseBlankToNull(rs.getString("sjh")));
                }
            }
            // 如果密码为空，则创建信息采集数据
            if (StringUtils.isBlank(password)) {
                // 生成登录密码
                password = generatePassword();
                dataMap.put("mm", password);

                dataMap.put("modedatastatus", "1");
                // 插入数据
                RecruitRecordSet.insertData(dataMap, "uf_jcl_xxcj");

                int id = RecruitRecordSet.refreshRight(uuid, "uf_jcl_xxcj", formModeId, creator);
                xxcjid = String.valueOf(id);
                // 更新状态为已发送,反填信息采集ID
                rs.executeUpdate("update uf_jcl_rzgl set xxcj = ? ,xxcjid = ? where id = ? ", InfoCollectEnum.HAS_SENT.getId(), id, billId);
            }

            String smsContent;
            String emailContent;
            // 发送短信
            String mobile = Util.null2String(dataMap.get("sjh"));
            String email = Util.null2String(dataMap.get("yx"));

            String messageLink = RecruitConstant.COLLECT_MESSAGE_LINK;
            //messageLink += "&billId=" + id;

            yjnr = yjnr.replace("{初始密码}", password);

            smsContent = yjnr.replace("{链接地址}", messageLink);
            smsContent = RecruitModeUtil.getReplaceContent(smsContent, fieldMapList, mainDataMap);

            if (StringUtils.isNotBlank(messageLink)) {
                messageLink = "<span><a href='" + messageLink + "'  target='_blank'>链接地址</a></span>";
            }
            emailContent = yjnr.replace("{链接地址}", messageLink);
            emailContent = RecruitModeUtil.getReplaceContent(emailContent, fieldMapList, mainDataMap);
            // 发送邮件
            RecruitMessageUtils.sendEmail(email, yjzt, emailContent);
            // 发送短信
            RecruitMessageUtils.sendSMS(mobile, smsContent);


            // 记录应聘过程
            rs.executeQuery("select pcid from uf_jcl_rzgl where id = ? ", billId);
            String pcid = "";
            if (rs.next()) {
                pcid = rs.getString("pcid");
            }
            Map<String, Object> otherParam = new HashMap<>();
            otherParam.put("createName", user.getLastname());
            otherParam.put("pcid", pcid);
            ApplicantRecordPo recordPo = ApplicantRecordPo.builder()
                    .billId(xxcjid)
                    .operateTime(DateUtil.getDateTime())
                    .modeId(String.valueOf(formModeId))
                    .formId(String.valueOf(ApplicantCommonInfo.getFormIdByTableName("uf_jcl_xxcj")))
                    .user(user)
                    .recordOperateType(RecordOperateEnum.INFO_COLLECT)
                    .otherParam(otherParam)
                    .build();
            recordPo.execute();
        }

        return null;
    }

    @Override
    public Map<String, Object> verifyIDCard(Map<String, Object> params) {
        RecordSet rs = new RecordSet();
        String sfzh = Util.null2String(params.get("sfzh"));
        String rzzt = Util.null2String(params.get("rzzt"));
        String billId = Util.null2String(params.get("billId"));
        // 根据身份证号，判定，只能有一个状态为待入职的数据
        if (EntryStatusEnum.PENDING.getValue().equals(rzzt)) {
            rs.executeQuery("select count(id) as num from uf_jcl_rzgl where sfzh = ? and id != ? and rzzt = ? ", sfzh, billId, rzzt);
            int countNum = 0;
            if (rs.next()) {
                countNum = rs.getInt("num");
            }
            if (countNum > 0) {
                throw new CustomizeRunTimeException("当前身份证号已存在待入职状态数据");
            }
        }
        return new HashMap<>();
    }

    @Override
    public Map<String, Object> checkLoginInfo(Map<String, Object> param) {
        RecordSet rs = new RecordSet();
        HashMap<String, Object> map = new HashMap<>(2);
        String mobile = Util.null2String(param.get("mobile"));
        String pwd = Util.null2String(param.get("pwd"));
        rs.executeQuery("select id from uf_jcl_xxcj where sjh = ? and mm = ?", mobile, pwd);
        String xxcjId = "";
        if (rs.next()) {
            xxcjId = rs.getString("id");
        } else {
            throw new CustomizeRunTimeException("手机号或密码错误");
        }

        // 校验当前链接的有效期
        rs.executeQuery("select * from uf_jcl_rzgl where xxcjid = ? ", xxcjId);
        if (rs.next()) {
            // 当前关联入职已取消入职/已入职；点击提示当前链接已失效，且不可操作
            String entryStatus = rs.getString("rzzt");
            if ("1".equals(entryStatus) || "2".equals(entryStatus)) {
                throw new CustomizeRunTimeException("当前链接已失效");
            }
            // 当前信息采集链接的地址默认有效期为发出日期～预计入职日期
            String date = rs.getString("yjrzrq");
            int compDate = DateUtil.compDate(DateUtil.getCurrentDate(), date);
            if (compDate < 0) {
                throw new CustomizeRunTimeException("当前链接已失效");
            }
        }
        map.put("id", xxcjId);
        return map;
    }

    @Override
    public Map<String, Object> infoSubmit(String id) {
        RecordSet rs = new RecordSet();
        rs.executeUpdate("update uf_jcl_rzgl set xxcj = 3 where xxcjid = ?", id);
        return null;
    }

    /**
     * 随机八位不重复登录密码，含数字、字母
     *
     * @return 登录密码
     */
    private String generatePassword() {
        String letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String numbers = "0123456789";
        String characters = letters + numbers;

        List<Character> randomChars = new ArrayList<>();
        Random random = new Random();

        // 随机取得一个字母
        randomChars.add(letters.charAt(random.nextInt(letters.length())));

        // 随机取得一个数字
        randomChars.add(numbers.charAt(random.nextInt(numbers.length())));

        // 随机取得六个字符（字母或数字）
        for (int i = 0; i < 6; i++) {
            randomChars.add(characters.charAt(random.nextInt(characters.length())));
        }

        // 打乱字符的顺序
        Collections.shuffle(randomChars);

        // 将字符列表转为字符串
        StringBuilder sb = new StringBuilder();
        for (char c : randomChars) {
            sb.append(c);
        }

        return sb.toString();
    }
}
