package jnpf.enums.attendance;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 考勤状态枚举
 * 
 * @author Generated
 * @create 2026-04-16
 */
@Getter
@AllArgsConstructor
public enum AttendanceStatusEnum {

    /**
     * 正常
     */
    NORMAL(1001, "正常", "basic"),

    /**
     * 公休
     */
    PUBLIC_HOLIDAY(1010, "公休", "basic"),

    /**
     * 迟到
     */
    LATE(1002, "迟到", "basic"),

    /**
     * 早退
     */
    EARLY_LEAVE(1003, "早退", "basic"),

    /**
     * 缺卡
     */
    MISSING_CARD(1004, "缺卡", "basic"),
    /**
     * 出差（外勤结果）
     */
    BUSINESS_TRIP(2006, "出差", "out"),

    /**
     * 外出（外勤结果）
     */
    OUT_OFFICE(2007, "外出", "out"),
    /**
     * 外勤（外勤结果）
     */
    OUTER(2008, "外勤", "out"),


    /**
     * 旷工
     */
    ABSENT(1009, "旷工", "basic");

    /**
     * 状态值
     */
    private final Integer code;

    /**
     * 状态名称
     */
    private final String name;

    /**
     * 类型（basic:基础考勤状态, leave:请假类型, out:外勤结果）
     */
    private final String type;

    /**
     * 根据code获取枚举
     *
     * @param code 状态值
     * @return 考勤状态枚举
     */
    public static AttendanceStatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        return Arrays.stream(values())
                .filter(e -> e.getCode().equals(code))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据name获取枚举
     *
     * @param name 状态名称
     * @return 考勤状态枚举
     */
    public static AttendanceStatusEnum getByName(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }
        return Arrays.stream(values())
                .filter(e -> e.getName().equals(name))
                .findFirst()
                .orElse(null);
    }

    /**
     * 判断是否为有效的状态值
     *
     * @param code 状态值
     * @return true-有效，false-无效
     */
    public static boolean isValid(Integer code) {
        return getByCode(code) != null;
    }

    /**
     * 获取所有基础考勤状态（考勤结果）
     *
     * @return 基础考勤状态数组
     */
    public static AttendanceStatusEnum[] getBasicStatuses() {
        return Arrays.stream(values())
                .filter(e -> "basic".equals(e.getType()))
                .toArray(AttendanceStatusEnum[]::new);
    }

    /**
     * 获取所有外勤结果状态
     *
     * @return 外勤结果状态数组
     */
    public static AttendanceStatusEnum[] getOutStatuses() {
        return Arrays.stream(values())
                .filter(e -> "out".equals(e.getType()))
                .toArray(AttendanceStatusEnum[]::new);
    }

    /**
     * Code到Name的映射Map
     */
    private static final Map<Integer, String> CODE_TO_NAME_MAP = Arrays.stream(values())
            .collect(Collectors.toMap(AttendanceStatusEnum::getCode, AttendanceStatusEnum::getName));

    /**
     * Name到Code的映射Map
     */
    private static final Map<String, Integer> NAME_TO_CODE_MAP = Arrays.stream(values())
            .collect(Collectors.toMap(AttendanceStatusEnum::getName, AttendanceStatusEnum::getCode));

    /**
     * 根据code获取name
     *
     * @param code 状态值
     * @return 状态名称
     */
    public static String getNameByCode(Integer code) {
        return CODE_TO_NAME_MAP.get(code);
    }

    /**
     * 根据name获取code
     *
     * @param name 状态名称
     * @return 状态值
     */
    public static Integer getCodeByName(String name) {
        return NAME_TO_CODE_MAP.get(name);
    }
}
