package com.fs.erp.constant;

import lombok.Getter;

/**
 * 商城系统订单状态枚举
 * 包含订单流转的各个状态及其说明
 */
@Getter
public enum OrderStatusEnum {

    /**
     * 等待买家付款
     */
    WAIT_BUYER_PAY("等待买家付款"),

    /**
     * 等待卖家发货
     * 传此状态时，实际支付金额(pay节点支付金额=应付金额)ERP才会显示已付款待审核
     */
    WAIT_SELLER_SEND_GOODS("等待卖家发货"),

    /**
     * 等待买家确认收货
     */
    WAIT_BUYER_CONFIRM_GOODS("等待买家确认收货"),

    /**
     * 交易成功
     */
    TRADE_FINISHED("交易成功"),

    /**
     * 付款后交易关闭
     */
    TRADE_CLOSED("付款后交易关闭"),

    /**
     * 付款前交易关闭
     */
    TRADE_CLOSED_BY_TAOBAO("付款前交易关闭");

    /**
     * 订单状态描述
     */
    private final String description;

    /**
     * 构造函数
     * @param description 订单状态描述
     */
    OrderStatusEnum(String description) {
        this.description = description;
    }

    /**
     * 判断订单状态是否可以更新
     * @return 所有状态均可更新，返回true
     */
    public boolean canUpdate() {
        return true;
    }

    /**
     * 根据状态码获取枚举实例
     * @param code 状态码
     * @return 对应的枚举实例，如果不存在则返回null
     */
    public static OrderStatusEnum getByCode(String code) {
        try {
            return OrderStatusEnum.valueOf(code);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 检查给定的状态码是否为有效的订单状态
     * @param code 状态码
     * @return 是否有效
     */
    public static boolean isValidCode(String code) {
        return getByCode(code) != null;
    }

    @Override
    public String toString() {
        return this.name() + "(" + this.description + ")";
    }
}
