package weaver.formmode.recruit.modeexpand.interview;

import com.engine.common.util.ServiceUtil;
import com.engine.recruit.constant.RecruitConstant;
import com.engine.recruit.conn.ApplicantCommonInfo;
import com.engine.recruit.entity.workplan.WorkPlanCreateParams;
import com.engine.recruit.service.impl.WorkPlanServiceImpl;
import com.engine.recruit.util.RecruitMessageUtils;
import com.weaver.formmodel.data.model.Formfield;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.formmode.customjavacode.AbstractModeExpandJavaCodeNew;
import weaver.formmode.recruit.modeexpand.util.RecruitModeUtil;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.soa.workflow.request.*;

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

/**
 * <p>聚才林招聘</p>
 * 批量面试推送面试评价
 *
 * @author:dxfeng
 * @createTime: 2023/09/22
 * @version: 1.0
 */
public class BatchAddInterviewResultModeExpand extends AbstractModeExpandJavaCodeNew {
    private static final String MODE_TABLE_NAME = "uf_jcl_ms";


    @Override
    public Map<String, String> doModeExpand(Map<String, Object> param) {
        Map<String, String> result = new HashMap<>();
        try {
            RequestInfo requestInfo = (RequestInfo) param.get("RequestInfo");
            if (requestInfo != null) {
                RecordSet rs = new RecordSet();
                int formModeId = ApplicantCommonInfo.getModeIdByTableName(MODE_TABLE_NAME);
                int formIdByTableName = ApplicantCommonInfo.getFormIdByTableName(MODE_TABLE_NAME);
                MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
                Property[] properties = mainTableInfo.getProperty();
                Map<String, Object> mainDataMap = new HashMap<>();
                for (Property property : properties) {
                    mainDataMap.put(property.getName(), RecruitModeUtil.parseBlankToNull(property.getValue()));
                }

                // 需要应聘者反馈
                boolean needFeedback = "1".equals(Util.null2String(mainDataMap.get("sfxyfk")));

                User user = (User) param.get("user");
                // 填充建模数据基本信息
                mainDataMap.put("formmodeid", formModeId);
                mainDataMap.put("modedatacreater", user.getUID());
                String dateTime = DateUtil.getFullDate();
                String[] split = dateTime.split(" ");
                mainDataMap.put("modedatacreatedate", split[0]);
                mainDataMap.put("modedatacreatetime", split[1]);
                mainDataMap.put("modedatamodifier", null);
                mainDataMap.put("modedatamodifydatetime", null);
                mainDataMap.put("modedatacreatertype", "0");

                //mainDataMap.put("bsapid", requestInfo.getRequestid());

                List<Map<String, Object>> detailMapList = new ArrayList<>();
                DetailTableInfo detailTableInfo = requestInfo.getDetailTableInfo();
                DetailTable detailTable = detailTableInfo.getDetailTable(0);
                Row[] rows = detailTable.getRow();
                for (Row row : rows) {
                    Map<String, Object> detailDataMap = new HashMap<>(mainDataMap);
                    Cell[] cells = row.getCell();
                    for (Cell cell : cells) {
                        detailDataMap.put(cell.getName(), RecruitModeUtil.parseBlankToNull(cell.getValue()));
                    }
                    detailMapList.add(detailDataMap);
                }

                String tzypz = Util.null2String(mainDataMap.get("tzypz"));
                String yjnr = Util.null2String(mainDataMap.get("yjnr"));
                String yjtzmb = Util.null2String(mainDataMap.get("yjtzmb"));
                List<String> sendTypeList = Arrays.asList(tzypz.split(","));
                boolean sendEmail = sendTypeList.contains("0");
                boolean sendSms = sendTypeList.contains("1");
                String emailTitle = RecruitModeUtil.getEmailTitle(yjtzmb);

                List<Formfield> fieldList = RecruitModeUtil.getFieldList("uf_jcl_plapms");
                Map<String, List<Formfield>> fieldMapList = fieldList.stream().collect(Collectors.groupingBy(Formfield::getLabelName));
                String insertSql = "insert into " + MODE_TABLE_NAME + " (modeuuid, modedatacreatertype, formmodeid, modedatacreater, modedatacreatedate, modedatacreatetime, modedatamodifier, modedatamodifydatetime, pcid, ypz, ypzw, tdsj, sjhm, dzyx, tzypz, msfs, mshj, msc, msg, ptmsg, ptmsgsfcymspj, msrq, zt) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                StringBuilder msgBuilder = new StringBuilder();
                String msg = Util.null2String(mainDataMap.get("msg"));
                String ptmsg = Util.null2String(mainDataMap.get("ptmsg"));
                Set<String> userIdSet = new HashSet<>();
                userIdSet.addAll(Arrays.asList(msg.split(",")));
                userIdSet.addAll(Arrays.asList(ptmsg.split(",")));
                String msfsValue = ApplicantCommonInfo.getSelectName(String.valueOf(formIdByTableName), "msfs", Util.null2String(mainDataMap.get("msfs")));

                for (Map<String, Object> detailDataMap : detailMapList) {
                    List<Object> paramList = buildParamList(detailDataMap);
                    if (CollectionUtils.isNotEmpty(paramList)) {
                        String uuid = UUID.randomUUID().toString();
                        paramList.add(0, uuid);
                        rs.executeUpdate(insertSql, paramList);
                        rs.executeQuery("select id from " + MODE_TABLE_NAME + " where modeuuid='" + uuid + "'");
                        if (rs.next()) {
                            // 权限重构
                            int bid = Util.getIntValue(rs.getString("id"));
                            ModeRightInfo modeRightInfo = new ModeRightInfo();
                            modeRightInfo.setNewRight(true);
                            modeRightInfo.editModeDataShare(user.getUID(), formModeId, bid);
                            getApplicantsInfo(msgBuilder, Util.null2String(detailDataMap.get("ypz")), Util.null2String(detailDataMap.get("ypzw")));
                            // 创建面试评价反馈数据
                            InterviewEvaluate.createEvaluate(detailDataMap, bid, user);

                            // 创建日程
                            WorkPlanCreateParams workPlanCreateParams = new WorkPlanCreateParams();
                            workPlanCreateParams.setWorkPlanType("0");
                            // ypzValue + "-" + ypzwValue + "-" + msfsValue
                            String ypzValue = ApplicantCommonInfo.getApplicantName(Util.null2String(detailDataMap.get("ypz")));
                            String ypzwValue = ApplicantCommonInfo.getApplicantPosition(Util.null2String(detailDataMap.get("ypzw")));
                            workPlanCreateParams.setPlanName(ypzValue + "-" + ypzwValue + "-" + msfsValue);
                            workPlanCreateParams.setMemberIds(StringUtils.join(userIdSet,","));
                            workPlanCreateParams.setUrgentLevel("1");
                            workPlanCreateParams.setBeginDateTime(Util.null2String(detailDataMap.get("msrq")));
                            workPlanCreateParams.setOperateType("arrange");
                            workPlanCreateParams.setBillId(String.valueOf(bid));
                            ServiceUtil.getService(WorkPlanServiceImpl.class, user).operate(workPlanCreateParams);
                        }

                        // 发送邮件
                        String msgContent = RecruitModeUtil.getReplaceContent(yjnr, fieldMapList, detailDataMap);
                        String yx = Util.null2String(detailDataMap.get("dzyx"));
                        String sjh = Util.null2String(detailDataMap.get("sjhm"));
                        if (sendEmail) {
                            if (needFeedback) {
                                String confirmUrl = RecruitConstant.INTERVIEW_FEEDBACK_URL + "?uuid=" + uuid;
                                String emailContent = "<div style=\"border:3px solid silver;width:635px;height:55px;line-height:55px;font-family:'microsoft Yahei';font-size:18px;font-weight:bold;color:#333;padding-left:10px\">请您答复是否参加此次邀请？ <a href=\"" + confirmUrl + "&status=0\" style=\"text-decoration:underline;color:#0000cc;margin-right:10px\">参加</a> <a href=\"" + confirmUrl + "&status=1\" style=\"text-decoration:underline;color:#0000cc;\">不参加</a></div>";
                                // 邮件内容拼接确认信息
                                emailContent = msgContent + emailContent;
                                RecruitMessageUtils.sendEmail(yx, emailTitle, emailContent);
                            } else {
                                RecruitMessageUtils.sendEmail(yx, emailTitle, msgContent);
                            }

                        }
                        if (sendSms) {
                            RecruitMessageUtils.sendSMS(sjh, msgContent);
                        }
                    }


                }
                if (StringUtils.isNotBlank(msgBuilder)) {
                    msgBuilder.insert(0, RecruitModeUtil.getResourceNames(requestInfo.getCreatorid()) + "安排了一场面试<br/>");
                    String msrq = Util.null2String(mainDataMap.get("msrq"));

                    String msdd = Util.null2String(mainDataMap.get("msdd"));
                    msgBuilder.append("面试时间：").append(msrq).append("；面试官：").append(RecruitModeUtil.getResourceNames(msg)).append("，").append(RecruitModeUtil.getResourceNames(ptmsg)).append("<br/>");
                    msgBuilder.append("面试方式：").append(msfsValue).append("<br/>");
                    msgBuilder.append("面试地址：").append(msdd);

                    // 消息发送
                    RecruitModeUtil.messagePush(RecruitConstant.INTERVIEW_MESSAGE_TYPE, RecruitConstant.INTERVIEW_ADD_MESSAGE_TITLE, msgBuilder.toString(), userIdSet, user.getUID());
                }
            }
        } catch (Exception e) {
            new BaseBean().writeLog(e);
            result.put("errmsg", e.getMessage());
            result.put("flag", "false");
        }
        return result;
    }


