package org.jeecg.common.util;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;

/**
 * 身份证信息工具类
 * 用于从身份证号码中提取性别、年龄、出生日期等信息
 *
 * @author Assistant
 * @version 1.0
 */
public class IdCardUtil {

    /**
     * 18位身份证号码正则表达式
     */
    private static final Pattern ID_CARD_PATTERN = Pattern.compile("\\d{17}[0-9X]");

    /**
     * 根据身份证号码获取性别
     *
     * @param idCard 身份证号码（18位）
     * @return 性别："男" 或 "女"
     * @throws IllegalArgumentException 当身份证号码格式不正确时
     */
    public static String getGender(String idCard) {
        if (!isValidIdCard(idCard)) {
            throw new IllegalArgumentException("身份证号码格式不正确");
        }

        // 提取第17位数字（身份证索引位置16）
        char genderChar = idCard.charAt(16);
        int genderDigit = Character.getNumericValue(genderChar);

        // 奇数代表男性，偶数代表女性[7,8](@ref)
        return genderDigit % 2 == 0 ? "女" : "男";
    }

    /**
     * 根据身份证号码获取年龄
     *
     * @param idCard 身份证号码（18位）
     * @return 年龄（周岁）
     * @throws IllegalArgumentException 当身份证号码格式不正确时
     */
    public static int getAge(String idCard) {
        if (!isValidIdCard(idCard)) {
            throw new IllegalArgumentException("身份证号码格式不正确");
        }

        // 提取出生日期字符串
        String birthDateStr = idCard.substring(6, 14);
        LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.ofPattern("yyyyMMdd"));
        LocalDate currentDate = LocalDate.now();

        // 计算周岁[10](@ref)
        return Period.between(birthDate, currentDate).getYears();
    }

    /**
     * 根据身份证号码获取出生日期
     *
     * @param idCard 身份证号码（18位）
     * @return 出生日期字符串（格式：yyyy-MM-dd）
     * @throws IllegalArgumentException 当身份证号码格式不正确时
     */
    public static String getBirthDate(String idCard) {
        if (!isValidIdCard(idCard)) {
            throw new IllegalArgumentException("身份证号码格式不正确");
        }

        String birthDateStr = idCard.substring(6, 14);
        LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.ofPattern("yyyyMMdd"));
        return birthDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }

    /**
     * 验证身份证号码格式
     *
     * @param idCard 身份证号码
     * @return 格式是否有效
     */
    public static boolean isValidIdCard(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            return false;
        }
        return ID_CARD_PATTERN.matcher(idCard).matches();
    }

    /**
     * 测试示例
     */
    public static void main(String[] args) {
        String testIdCard = "522528199405284418";

        System.out.println("身份证号码: " + testIdCard);
        System.out.println("性别: " + getGender(testIdCard));
        System.out.println("年龄: " + getAge(testIdCard));
        System.out.println("出生日期: " + getBirthDate(testIdCard));
        System.out.println("格式验证: " + isValidIdCard(testIdCard));
    }
}