package com.eitc.common.utils;

import com.eitc.common.core.redis.RedisCache;
import com.eitc.common.utils.spring.SpringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 * PatientBaseUtil
 *
 * @author mtx
 * @date: 2024/06/04 16:54
 */
@Component
public class PatientBaseUtil {

    public static RedisCache redisCache = SpringUtils.getBean(RedisCache.class);

    /**
     * 生成多少位位随机数
     * @param length 需要生成的位数
     * @return 返回结果
     * @author mtx
     * @date: 2024/7/10 10:32
     */
    public static long generateRandom(int length) {
        Random random = new Random();
        char[] digits = new char[length];
        digits[0] = (char) (random.nextInt(9) + '1');
        for (int i = 1; i < length; i++) {
            digits[i] = (char) (random.nextInt(10) + '0');
        }
        return Long.parseLong(new String(digits));
    }

    /**
     * 根据身份证号计算年龄
     *
     * @param identificationCard 身份证号
     * @return 年龄
     * @author mtx
     * @date: 2024/6/4 16:57
     */
    public static int findAge(String identificationCard) throws ParseException {
        // 获取当前日期
        Calendar calendar = Calendar.getInstance();
        int currentYear = calendar.get(Calendar.YEAR);
        // 提取身份证号中的出生日期
        String birthDateStr = identificationCard.substring(6, 14);
        // 将出生日期字符串转换为Date类型
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        Date birthDate = dateFormat.parse(birthDateStr);
        // 计算年龄
        calendar.setTime(birthDate);
        int birthYear = calendar.get(Calendar.YEAR);
        return currentYear - birthYear;
    }

    /**
     * 用户身份证号码的打码隐藏加星号加*
     *
     * @return 处理完成的身份证
     */
    public static String idCardMask(String idCardNum) {
        String res = "";
        if (!StringUtils.isEmpty(idCardNum)) {
            StringBuilder stringBuilder = new StringBuilder(idCardNum);
            res = stringBuilder.replace(6, 14, "********").toString();
        }
        return res;
    }

    /**
     * 用户电话号码的打码隐藏加星号加*
     *
     * @return 处理完成的身份证
     */
    public static String phoneMask(String phone) {
        String res = "";
        if (!StringUtils.isEmpty(phone)) {
            StringBuilder stringBuilder = new StringBuilder(phone);
            res = stringBuilder.replace(3, 7, "****").toString();
        }
        return res;
    }

    /**
     * 获取6位短信验证码
     *
     * @return 6位验证码
     * @author mtx
     * @date: 2024/6/12 10:00
     */
    public static int getCaptchaCode() {
        return 100000 + new Random().nextInt(900000);
    }

    /**
     * 获取用户密钥
     *
     * @param userId 用户id
     * @return key
     */
    public static String getSecretKey(String userId) {
        String key = "erm:app:login_secret_key:" + userId;

        String secretKey = redisCache.getCacheObject(key);
        if (secretKey == null || "".equals(secretKey)) {
            secretKey = createSeckKey();
            redisCache.setCacheObject(key, secretKey);
        }
        return secretKey;
    }

    /**
     * 生成8位秘钥
     *
     * @return 8位秘钥
     */
    private static String createSeckKey() {
        //需要生成几位
        int n = 8;
        //最终生成的字符串
        StringBuilder str = new StringBuilder();
        char s = 'a';
        char t = 'A';
        for (int i = 0; i < n; i++) {
            char r = s;
            if (i % 2 == 0) {
                r = t;
            }
            str.append((char) (Math.random() * 26 + r));
        }
        return str.toString();
    }

    /**
     * 判断时间是否重叠
     * true重叠。false不重叠
     *
     * @param start1 第一个时间段开始时间
     * @param end1   第一个时间段结束时间
     * @param start2 第二个时间段开始时间
     * @param end2   第二个时间段结束时间
     * @return 是否重叠
     * @date: 2023/8/10
     **/
    public static boolean isOverlapLocalTime(Date start1, Date end1, Date start2, Date end2) {
        return start1.compareTo(end2) < 0 && end1.compareTo(start2) > 0;
    }

}
