package com.fs.erp.dto.sdk.wangdian.enums;

import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;

/**
 * 平台售后状态枚举
 * <p>
 * 该枚举定义了平台售后流程中的各个主要状态及其对应的编码和中文描述。
 * 用于标识和管理售后订单的处理进度。
 * </p>
 * <ul>
 *     <li>{@link #WAIT_SELLER_AGREE} - 申请退款/售后，等待商家处理</li>
 *     <li>{@link #SELLER_REFUSE} - 商家拒绝</li>
 *     <li>{@link #CLOSED} - 售后关闭</li>
 *     <li>{@link #GOODS_RETURNING} - 买家待退货</li>
 *     <li>{@link #GOODS_RECEIVING} - 商家待收货</li>
 *     <li>{@link #SUCCESS} - 售后成功</li>
 * </ul>
 *
 * @author xdd
 * @since 2025-02-27
 * @version 1.0
 */
@Getter // Lombok注解，自动为所有final字段生成getter方法
public enum AfterSaleStatusEnum {

    /**
     * code: wait_seller_agree
     * <p>
     * 状态描述: 申请退款。买家已发起售后申请，等待商家审核同意。
     * </p>
     */
    WAIT_SELLER_AGREE("wait_seller_agree", "申请退款"),

    /**
     * code: seller_refuse
     * <p>
     * 状态描述: 拒绝退款。商家审核后，不同意买家的售后申请。
     * </p>
     */
    SELLER_REFUSE("seller_refuse", "拒绝退款"),

    /**
     * code: closed
     * <p>
     * 状态描述: 退款关闭。售后流程结束，可能由买家撤销、超时未处理、双方协商一致等原因导致关闭。
     * </p>
     */
    CLOSED("closed", "退款关闭"),

    /**
     * code: goods_returning
     * <p>
     * 状态描述: 待退货。商家同意退货后，等待买家填写物流单号并寄回商品。
     * </p>
     */
    GOODS_RETURNING("goods_returning", "待退货"),

    /**
     * code: goods_receiving
     * <p>
     * 状态描述: 待收货。买家已发货，等待商家确认收到退回的商品。
     * </p>
     */
    GOODS_RECEIVING("goods_receiving", "待收货"),

    /**
     * code: success
     * <p>
     * 状态描述: 退款成功。售后流程已成功完成，款项已退还给买家或换货/维修已处理完毕。
     * </p>
     */
    SUCCESS("success", "退款成功");

    /**
     * 状态编码
     * <p>
     * 对应平台内部或接口传输时使用的状态标识符。
     * </p>
     */
    private final String code;

    /**
     * 状态描述
     * <p>
     * 对售后状态的中文解释，用于界面展示或日志记录。
     * </p>
     */
    private final String description;

    /**
     * 枚举构造函数
     *
     * @param code        状态编码 (String)
     * @param description 状态描述 (String)
     */
    AfterSaleStatusEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据状态编码获取对应的枚举实例
     * <p>
     * 提供一个便捷的方法，通过字符串编码查找对应的枚举常量。
     * 比较时忽略大小写。
     * </p>
     *
     * @param code 状态编码 (String)
     * @return 对应的 {@code AfterSaleStatusEnum} 实例，如果 code 为 {@code null} 或未找到匹配项，则返回 {@code null}
     */
    public static AfterSaleStatusEnum getByCode(String code) {
        if (code == null) {
            return null; // 处理null输入
        }
        // 使用 Stream API 进行查找，忽略大小写进行匹配
        return Arrays.stream(AfterSaleStatusEnum.values())
                .filter(enumInstance -> enumInstance.getCode().equalsIgnoreCase(code)) // 忽略大小写比较
                .findFirst() // 找到第一个匹配的
                .orElse(null); // 如果找不到，返回null
    }

    // Lombok 的 @Getter 会自动生成以下公共方法:
    // public String getCode() { return this.code; }
    // public String getDescription() { return this.description; }
}
