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

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

/**
 * 退款类型枚举
 * <p>
 * 该枚举定义了系统支持的几种主要退款类型及其对应的编码和描述。
 * 主要用于区分订单在不同状态或场景下的退款处理方式。
 * </p>
 * <ul>
 *     <li>{@link #REFUND_BEFORE_SHIPPING} - 未发货仅退款</li>
 *     <li>{@link #REFUND_WITHOUT_RETURN} - 已发货仅退款（无需退货）</li>
 *     <li>{@link #RETURN_AND_REFUND} - 退货退款</li>
 * </ul>
 *
 * @author xdd
 * @since 2025-02-27
 * @version 1.0
 */
@Getter // Lombok注解，自动为所有final字段生成getter方法
public enum RefundTypeEnum {

    /**
     * type=1：退款(未发货退款)
     * <p>
     * 适用于买家已付款，但商家尚未发货的场景下，买家申请退款。
     * </p>
     */
    REFUND_BEFORE_SHIPPING(1, "未发货退款"),

    /**
     * type=2：退款不退货
     * <p>
     * 适用于商家已发货，但由于特定原因（如商品无需寄回、商家协商同意等），
     * 买家仅申请退款而无需退回货物。
     * </p>
     */
    REFUND_WITHOUT_RETURN(2, "退款不退货"),

    /**
     * type=3：退货退款
     * <p>
     * 适用于商家已发货，买家收到货后因商品问题或其他原因需要退回商品并申请退款。
     * (用户原始描述为 "退货"，在此明确为包含退款流程)
     * </p>
     */
    RETURN_AND_REFUND(3, "退货退款");

    /**
     * 类型编码
     * <p>
     * 与数据库或接口中表示退款类型的字段值对应。
     * </p>
     */
    private final int code;

    /**
     * 类型描述
     * <p>
     * 对退款类型的中文说明，方便理解和展示。
     * </p>
     */
    private final String description;

    /**
     * 枚举构造函数
     *
     * @param code        类型编码
     * @param description 类型描述
     */
    RefundTypeEnum(int code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据 code 获取对应的枚举实例
     * <p>
     * 提供一个便捷的方法，通过整数编码查找对应的枚举常量。
     * </p>
     *
     * @param code 类型编码 (int)
     * @return 对应的 {@code RefundTypeEnum} 实例，如果找不到则返回 {@code null}
     */
    public static RefundTypeEnum getByCode(int code) {
        // 遍历枚举常量
        for (RefundTypeEnum type : RefundTypeEnum.values()) {
            if (type.getCode() == code) {
                return type; // 找到匹配的code，返回对应的枚举实例
            }
        }
        return null; // 没有找到匹配的code，返回null
    }

    /**
     * 根据 code 获取对应的枚举实例 (Integer版本)
     * <p>
     * 提供一个处理 {@code Integer} 类型 code 的重载方法，增强兼容性。
     * </p>
     *
     * @param code 类型编码 ({@code Integer})
     * @return 对应的 {@code RefundTypeEnum} 实例，如果 code 为 {@code null} 或找不到则返回 {@code null}
     */
    public static RefundTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null; // 处理null输入
        }
        // 使用 Java 8 Stream API 进行查找，更简洁
        return Arrays.stream(RefundTypeEnum.values())
                .filter(enumInstance -> Objects.equals(enumInstance.getCode(), code)) // 使用Objects.equals避免潜在的NullPointerException，虽然这里code已检查非null
                .findFirst() // 找到第一个匹配的
                .orElse(null); // 如果找不到，返回null
    }

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