package com.orgimport.service.action;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.api.browser.bean.SearchConditionItem;
import com.api.browser.util.ConditionFactory;
import com.api.browser.util.ConditionType;
import com.engine.organization.entity.extend.po.ExtendInfoPO;
import com.engine.organization.entity.jclimport.po.JclImportHistoryDetailPO;
import com.engine.organization.entity.staff.bo.StaffBO;
import com.engine.organization.entity.staff.param.StaffSearchParam;
import com.engine.organization.entity.staff.po.StaffPO;
import com.engine.organization.entity.staff.po.StaffPlanPO;
import com.engine.organization.mapper.comp.CompMapper;
import com.engine.organization.mapper.department.DepartmentMapper;
import com.engine.organization.mapper.job.JobMapper;
import com.engine.organization.mapper.staff.StaffMapper;
import com.engine.organization.mapper.staff.StaffPlanMapper;
import com.engine.organization.util.OrganizationAssert;
import com.engine.organization.util.db.MapperProxyFactory;
import com.engine.organization.util.relation.EcHrmRelationUtil;
import com.engine.organization.util.saveimport.OrgImportUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.file.ImageFileManager;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.systeminfo.SystemEnv;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author:dxfeng
 * @createTime: 2022/09/15
 * @version: 1.0
 */
public class StaffInfoImportUtil {
    static Map<String, ExtendInfoPO> importFieldsMap;

    static {
        importFieldsMap = new HashMap<>();
        importFieldsMap.put("方案编号", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("plan_no").fieldNameDesc("方案编号").isrequired(1).controlType(1).browserType("1").customValue("[\"input\",\"text\",\"100\"]").build());
        importFieldsMap.put("方案名称", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("plan_name").fieldNameDesc("方案名称").isrequired(0).controlType(1).browserType("1").customValue("[\"input\",\"text\",\"100\"]").build());
        importFieldsMap.put("分部", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("comp_id").fieldNameDesc("分部").isrequired(1).controlType(1).browserType("1").customValue("[\"input\",\"text\",\"100\"]").build());
        importFieldsMap.put("部门", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("dept_id").fieldNameDesc("部门").isrequired(0).controlType(1).browserType("1").customValue("[\"input\",\"text\",\"100\"]").build());
        importFieldsMap.put("岗位", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("job_id").fieldNameDesc("岗位").isrequired(0).controlType(1).browserType("1").customValue("[\"input\",\"text\",\"100\"]").build());
        importFieldsMap.put("编制数", ExtendInfoPO.builder().tableName("jcl_org_staff").fieldName("staff_num").fieldNameDesc("编制数").isrequired(1).controlType(1).browserType("2").customValue("[\"input\",\"int\"]").build());

    }

