package com.gxwebsoft.shop.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;

/**
 * 订单相关配置属性
 *
 * @author 科技小王子
 * @since 2025-01-26
 */
@Data
@Component
@ConfigurationProperties(prefix = "shop.order")
public class OrderConfigProperties {

    /**
     * 测试账号配置
     */
    private TestAccount testAccount = new TestAccount();

    /**
     * 租户特殊规则配置
     */
    private List<TenantRule> tenantRules;

    /**
     * 默认订单配置
     */
    private DefaultConfig defaultConfig = new DefaultConfig();

    /**
     * 订单自动取消配置
     */
    private AutoCancel autoCancel = new AutoCancel();

    /**
     * 错误信息配置
     */
    private ErrorMessages errorMessages = new ErrorMessages();

    @Data
    public static class TestAccount {
        /**
         * 测试手机号列表
         */
        private List<String> phoneNumbers;

        /**
         * 测试支付金额
         */
        private BigDecimal testPayAmount = new BigDecimal("0.01");

        /**
         * 是否启用测试模式
         */
        private boolean enabled = false;
    }

    @Data
    public static class TenantRule {
        /**
         * 租户ID
         */
        private Integer tenantId;

        /**
         * 租户名称
         */
        private String tenantName;

        /**
         * 最小金额限制
         */
        private BigDecimal minAmount;

        /**
         * 金额限制提示信息
         */
        private String minAmountMessage;

        /**
         * 是否启用
         */
        private boolean enabled = true;
    }

    @Data
    public static class DefaultConfig {

        /**
         * 默认标题
         */
        private String defaultTitle = "订单标题";

        /**
         * 默认备注
         */
        private String defaultComments = "暂无";

        /**
         * 最小订单金额
         */
        private BigDecimal minOrderAmount = BigDecimal.ZERO;

        /**
         * 订单超时时间（分钟）
         */
        private Integer orderTimeoutMinutes = 30;
    }

    /**
     * 检查是否为测试账号
     */
    public boolean isTestAccount(String phone) {
        return testAccount.isEnabled() &&
               testAccount.getPhoneNumbers() != null &&
               testAccount.getPhoneNumbers().contains(phone);
    }

    @Data
    public static class AutoCancel {
        /**
         * 是否启用自动取消功能
         */
        private boolean enabled = true;

        /**
         * 默认超时时间（分钟）
         */
        private Integer defaultTimeoutMinutes = 30;

        /**
         * 定时任务检查间隔（分钟）
         */
        private Integer checkIntervalMinutes = 5;

        /**
         * 批量处理大小
         */
        private Integer batchSize = 100;

        /**
         * 租户特殊配置
         */
        private List<TenantCancelConfig> tenantConfigs;
    }

    @Data
    public static class TenantCancelConfig {
        /**
         * 租户ID
         */
        private Integer tenantId;

        /**
         * 租户名称
         */
        private String tenantName;

        /**
         * 超时时间（分钟）
         */
        private Integer timeoutMinutes;

        /**
         * 是否启用
         */
        private boolean enabled = true;
    }

    /**
     * 获取指定租户的超时时间
     */
    public Integer getTimeoutMinutes(Integer tenantId) {
        if (autoCancel.getTenantConfigs() != null) {
            for (TenantCancelConfig config : autoCancel.getTenantConfigs()) {
                if (config.isEnabled() && config.getTenantId().equals(tenantId)) {
                    return config.getTimeoutMinutes();
                }
            }
        }
        return autoCancel.getDefaultTimeoutMinutes();
    }

    /**
     * 获取租户规则
     */
    public TenantRule getTenantRule(Integer tenantId) {
        if (tenantRules == null) {
            return null;
        }
        return tenantRules.stream()
                .filter(rule -> rule.isEnabled() && rule.getTenantId().equals(tenantId))
                .findFirst()
                .orElse(null);
    }

    @Data
    public static class ErrorMessages {
        /**
         * 订单金额计算错误信息
         */
        private String amountCalculationError = "订单金额计算错误，请刷新重试";

        /**
         * 商品不存在错误信息
         */
        private String goodsNotFound = "商品不存在";

        /**
         * 商品已下架错误信息
         */
        private String goodsOffline = "商品已下架";

        /**
         * 库存不足错误信息
         */
        private String stockInsufficient = "商品库存不足";

        /**
         * 购买数量超限错误信息
         */
        private String quantityExceeded = "商品购买数量超过限制";

        /**
         * 商品价格异常错误信息
         */
        private String priceAbnormal = "商品价格异常";
    }
}
