package com.ruoyi.info.collection.enums;

import org.apache.commons.lang3.StringUtils;

/**
 * 性别枚举
 * 用于性别中文标签与英文代码之间的转换
 *
 * @author ruoyi
 * @date 2026-02-10
 */
public enum GenderEnum {

    /**
     * 男
     */
    MALE("男", "M"),

    /**
     * 女
     */
    FEMALE("女", "F"),

    /**
     * 其他
     */
    OTHER("其他", "O");

    private final String chineseLabel;
    private final String englishCode;

    GenderEnum(String chineseLabel, String englishCode) {
        this.chineseLabel = chineseLabel;
        this.englishCode = englishCode;
    }

    public String getChineseLabel() {
        return chineseLabel;
    }

    public String getEnglishCode() {
        return englishCode;
    }

    /**
     * 根据中文标签获取枚举
     *
     * @param chineseLabel 中文标签（男、女、其他）
     * @return 对应的枚举值
     * @throws IllegalArgumentException 如果标签无效
     */
    public static GenderEnum fromChinese(String chineseLabel) {
        if (StringUtils.isEmpty(chineseLabel)) {
            throw new IllegalArgumentException("性别标签不能为空");
        }

        for (GenderEnum gender : values()) {
            if (gender.chineseLabel.equals(chineseLabel)) {
                return gender;
            }
        }

        throw new IllegalArgumentException("无效的性别标签: " + chineseLabel);
    }

    /**
     * 根据英文代码获取枚举
     *
     * @param englishCode 英文代码（M、F、O）
     * @return 对应的枚举值
     * @throws IllegalArgumentException 如果代码无效
     */
    public static GenderEnum fromEnglish(String englishCode) {
        if (StringUtils.isEmpty(englishCode)) {
            throw new IllegalArgumentException("性别代码不能为空");
        }

        for (GenderEnum gender : values()) {
            if (gender.englishCode.equals(englishCode)) {
                return gender;
            }
        }

        throw new IllegalArgumentException("无效的性别代码: " + englishCode);
    }

    /**
     * 验证性别值是否有效
     * 支持中文标签（男、女、其他）或英文代码（M、F、O）
     *
     * @param value 待验证的值
     * @return true-有效，false-无效
     */
    public static boolean isValid(String value) {
        if (StringUtils.isEmpty(value)) {
            return false;
        }

        for (GenderEnum gender : values()) {
            if (gender.chineseLabel.equals(value) || gender.englishCode.equals(value)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 标准化性别值
     * 输入中文标签或英文代码，统一返回英文代码
     *
     * @param input 输入值（中文或英文）
     * @return 英文代码（M、F、O）
     * @throws IllegalArgumentException 如果输入值无效
     */
    public static String normalize(String input) {
        if (StringUtils.isEmpty(input)) {
            throw new IllegalArgumentException("性别值不能为空");
        }

        // 先尝试按中文匹配
        for (GenderEnum gender : values()) {
            if (gender.chineseLabel.equals(input)) {
                return gender.englishCode;
            }
        }

        // 再尝试按英文匹配（大写）
        String upperInput = input.toUpperCase().trim();
        for (GenderEnum gender : values()) {
            if (gender.englishCode.equals(upperInput)) {
                return gender.englishCode;
            }
        }

        throw new IllegalArgumentException("无效的性别值: " + input + "，有效值为：男、女、其他 或 M、F、O");
    }
}