    public static Long saveImport(String operateType, String excelFile, User user) {
        Long importHistoryId = OrgImportUtil.saveImportLog("staff_info", operateType, user);
        JclImportHistoryDetailPO historyDetailPO;

        ImageFileManager manager = new ImageFileManager();
        manager.getImageFileInfoById(Util.getIntValue(excelFile));
        XSSFWorkbook workbook;
        try {
            workbook = new XSSFWorkbook(manager.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 当前sheet
        XSSFSheet sheetAt = workbook.getSheetAt(0);
        int lastRow = sheetAt.getLastRowNum();
        OrganizationAssert.isTrue(lastRow > 0, "导入数据为空");
        short lastCellNum = sheetAt.getRow(0).getLastCellNum();
        List<ExtendInfoPO> extendInfoPOS = new ArrayList<>();
        // 遍历每一行数据
        nextRow:
        for (int i = 0; i <= lastRow; i++) {
            historyDetailPO = new JclImportHistoryDetailPO();
            historyDetailPO.setPid(importHistoryId);
            XSSFRow row = sheetAt.getRow(i);
            // 组装待处理数据
            Map<String, Object> map = new HashMap<>();
            Long parentCompanyId = null;
            Long parentDepartmentId = null;
            Long parentJobId = null;
            StaffPlanPO staffPlanPO = null;

            historyDetailPO.setRowNums(String.valueOf(i + 1));
            for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {
                XSSFCell cell = row.getCell((short) cellIndex);
                String cellValue = OrgImportUtil.getCellValue(cell).trim();
                if (i == 0) {
                    // 首行 初始化字段信息
                    ExtendInfoPO extendInfoPO = importFieldsMap.get(cellValue);
                    extendInfoPOS.add(extendInfoPO);
                } else {
                    ExtendInfoPO infoPO = extendInfoPOS.get(cellIndex);
                    // 数据校验
                    if (infoPO.getIsrequired() == 1 && StringUtils.isBlank(cellValue)) {
                        historyDetailPO.setOperateDetail(infoPO.getFieldNameDesc() + "为必填项");
                        historyDetailPO.setStatus("0");
                        OrgImportUtil.saveImportDetailLog(historyDetailPO);
                        continue nextRow;
                    }

                    Object reallyValue;
                    try {
                        reallyValue = OrgImportUtil.getReallyValue(infoPO, cellValue);
                    } catch (Exception e) {
                        historyDetailPO.setOperateDetail(cellValue + "转换失败");
                        historyDetailPO.setStatus("0");
                        OrgImportUtil.saveImportDetailLog(historyDetailPO);
                        continue nextRow;
                    }

                    if (StringUtils.isNotBlank(cellValue) && StringUtils.isBlank(Util.null2String(reallyValue))) {
                        historyDetailPO.setOperateDetail(infoPO.getFieldNameDesc() + "数据转换失败,未找到对应数据");
                        historyDetailPO.setStatus("0");
                        OrgImportUtil.saveImportDetailLog(historyDetailPO);
                        continue nextRow;
                    }
                    map.put(infoPO.getFieldName(), reallyValue);
                    // 编制方案
                    if ("plan_no".equals(infoPO.getFieldName())) {
                        // 根据编制方案判断控制维度，控制必填
                        List<StaffPlanPO> staffPlanPOS = MapperProxyFactory.getProxy(StaffPlanMapper.class).listByNo(Util.null2String(reallyValue));
                        if (CollectionUtils.isNotEmpty(staffPlanPOS)) {
                            staffPlanPO = staffPlanPOS.get(0);
                            map.put("plan_id",staffPlanPO.getId());
                            historyDetailPO.setRelatedName(staffPlanPO.getPlanNo());
                        } else {
                            historyDetailPO.setOperateDetail("编号:" + reallyValue + ",未找到对应数据");
                            historyDetailPO.setStatus("0");
                            OrgImportUtil.saveImportDetailLog(historyDetailPO);
                            continue nextRow;
                        }
                    }
                    if (null == staffPlanPO) {
                        historyDetailPO.setOperateDetail("未找到对应数据");
                        historyDetailPO.setStatus("0");
                        OrgImportUtil.saveImportDetailLog(historyDetailPO);
                        continue nextRow;
                    }

                    // 分部
                    if ("comp_id".equals(infoPO.getFieldName())) {
                        String[] split = cellValue.split(">");
                        if (split.length > 0) {
                            if (split.length > 8) {
                                historyDetailPO.setOperateDetail("分部层级不能大于10");
                                historyDetailPO.setStatus("0");
                                OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                continue nextRow;
                            }
                            for (String s : split) {
                                parentCompanyId = MapperProxyFactory.getProxy(CompMapper.class).getIdByNameAndPid(s, parentCompanyId == null ? 0 : parentCompanyId);
                                if (null == parentCompanyId) {
                                    historyDetailPO.setOperateDetail(cellValue + "分部未找到对应数据");
                                    historyDetailPO.setStatus("0");
                                    OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                    continue nextRow;
                                }
                            }
                        }
                        map.put("comp_id", parentCompanyId);
                        map.put("ec_company", EcHrmRelationUtil.getEcCompanyId(Util.null2String(parentCompanyId)));
                    }
                    // 部门
                    if ("dept_id".equals(infoPO.getFieldName())) {
                        String[] split = cellValue.split(">");
                        if (split.length > 0) {
                            if (split.length > 8) {
                                historyDetailPO.setOperateDetail("部门层级不能大于10");
                                historyDetailPO.setStatus("0");
                                OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                continue nextRow;
                            }
                            for (String s : split) {
                                parentDepartmentId = MapperProxyFactory.getProxy(DepartmentMapper.class).getIdByNameAndPid(s, parentCompanyId, parentDepartmentId == null ? 0 : parentDepartmentId);
                                if (null == parentCompanyId) {
                                    historyDetailPO.setOperateDetail(cellValue + "部门未找到对应数据");
                                    historyDetailPO.setStatus("0");
                                    OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                    continue nextRow;
                                }
                            }
                        }

                        map.put("dept_id", parentDepartmentId);
                        if (null != parentDepartmentId) {
                            map.put("ec_department", EcHrmRelationUtil.getEcDepartmentId(Util.null2String(parentDepartmentId)));
                        }
                    }

                    // 岗位
                    if ("job_id".equals(infoPO.getFieldName()) && StringUtils.isNotBlank(cellValue)) {
                        if (null == parentCompanyId) {
                            historyDetailPO.setOperateDetail(cellValue + "所属分部未找到");
                            historyDetailPO.setStatus("0");
                            OrgImportUtil.saveImportDetailLog(historyDetailPO);
                            continue nextRow;
                        }
                        String[] split = cellValue.split(">");
                        if (split.length > 0) {
                            if (split.length > 8) {
                                historyDetailPO.setOperateDetail("岗位层级不能大于10");
                                historyDetailPO.setStatus("0");
                                OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                continue nextRow;
                            }
                            for (String s : split) {
                                parentJobId = MapperProxyFactory.getProxy(JobMapper.class).getIdByNameAndPid(s, parentCompanyId, parentDepartmentId == null ? 0 : parentDepartmentId, parentJobId == null ? 0 : parentJobId);
                                if (null == parentJobId) {
                                    historyDetailPO.setOperateDetail(s + "岗位未找到对应数据");
                                    historyDetailPO.setStatus("0");
                                    OrgImportUtil.saveImportDetailLog(historyDetailPO);
                                    continue nextRow;
                                }
                            }
                        }
                        map.put("job_id", parentJobId);
                    }

                }
            }
            // 校验、数据交互
            if (i == 0) {
                continue;
            }
            String controlDimension = staffPlanPO.getControlDimension();
            switch (controlDimension) {
                case "1":// 分部
                    OrganizationAssert.notNull(parentCompanyId, "编制维度选择分部时，分部必填！");
                    break;
                case "2":// 部门
                    OrganizationAssert.notNull(parentCompanyId, "编制维度选择部门时，分部必填！");
                    OrganizationAssert.notNull(parentDepartmentId, "编制维度选择部门时，部门必填！");
                    break;
                case "3": // 岗位
                    OrganizationAssert.notNull(parentCompanyId, "编制维度选择岗位时，分部必填！");
                    OrganizationAssert.notNull(parentDepartmentId, "编制维度选择岗位时，部门必填！");
                    OrganizationAssert.notNull(parentJobId, "编制维度选择岗位时，岗位必填！");
                    break;
                default:
                    break;
            }

            StaffSearchParam param = JSONObject.toJavaObject((JSON) JSONObject.toJSON(map), StaffSearchParam.class);
            StaffPO staffPO = StaffBO.convertParamToPO(param, (long) user.getUID());
            MapperProxyFactory.getProxy(StaffMapper.class).insertIgnoreNull(staffPO);

            historyDetailPO.setOperateDetail("添加成功");
            historyDetailPO.setStatus("1");
            OrgImportUtil.saveImportDetailLog(historyDetailPO);

        }
        return importHistoryId;
    }


    public static List<Map<String, Object>> importForm(User user) {
        // 返回导入数据
        List<Map<String, Object>> lsGroup = new ArrayList<>();
        Map<String, Object> groupItem = new HashMap<>();
        List<Object> itemList = new ArrayList<>();

        groupItem.put("title", SystemEnv.getHtmlLabelName(1361, user.getLanguage()));
        groupItem.put("defaultshow", true);

        SearchConditionItem searchConditionItem;
        ConditionFactory conditionFactory = new ConditionFactory(user);

        ////导入类型
        //List<SearchConditionOption> statusOptions = new ArrayList<>();
        //statusOptions.add(new SearchConditionOption("add", SystemEnv.getHtmlLabelName(611, user.getLanguage()), true));
        //statusOptions.add(new SearchConditionOption("update", SystemEnv.getHtmlLabelName(17744, user.getLanguage())));
        //searchConditionItem = conditionFactory.createCondition(ConditionType.SELECT, 24863, "importType", statusOptions);
        //searchConditionItem.setValue("add");
        //itemList.add(searchConditionItem);

        //模板文件
        searchConditionItem = conditionFactory.createCondition(ConditionType.INPUT, 28576, "templet");
        searchConditionItem.setValue("");
        itemList.add(searchConditionItem);

        //Excel文件
        searchConditionItem = conditionFactory.createCondition(ConditionType.RESOURCEIMG, 16630, "excelfile");
        itemList.add(searchConditionItem);

        groupItem.put("items", itemList);
        lsGroup.add(groupItem);


        itemList = new ArrayList<>();
        groupItem = new HashMap<>();
        groupItem.put("title", SystemEnv.getHtmlLabelName(33803, Util.getIntValue(user.getLanguage())));
        groupItem.put("defaultshow", true);
        List<Integer> lsPromptLabel = new ArrayList<>(); //提示信息
        lsPromptLabel.add(34275);
        lsPromptLabel.add(125452);

        for (int i = 0; i < lsPromptLabel.size(); i++) {
            Map<String, Object> item = new HashMap<>();
            item.put("index", (i + 1));
            String value = Util.toScreen(SystemEnv.getHtmlLabelName(lsPromptLabel.get(i), user.getLanguage()), user.getLanguage());
            if (i == 0) {
                value += SystemEnv.getHtmlLabelName(28576, user.getLanguage());
                item.put("link", "");
            }
            item.put("value", value);
            itemList.add(item);
        }
        groupItem.put("items", itemList);
        lsGroup.add(groupItem);
        return lsGroup;
    }
}