    /**
     * 构建批量插入数据集合
     *
     * @param map 表单参数
     */
    private List<Object> buildParamList(Map<String, Object> map) {
        List<Object> param = new ArrayList<>();
        // 填充建模表相关字段
        param.add(map.get("modedatacreatertype"));
        param.add(map.get("formmodeid"));
        param.add(map.get("modedatacreater"));
        param.add(map.get("modedatacreatedate"));
        param.add(map.get("modedatacreatetime"));
        param.add(map.get("modedatamodifier"));
        param.add(map.get("modedatamodifydatetime"));

        // 表单字段
        // 批次ID
        param.add(map.get("pcid"));
        // 应聘者
        param.add(map.get("ypz"));
        // 投递职位
        param.add(map.get("ypzw"));
        // 投递时间
        param.add(map.get("tdsj"));
        // 手机号码
        param.add(map.get("sjhm"));
        // 电子邮箱
        param.add(map.get("dzyx"));
        // 通知应聘者
        param.add(map.get("tzypz"));
        // 面试方式
        param.add(map.get("msfs"));
        // 面试环节
        param.add(map.get("mshj"));
        // 面试轮次
        param.add(map.get("msc"));
        // 面试官
        param.add(map.get("msg"));
        // 陪同面试官
        param.add(map.get("ptmsg"));
        // 陪同面试官是否参与面试评价
        param.add(map.get("ptmsgsfcymspj"));
        // 面试日期
        param.add(map.get("msrq"));
        // 面试状态,默认值：待面试
        param.add("0");

        return param;
    }


    /**
     * 获取应聘者信息
     *
     * @param msgBuilder  消息内容
     * @param applicantId 应聘者ID
     * @param positionId  应聘职位ID
     */
    private void getApplicantsInfo(StringBuilder msgBuilder, String applicantId, String positionId) {
        if (StringUtils.isAnyBlank(applicantId, positionId)) {
            return;
        }
        RecordSet rs = new RecordSet();
        rs.executeQuery("select xm from uf_jcl_yppc where id = ?", applicantId);
        if (rs.next()) {
            msgBuilder.append("应聘者：").append(rs.getString("xm"));
        }
        rs.executeQuery("select zpzwmc from uf_jcl_zp_zpzw where id = ?", positionId);
        if (rs.next()) {
            msgBuilder.append("；应聘职位：").append(rs.getString("zpzwmc"));
        }
        msgBuilder.append("<br/>");
    }
}
