package com.gxwebsoft.payment.enums;

/**
 * 支付类型枚举
 * 定义系统支持的所有支付方式
 *
 * @author 科技小王子
 * @since 2025-01-26
 */
public enum PaymentType {

    /** 余额支付 */
    BALANCE(0, "余额支付", "balance"),

    /** 微信支付（包含JSAPI和Native） */
    WECHAT(1, "微信支付", "wechat"),

    /** 支付宝支付 */
    ALIPAY(2, "支付宝支付", "alipay"),

    /** 银联支付 */
    UNION_PAY(3, "银联支付", "union_pay"),

    /** 现金支付 */
    CASH(4, "现金支付", "cash"),

    /** POS机支付 */
    POS(5, "POS机支付", "pos"),

    /** 免费 */
    FREE(6, "免费", "free"),

    /** 积分支付 */
    POINTS(7, "积分支付", "points"),

    // ========== 已废弃的支付方式（保留用于数据兼容） ==========

    /** @deprecated 微信Native支付 - 已合并到WECHAT */
    @Deprecated
    WECHAT_NATIVE(102, "微信Native支付", "wechat_native"),

    /** @deprecated 会员卡支付 - 建议使用余额支付 */
    @Deprecated
    MEMBER_CARD_OLD(8, "会员卡支付", "member_card"),

    /** @deprecated VIP月卡 - 建议使用余额支付 */
    @Deprecated
    VIP_MONTHLY(9, "VIP月卡", "vip_monthly"),

    /** @deprecated VIP年卡 - 建议使用余额支付 */
    @Deprecated
    VIP_YEARLY(10, "VIP年卡", "vip_yearly"),

    /** @deprecated VIP次卡 - 建议使用余额支付 */
    @Deprecated
    VIP_COUNT(11, "VIP次卡", "vip_count"),

    /** @deprecated 免费（旧编号） - 已迁移到新编号6 */
    @Deprecated
    FREE_OLD(12, "免费", "free"),

    /** @deprecated VIP充值卡 - 建议使用余额支付 */
    @Deprecated
    VIP_RECHARGE(13, "VIP充值卡", "vip_recharge"),

    /** @deprecated IC充值卡 - 建议使用余额支付 */
    @Deprecated
    IC_RECHARGE(14, "IC充值卡", "ic_recharge"),

    /** @deprecated 积分支付（旧编号） - 已迁移到新编号7 */
    @Deprecated
    POINTS_OLD(15, "积分支付", "points"),

    /** @deprecated VIP季卡 - 建议使用余额支付 */
    @Deprecated
    VIP_QUARTERLY(16, "VIP季卡", "vip_quarterly"),

    /** @deprecated IC月卡 - 建议使用余额支付 */
    @Deprecated
    IC_MONTHLY(17, "IC月卡", "ic_monthly"),

    /** @deprecated IC年卡 - 建议使用余额支付 */
    @Deprecated
    IC_YEARLY(18, "IC年卡", "ic_yearly"),

    /** @deprecated IC次卡 - 建议使用余额支付 */
    @Deprecated
    IC_COUNT(19, "IC次卡", "ic_count"),

    /** @deprecated IC季卡 - 建议使用余额支付 */
    @Deprecated
    IC_QUARTERLY(20, "IC季卡", "ic_quarterly"),

    /** @deprecated 代付 - 建议通过业务逻辑实现 */
    @Deprecated
    PROXY_PAY(21, "代付", "proxy_pay"),

    /** @deprecated 支付宝（旧编号） - 已迁移到新编号2 */
    @Deprecated
    ALIPAY_OLD(22, "支付宝支付", "alipay"),

    /** @deprecated 银联支付（旧编号） - 已迁移到新编号3 */
    @Deprecated
    UNION_PAY_OLD(23, "银联支付", "union_pay");

    private final Integer code;
    private final String name;
    private final String channel;

    PaymentType(Integer code, String name, String channel) {
        this.code = code;
        this.name = name;
        this.channel = channel;
    }

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public String getChannel() {
        return channel;
    }

    /**
     * 根据代码获取支付类型
     */
    public static PaymentType getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (PaymentType type : values()) {
            if (type.code.equals(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据渠道获取支付类型
     */
    public static PaymentType getByChannel(String channel) {
        if (channel == null) {
            return null;
        }
        for (PaymentType type : values()) {
            if (type.channel.equals(channel)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 是否为微信支付类型
     */
    public boolean isWechatPay() {
        return this == WECHAT || this == WECHAT_NATIVE;
    }

    /**
     * 获取微信支付的具体类型
     * @param openid 用户openid
     * @return JSAPI 或 NATIVE
     */
    public String getWechatPayType(String openid) {
        if (!isWechatPay()) {
            return null;
        }

        // 有openid使用JSAPI，无openid使用Native
        return (openid != null && !openid.trim().isEmpty()) ? "JSAPI" : "NATIVE";
    }

    /**
     * 是否为第三方支付
     */
    public boolean isThirdPartyPay() {
        return isWechatPay() || this == ALIPAY || this == UNION_PAY;
    }

    /**
     * 是否需要在线支付
     */
    public boolean isOnlinePay() {
        return isThirdPartyPay();
    }

    /**
     * 是否为卡类支付（已废弃的支付方式）
     * @deprecated 卡类支付已废弃，建议使用余额支付
     */
    @Deprecated
    public boolean isCardPay() {
        return this == MEMBER_CARD_OLD ||
               this == VIP_MONTHLY || this == VIP_YEARLY || this == VIP_COUNT || this == VIP_QUARTERLY ||
               this == IC_MONTHLY || this == IC_YEARLY || this == IC_COUNT || this == IC_QUARTERLY ||
               this == VIP_RECHARGE;
    }

    /**
     * 是否为推荐使用的核心支付方式
     */
    public boolean isCorePaymentType() {
        return this == BALANCE || this == WECHAT || this == ALIPAY || this == UNION_PAY ||
               this == CASH || this == POS || this == FREE || this == POINTS;
    }

    /**
     * 是否为已废弃的支付方式
     */
    public boolean isDeprecated() {
        return !isCorePaymentType();
    }

    @Override
    public String toString() {
        return String.format("PaymentType{code=%d, name='%s', channel='%s'}", code, name, channel);
    }
}
