package com.xy.xyaicpzs.util;

import lombok.Data;

/**
 * 双色球奖金计算器
 * 根据新规则计算中奖等级和奖金
 */
public class SsqPrizeCalculator {
    
    // 特别规定启动阈值：15亿（数据库存储单位为亿）
    private static final double SPECIAL_RULE_START_THRESHOLD = 15.0;
    
    // 特别规定停止阈值：3亿（数据库存储单位为亿）
    private static final double SPECIAL_RULE_STOP_THRESHOLD = 3.0;
    
    /**
     * 中奖结果
     */
    @Data
    public static class PrizeResult {
        private String prizeLevel;  // 中奖等级
        private Long bonus;         // 奖金（元）
        
        public PrizeResult(String prizeLevel, Long bonus) {
            this.prizeLevel = prizeLevel;
            this.bonus = bonus;
        }
    }
    
    /**
     * 计算中奖结果
     * 
     * @param predictNumbers 预测号码 [红球1-6, 蓝球]
     * @param drawNumbers 开奖号码 [红球1-6, 蓝球]
     * @param prizePool 奖池金额（单位：亿元）
     * @param isSpecialPeriod 是否处于特别规定期间
     * @return 中奖结果
     */
    public static PrizeResult calculatePrize(Integer[] predictNumbers, Integer[] drawNumbers, 
                                            Double prizePool, boolean isSpecialPeriod) {
        // 比较红球匹配数
        int redMatches = 0;
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                if (predictNumbers[i] != null && predictNumbers[i].equals(drawNumbers[j])) {
                    redMatches++;
                    break;
                }
            }
        }
        
        // 比较蓝球是否匹配
        boolean blueMatch = predictNumbers[6] != null && predictNumbers[6].equals(drawNumbers[6]);
        
        // 根据匹配情况判断奖项和奖金
        String prizeLevel;
        Long bonus;
        
        if (redMatches == 6 && blueMatch) {
            // 一等奖：6红+1蓝
            prizeLevel = "一等奖";
            bonus = 5_000_000L; // 500万封顶
        } else if (redMatches == 6) {
            // 二等奖：6红
            prizeLevel = "二等奖";
            bonus = 5_000_000L; // 500万封顶
        } else if (redMatches == 5 && blueMatch) {
            // 三等奖：5红+1蓝
            prizeLevel = "三等奖";
            bonus = 3_000L;
        } else if (redMatches == 5 || (redMatches == 4 && blueMatch)) {
            // 四等奖：5红 或 4红+1蓝
            prizeLevel = "四等奖";
            bonus = 200L;
        } else if (redMatches == 4 || (redMatches == 3 && blueMatch)) {
            // 五等奖：4红 或 3红+1蓝
            prizeLevel = "五等奖";
            bonus = 10L;
        } else if (blueMatch) {
            // 六等奖：1蓝
            prizeLevel = "六等奖";
            bonus = 5L;
        } else if (redMatches == 3 && isSpecialPeriod) {
            // 福运奖：3红（仅在特别规定期间）
            prizeLevel = "福运奖";
            bonus = 5L;
        } else {
            // 未中奖
            prizeLevel = "未中奖";
            bonus = 0L;
        }
        
        return new PrizeResult(prizeLevel, bonus);
    }
    
    /**
     * 判断是否应该执行特别规定
     * 
     * @param currentPrizePool 当前期奖池金额（单位：亿元）
     * @param previousIsSpecialPeriod 上一期是否处于特别规定期间
     * @return 当前期是否应该执行特别规定
     */
    public static boolean shouldExecuteSpecialRule(Double currentPrizePool, boolean previousIsSpecialPeriod) {
        if (currentPrizePool == null) {
            return false;
        }
        
        // 如果上一期不在特别规定期间，检查是否达到启动阈值
        if (!previousIsSpecialPeriod) {
            return currentPrizePool >= SPECIAL_RULE_START_THRESHOLD;
        }
        
        // 如果上一期在特别规定期间，检查是否低于停止阈值
        return currentPrizePool >= SPECIAL_RULE_STOP_THRESHOLD;
    }
}
