package com.fs.his.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 用户信息采集任务流程步骤枚举
 *
 * 1 - 待用户第一次确认
 * 2 - 待开方
 * 3 - 待药师审核
 * 4 - 待建议
 * 5 - 待用户二次确认
 */
@Getter
public enum PrescriptionTaskStepEnum {

    WAITING_FIRST_CONFIRM(1, "待用户第一次确认"),
    WAITING_PRESCRIBE(2, "待开方"),
    WAITING_PHARMACIST_REVIEW(3, "待药师审核"),
    WAITING_SUGGESTION(4, "待建议"),
    WAITING_SECOND_CONFIRM(5, "待用户二次确认"),
    WAITING_COMPLETED(6, "完成");

    /** 步骤码（存入数据库的值） */
    private final Integer code;

    /** 步骤描述 */
    private final String desc;

    PrescriptionTaskStepEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /**
     * 根据 code 获取枚举（用于从数据库值转为枚举）
     *
     * @param code 步骤码
     * @return 对应的枚举，若无匹配则返回 null
     */
    public static PrescriptionTaskStepEnum fromCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (PrescriptionTaskStepEnum step : values()) {
            if (step.code.equals(code)) {
                return step;
            }
        }
        return null;
    }

    /**
     * Jackson 反序列化时使用（支持 JSON 中直接传数字如 1 -> WAITING_FIRST_CONFIRM）
     */
    @JsonCreator
    public static PrescriptionTaskStepEnum fromJsonValue(Object value) {
        if (value instanceof Number) {
            return fromCode(((Number) value).intValue());
        } else if (value instanceof String) {
            try {
                return fromCode(Integer.parseInt((String) value));
            } catch (NumberFormatException ignored) {
                // ignore
            }
        }
        return null;
    }

    /**
     * Jackson 序列化时输出 code 而不是 name（如输出 1 而不是 "WAITING_FIRST_CONFIRM"）
     */
    @JsonValue
    public Integer getCode() {
        return this.code;
    }
}