package com.ruoyi.cms.util;

import com.ruoyi.common.utils.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class StringUtil {

    /*1101(求职者)、1102(招聘者)、1103(网格员)、1104(内部工作者)*/
    public static final Long COMPANY_ADMIN_ROLE_KEY = 1102L;

    /************************移动端角色开始***************************/
    /**
     * 移动端-企业用户
     */
    public static final String IS_COMPANY_USER = "0";
    /**
     * 移动端-求职者
     */
    public static final String IS_JOB_REQUEST_USER = "1";
    /**
     * 移动端-网格员
     */
    public static final String IS_GRID_USER = "2";
    /**
     * 移动端-内部工作者
     */
    public static final String IS_INTERNAL_USER = "3";
    /************************移动端角色结束***************************/
    /**
     * pc端-求职者
     */
    public static final String SYS_QZZ = "1101";
    /**
     * pc端-企业
     */
    public static final String SYS_QY = "1102";

    /**
     * 互联网用户头
     */
    public static final String USER_KEY="hlw_";

    /**
     * 岗位互联网
     */
    public static final String BASE_WW_GW="https://www.xjksly.cn/kashi/job-portal/detail/";

    /**
     *录用
     */
    public static final String HIRE_LY="0";

    /**
     *录用-系统
     */
    public static final String HIRE_SOURCE_SYSTEM="0";
    /**
     *录用-招聘会
     */
    public static final String HIRE_SOURCE_ZPH="1";
    /**
     * 标记
     */
    public static final boolean PATH_TEST_ENV = true;
    /**
     * 测试环境附件地址
     */
    public static final String PATH_DEV = "http://ks.zhaopinzao8dian.com/file/";
    /**
     * 正式环境环境地址
     */
    public static final String PATH_PROXY_37 = "http://10.98.80.37/file/";
    /**
     * 互联网
     */
    public static final String PATH_PROXY_50="https://www.xjksly.cn/file/";
    /**
     * 经办端
     */
    public static final String PATH_PROXY_146="http://10.98.80.146/file/";

    /**
     * 身份证规则
     */
    public static final String SFZ_VALID_REGEX="^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";

    /**
     * 学历转换
     */
    public static final Map<String, String> EDU_DESC_TO_CODE_MAP;
    /**
     * 组织机构转换
     */
    public static final Map<String, String> REGION_CODE_CODE_MAP;

    static {
        Map<String, String> tempMap = new HashMap<>();
        tempMap.put("中专及以上", "1");
        tempMap.put("高中及以上", "2");
        tempMap.put("大专及以上", "3");
        tempMap.put("本科及以上", "4");
        tempMap.put("硕士及以上", "5");
        EDU_DESC_TO_CODE_MAP = Collections.unmodifiableMap(tempMap);
    }

    static {
        Map<String, String> tempMap = new HashMap<>();
        tempMap.put("0", "653101000000");
        tempMap.put("1", "653121000000");
        tempMap.put("2", "653122000000");
        tempMap.put("3", "653123000000");
        tempMap.put("4", "653128000000");
        tempMap.put("5", "653129000000");
        tempMap.put("6", "653125000000");
        tempMap.put("7", "653124000000");
        tempMap.put("8", "653126000000");
        tempMap.put("9", "653127000000");
        tempMap.put("10", "653130000000");
        tempMap.put("11", "653131000000");
        tempMap.put("12", "653112000000");
        REGION_CODE_CODE_MAP = Collections.unmodifiableMap(tempMap);
    }

    /**
     * areaToRegion
     * @param area
     * @return
     */
    public static String getAreaToRegionCode(String area) {
        if (area == null || area.trim().isEmpty()) {
            return null;
        }
        return REGION_CODE_CODE_MAP.get(area.trim());
    }

    /**
     * 获取学历
     * @param eduDesc
     * @return
     */
    public static String getEduCodeByDesc(String eduDesc) {
        if (eduDesc == null || eduDesc.trim().isEmpty()) {
            return null;
        }
        return EDU_DESC_TO_CODE_MAP.get(eduDesc.trim());
    }

    public static Boolean isEmptyOrNull(String s){
        if(Objects.isNull(s)){return true;}
        return s.isEmpty();
    }
    /**
     * 将逗号分隔的数字字符串转换为List<Integer>
     */
    public static List<Integer> convertStringToIntegerList(String input) {
        if (isEmptyOrNull(input)) {
            return new ArrayList<>();
        }

        return Arrays.stream(input.split(",")) // 按逗号分割字符串
                .map(String::trim) // 去除每个部分的前后空格
                .map(Integer::parseInt) // 将字符串转换为Integer
                .collect(Collectors.toList()); // 收集为List
    }
    /**
     * 将逗号分隔的数字字符串转换为List<Integer>
     */
    public static List<Long> convertStringToLongList(String input) {
        List<Integer> longs = convertStringToIntegerList(input);
        return longs.stream().map(Long::valueOf).collect(Collectors.toList());
    }
    /**
     * 找到List<Integer>中的最大值
     */
    public static Integer findMaxValue(String input) {
        List<Integer> numbers = convertStringToIntegerList(input);
        if (numbers == null || numbers.isEmpty()) {
            return null;
        }

        return numbers.stream()
                .mapToInt(Integer::intValue) // 将Integer转换为int
                .max() // 找到最大值
                .orElseThrow(() -> new RuntimeException("列表为空，无法找到最大值")); // 如果列表为空，抛出异常
    }


    public static List<String> convertStringToStringList(String input) {
        if (isEmptyOrNull(input)) {
            return new ArrayList<>();
        }

        return Arrays.stream(input.split(",")) // 按逗号分割字符串
                .map(String::trim) // 去除每个部分的前后空格
                .collect(Collectors.toList()); // 收集为List
    }

    /**
     * 获取附件地址
     * @return
     */
    public static String getFilePath(HttpServletRequest request){
        String proxyServer = getProxyServer(request);
        if ("proxy-50".equals(proxyServer)) {
            return PATH_PROXY_50;
        } else if ("proxy-146".equals(proxyServer)) {
            return PATH_PROXY_146;
        }
        return !PATH_TEST_ENV ? PATH_PROXY_37 : PATH_DEV;
    }

    /**
     * 原方法-不传request
     * @return
     */
    public static String getFilePath(){
        return !PATH_TEST_ENV ? PATH_PROXY_37 : PATH_DEV;
    }

    /**
     * 获取nginx地址
     * @param request
     * @return
     */
    private static String getProxyServer(HttpServletRequest request) {
        if (request == null) {
            return null;
        }
        return request.getHeader("X-Proxy-Server");
    }

    /**
     * 手机号脱敏
     * @param phone
     * @return
     */
    public static String desensitizePhone(String phone) {
        if (StringUtils.isEmpty(phone) || phone.length() != 11) {
            return phone;
        }
        return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 脱敏逻辑：前4位 + ***+ 后4位
     * @param idCard
     * @return
     */
    public static String desensitizeIdCard(String idCard) {
        if (StringUtils.isEmpty(idCard)) {
            return null;
        }
        // 处理18位身份证（支持末尾X/x）
        if (idCard.matches("\\d{17}[\\dXx]")) {
            return idCard.replaceAll("(\\d{6})\\d{8}([\\dXx]{4})", "$1********$2");
        }
        // 处理15位身份证
        else if (idCard.matches("\\d{15}")) {
            return idCard.replaceAll("(\\d{6})\\d{6}(\\d{3})", "$1******$2");
        }
        // 非标准格式（如16位、含特殊字符）：返回部分脱敏（前4位+****+后2位），避免明文暴露
        else {
            int len = idCard.length();
            if (len >= 6) {
                return idCard.substring(0, 4) + "****" + idCard.substring(len - 2);
            }
            // 长度过短（<6位）：直接返回***，避免明文
            return "***";
        }
    }

    /**
     * 转大写
     * @param str
     * @return
     */
    public static String toUpperCaseIgnoreBlank(String str) {
        if (str == null) {
            return null;
        }
        String trimmedStr = str.trim();
        if (trimmedStr.isEmpty()) {
            return str;
        }
        return str.toUpperCase();
    }

    /**
     * 工具方法：拆分 Excel 单元格内的多行数据（按换行符拆分）
     */
    public static List<String> splitCellMultiLineData(String cellValue) {
        if (StringUtils.isBlank(cellValue)) {
            return Collections.emptyList();
        }
        // 按换行符拆分（兼容 \n 和 \r\n），并过滤空字符串、纯空格字符串
        return Arrays.stream(cellValue.split("\\r?\\n"))
                .map(String::trim)
                .filter(StringUtils::hasText)
                .collect(Collectors.toList());
    }

    /**
     * 工具方法：拆分联系人手机号（支持换行、逗号分隔，兼容1人多号）
     */
    public static List<String> splitContactPhones(String contactPhoneStr) {
        if (StringUtils.isBlank(contactPhoneStr)) {
            return Collections.emptyList();
        }
        // 先按换行符拆分，再按逗号拆分，最后过滤空值和纯空格
        return Arrays.stream(contactPhoneStr.split("\\r?\\n")) // 处理多行
                .flatMap(line -> Arrays.stream(line.split("，|,"))) // 处理逗号（中文+英文）
                .map(String::trim)
                .filter(StringUtils::hasText)
                .collect(Collectors.toList());
    }

    /**
     * 从身份证号码中提取出生日期，格式化为 YYYY-MM-DD
     * @param idCard 身份证号码（15位或18位）
     * @return 格式化后的出生日期，解析失败返回空字符串
     */
    public static String getBirthDateFromIdCard(String idCard) {
        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
            return "";
        }
        String birthDateStr = "";
        try {
            if (idCard.length() == 18) {
                birthDateStr = idCard.substring(6, 14);
            } else if (idCard.length() == 15) {
                birthDateStr = "20" + idCard.substring(6, 12);
            }

            SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd");
            SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyy-MM-dd");
            Date birthDate = sdfInput.parse(birthDateStr);
            return sdfOutput.format(birthDate);

        } catch (Exception e) {
            return "";
        }
    }
}
