package com.ssyf.task.helper;

import com.ssyf.module.robot.domain.entity.RGiftConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 送礼配置帮助类
 * 用于处理送礼配置相关的业务逻辑
 */
@Slf4j
public class TaskHelper {

    /**
     * 根据送礼配置判断是否可以进行送礼并返回可用金额
     * 
     * @param giftConfig 送礼配置
     * @param giftedAnchorIds 已送礼主播id列表
     * @param currentAnchorId 当前主播id
     * @param onlineUsers 在线人数
     * @param watchedDuration 已观看时长（单位：秒）
     * @return 可用的金额，如果不符合条件则返回0
     */
    public static double calculateAvailableAmount(RGiftConfig giftConfig, 
                                                  List<Integer> giftedAnchorIds,
                                                  Integer currentAnchorId,
                                                  int onlineUsers, 
                                                  int watchedDuration) {
        
        // 1. 检查每日可送礼的主播数量限制
        if (giftConfig.getDailyAnchonum() != null && giftConfig.getDailyAnchonum() > 0) {
            if (giftedAnchorIds.size() >= giftConfig.getDailyAnchonum()) {
                log.info("【送礼】机器人送礼主播人数达到最大值: giftedAnchorIds=｛｝ ，dailyAnchonum=｛｝",giftedAnchorIds.size() , giftConfig.getDailyAnchonum());
                return 0.0;
            }
        }

        // 2. 检查当前主播是否已经达到每日送礼批次限制
        if (giftConfig.getGiftBatchNum() != null && giftConfig.getGiftBatchNum() > 0) {
            long currentAnchorGiftCount = giftedAnchorIds.stream()
                    .filter(id -> id.equals(currentAnchorId))
                    .count();
            if (currentAnchorGiftCount >= giftConfig.getGiftBatchNum()) {
                log.info("【送礼】机器人送礼主播批次达到最大值: currentAnchorId=｛｝ ，giftBatchNum=｛｝",currentAnchorId , giftConfig.getGiftBatchNum());
                return 0.0;
            }
        }

        // 3. 检查在线人数范围
        if (giftConfig.getMinOnlineUsers() != null && onlineUsers < giftConfig.getMinOnlineUsers()) {
            log.info("【送礼】机器人送礼主播人数范围不满足: onlineUsers=｛｝ ，minOnlineUsers=｛｝",onlineUsers , giftConfig.getMinOnlineUsers());
            return 0.0;
        }
        if (giftConfig.getMaxOnlineUsers() != null && onlineUsers > giftConfig.getMaxOnlineUsers()) {
            log.info("【送礼】机器人送礼主播人数范围不满足: onlineUsers=｛｝ ，maxOnlineUsers=｛｝",onlineUsers , giftConfig.getMaxOnlineUsers());
            return 0.0;
        }

        // 4. 检查观看时长范围
        if (giftConfig.getMinWatchDuration() != null && watchedDuration < giftConfig.getMinWatchDuration()) {
            log.info("【送礼】机器人送礼主播观看时长范围不满足: watchedDuration=｛｝ ，minWatchDuration=｛｝",watchedDuration , giftConfig.getMinWatchDuration());
            return 0.0;
        }
        if (giftConfig.getMaxWatchDuration() != null && watchedDuration > giftConfig.getMaxWatchDuration()) {
            log.info("【送礼】机器人送礼主播观看时长范围不满足: watchedDuration=｛｝ ，maxWatchDuration=｛｝",watchedDuration , giftConfig.getMaxWatchDuration());
            return 0.0;
        }

        // 5. 检查金额范围
        if (giftConfig.getMinAmount() == null || giftConfig.getMaxAmount() == null) {
            log.info("【送礼】机器人送礼金额范围配置错误: minAmount=｛｝ ，maxAmount=｛｝",giftConfig.getMinAmount() , giftConfig.getMaxAmount());
            return 0.0;
        }

        // 如果所有条件都满足，返回最大金额（或者可以根据业务逻辑返回其他值）
        return giftConfig.getMaxAmount();
    }
    
    /**
     * 检查是否可以给当前主播送礼
     * 
     * @param giftConfig 送礼配置
     * @param giftedAnchorIds 已送礼主播id列表
     * @param currentAnchorId 当前主播id
     * @param onlineUsers 在线人数
     * @param watchedDuration 已观看时长（单位：秒）
     * @return 是否可以送礼
     */
    public static boolean canSendGift(RGiftConfig giftConfig, 
                                      List<Integer> giftedAnchorIds,
                                      Integer currentAnchorId,
                                      int onlineUsers, 
                                      int watchedDuration) {
        return calculateAvailableAmount(giftConfig, giftedAnchorIds, currentAnchorId, onlineUsers, watchedDuration) > 0;
    }
}