package com.xy.xyaicpzs.controller;

import com.xy.xyaicpzs.common.ErrorCode;
import com.xy.xyaicpzs.common.ResultUtils;
import com.xy.xyaicpzs.common.requset.PredictRecordQueryRequest;
import com.xy.xyaicpzs.common.response.ApiResponse;
import com.xy.xyaicpzs.common.response.PageResponse;
import com.xy.xyaicpzs.domain.entity.PredictRecord;
import com.xy.xyaicpzs.domain.vo.UserPredictStatVO;
import com.xy.xyaicpzs.service.DataAnalysisService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据分析控制器
 * 提供用户预测数据统计分析的API接口
 */
@Slf4j
@RestController
@RequestMapping("/data-analysis")
@Tag(name = "数据分析", description = "用户预测数据统计分析API")
public class DataAnalysisController {

    @Autowired
    private DataAnalysisService dataAnalysisService;

    /**
     * 获取用户预测统计数据
     * @param userId 用户ID
     * @return 用户预测统计数据
     */
    @GetMapping("/user-predict-stat/{userId}")
    @Operation(summary = "获取用户预测统计数据", description = "根据用户ID获取该用户的预测次数、待开奖次数、命中次数、命中率等统计数据")
    public ApiResponse<UserPredictStatVO> getUserPredictStat(
            @Parameter(description = "用户ID，例如：1001", required = true)
            @PathVariable Long userId) {
        
        try {
            log.info("接收到获取用户预测统计数据请求：用户ID={}", userId);
            
            // 调用服务获取用户预测统计数据
            UserPredictStatVO result = dataAnalysisService.getUserPredictStat(userId);
            
            log.info("获取用户预测统计数据完成，用户ID：{}，预测次数：{}，待开奖次数：{}，命中次数：{}，命中率：{}", 
                    userId, result.getPredictCount(), result.getPendingCount(), 
                    result.getHitCount(), result.getHitRate());
            
            return ResultUtils.success(result);
            
        } catch (Exception e) {
            log.error("获取用户预测统计数据失败：{}", e.getMessage(), e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "获取用户预测统计数据失败：" + e.getMessage());
        }
    }

    /**
     * 手动触发处理待开奖记录
     * @return 处理结果
     */
    @PostMapping("/process-pending")
    @Operation(summary = "手动处理待开奖记录", description = "手动触发处理待开奖的预测记录，匹配开奖结果并更新中奖状态")
    public ApiResponse<String> processPendingPredictions() {
        
        try {
            log.info("接收到手动处理待开奖记录请求");
            
            // 调用服务处理待开奖记录
            int processedCount = dataAnalysisService.processPendingPredictions();
            
            String message = String.format("处理完成，共处理%d条待开奖记录", processedCount);
            log.info("手动处理待开奖记录完成：{}", message);
            
            return ResultUtils.success(message);
            
        } catch (Exception e) {
            log.error("手动处理待开奖记录失败：{}", e.getMessage(), e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "处理待开奖记录失败：" + e.getMessage());
        }
    }

    /**
     * 按条件查询预测记录
     * @param request 查询条件
     * @return 分页预测记录
     */
    @PostMapping("/query-predict-records")
    @Operation(summary = "按条件查询预测记录", description = "根据用户ID和预测状态(待开奖/未中奖/已中奖)筛选预测记录，支持分页查询")
    public ApiResponse<PageResponse<PredictRecord>> queryPredictRecords(@RequestBody PredictRecordQueryRequest request) {
        try {
            log.info("接收到按条件查询预测记录请求：userId={}, predictStatus={}, current={}, pageSize={}", 
                    request.getUserId(), request.getPredictStatus(), request.getCurrent(), request.getPageSize());
            
            // 调用服务查询预测记录
            PageResponse<PredictRecord> result = dataAnalysisService.queryPredictRecords(request);
            
            log.info("按条件查询预测记录完成，总记录数：{}", result.getTotal());
            
            return ResultUtils.success(result);
            
        } catch (Exception e) {
            log.error("按条件查询预测记录失败：{}", e.getMessage(), e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "查询预测记录失败：" + e.getMessage());
        }
    }
    
    /**
     * 获取所有预测记录总数
     * @return 预测记录总数
     */
    @GetMapping("/total-predict-count")
    @Operation(summary = "获取预测记录总数", description = "获取系统中所有用户的预测记录总数")
    public ApiResponse<Map<String, Long>> getTotalPredictCount() {
        try {
            log.info("接收到获取预测记录总数请求");
            
            // 调用服务获取预测记录总数
            long totalCount = dataAnalysisService.getTotalPredictCount();
            
            Map<String, Long> result = new HashMap<>();
            result.put("totalCount", totalCount);
            
            log.info("获取预测记录总数完成，总数：{}", totalCount);
            
            return ResultUtils.success(result);
            
        } catch (Exception e) {
            log.error("获取预测记录总数失败：{}", e.getMessage(), e);
            return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "获取预测记录总数失败：" + e.getMessage());
        }
    }
} 