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-27
 */
@Getter
@AllArgsConstructor
public enum AttendanceOutTypeEnum {

    /**
     * 外出
     */
    OUT_OFFICE(1, "外出", "out"),

    /**
     * 外勤
     */
    FIELD_WORK(2, "外勤", "out"),

    /**
     * 出差
     */
    BUSINESS_TRIP(3, "出差", "out");

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

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

    /**
     * 类型（out:外勤结果）
     */
    private final String type;

    /**
     * 根据code获取枚举
     *
     * @param code 状态值
     * @return 外勤结果枚举
     */
    public static AttendanceOutTypeEnum 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 AttendanceOutTypeEnum 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 AttendanceOutTypeEnum[] getAllOutStatuses() {
        return values();
    }

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

    /**
     * Name到Code的映射Map
     */
    private static final Map<String, Integer> NAME_TO_CODE_MAP = Arrays.stream(values())
            .collect(Collectors.toMap(AttendanceOutTypeEnum::getName, AttendanceOutTypeEnum::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);
    }
}
