package com.spot.enums;

/**
 * 订单状态枚举
 *
 * @author jean
 * @date 2026-05-06
 */
public enum OrderStatus {

    /**
     * 0 - 初始化，等待进入撮合引擎
     */
    INIT(0, "init", "初始化"),

    /**
     * 1 - 新订单，已挂单等待撮合
     */
    NEW(1, "new", "新订单"),

    /**
     * 2 - 已完全成交
     */
    FILLED(2, "filled", "已成交"),

    /**
     * 3 - 部分成交
     */
    PART_FILLED(3, "part_filled", "部分成交"),

    /**
     * 4 - 已撤单
     */
    CANCELED(4, "canceled", "已撤单"),

    /**
     * 5 - 撤单中（已提交撤单请求，等待撮合引擎处理）
     */
    PENDING_CANCEL(5, "pending_cancel", "撤单中"),

    /**
     * 6 - 已过期
     */
    EXPIRED(6, "expired", "已过期");

    /** 状态码（数据库存储值） */
    private final Integer code;

    /** 状态名称（英文） */
    private final String name;

    /** 状态描述（中文） */
    private final String description;

    OrderStatus(Integer code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据状态码获取枚举
     *
     * @param code 状态码
     * @return 枚举值，code为null时返回null
     */
    public static OrderStatus fromCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (OrderStatus status : values()) {
            if (status.code.equals(code)) {
                return status;
            }
        }
        return null;
    }

    /**
     * 判断是否可以撤单（INIT/NEW/PART_FILLED 状态可撤）
     */
    public boolean isCancelable() {
        return this == NEW || this == PART_FILLED || this == INIT;
    }

    /**
     * 判断是否为终结状态（不会再变化）
     */
    public boolean isFinal() {
        return this == FILLED || this == CANCELED || this == EXPIRED;
    }

    @Override
    public String toString() {
        return String.format("%s(%d)", description, code);
    }
}
