package com.lesingle.creation.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lesingle.creation.dto.review.*;
import com.lesingle.creation.entity.ContestWorkAssignment;
import com.lesingle.creation.vo.review.ReviewAssignmentVO;
import com.lesingle.creation.vo.review.ReviewStatsVO;
import com.lesingle.creation.vo.review.WorkScoreVO;

import java.util.List;

/**
 * 竞赛评审服务接口
 */
public interface ContestReviewService {

    /**
     * 分配作品给评委
     * @param contestId 活动 ID
     * @param dto 分配请求
     * @param creatorId 创建人 ID
     * @return 分配记录列表
     */
    List<ReviewAssignmentVO> assignWork(Long contestId, AssignWorkDTO dto, Long creatorId);

    /**
     * 批量分配作品
     * @param dto 批量分配请求
     * @param creatorId 创建人 ID
     * @return 分配记录列表
     */
    List<ReviewAssignmentVO> batchAssign(BatchAssignDTO dto, Long creatorId);

    /**
     * 评分
     * @param dto 创建评分请求
     * @param judgeId 评委 ID
     * @param tenantId 租户 ID
     * @return 评分详情
     */
    WorkScoreVO score(CreateScoreDTO dto, Long judgeId, Long tenantId);

    /**
     * 更新评分
     * @param scoreId 评分 ID
     * @param dto 更新评分请求
     * @param tenantId 租户 ID
     * @return 评分详情
     */
    WorkScoreVO updateScore(Long scoreId, CreateScoreDTO dto, Long tenantId);

    /**
     * 分页查询评审分配列表
     * @param queryDTO 查询参数
     * @param tenantId 租户 ID
     * @return 评审分配列表
     */
    Page<ReviewAssignmentVO> pageQuery(ReviewAssignmentQueryDTO queryDTO, Long tenantId);

    /**
     * 获取评委待评审作品列表
     * @param judgeId 评委 ID
     * @param tenantId 租户 ID
     * @return 评审分配列表
     */
    List<ReviewAssignmentVO> getMyAssignments(Long judgeId, Long tenantId);

    /**
     * 评审统计
     * @param contestId 活动 ID（可选）
     * @return 统计数据
     */
    ReviewStatsVO getStats(Long contestId);

    /**
     * 获取作品的评分列表
     * @param workId 作品 ID
     * @param tenantId 租户 ID
     * @return 评分列表
     */
    List<WorkScoreVO> getWorkScores(Long workId, Long tenantId);

    /**
     * 获取作品的平均分
     * @param workId 作品 ID
     * @param tenantId 租户 ID
     * @return 平均分
     */
    java.math.BigDecimal getAverageScore(Long workId, Long tenantId);

    /**
     * 自动分配作品给评委
     * @param contestId 活动 ID
     * @param creatorId 创建人 ID
     * @return 分配结果消息
     */
    String autoAssign(Long contestId, Long creatorId);

    /**
     * 获取评审进度统计
     * @param contestId 活动 ID
     * @param tenantId 租户 ID
     * @return 评审进度统计
     */
    com.lesingle.creation.vo.review.ReviewProgressVO getReviewProgress(Long contestId, Long tenantId);

    /**
     * 获取作品状态统计
     * @param contestId 活动 ID
     * @param tenantId 租户 ID
     * @return 作品状态统计
     */
    com.lesingle.creation.vo.review.WorkStatusStatsVO getWorkStatusStats(Long contestId, Long tenantId);

    /**
     * 获取作品的最终得分
     * @param workId 作品 ID
     * @param tenantId 租户 ID
     * @return 最终得分
     */
    com.lesingle.creation.vo.review.FinalScoreVO getFinalScore(Long workId, Long tenantId);

    /**
     * 替换评委
     * @param assignmentId 分配 ID
     * @param newJudgeId 新评委 ID
     * @param tenantId 租户 ID
     */
    void replaceJudge(Long assignmentId, Long newJudgeId, Long tenantId);

    /**
     * 获取评委参与的活动列表
     * @param judgeId 评委 ID
     * @param tenantId 租户 ID
     * @return 活动列表
     */
    List<com.lesingle.creation.vo.review.JudgeContestVO> getJudgeContests(Long judgeId, Long tenantId);

    /**
     * 获取评委在某个活动下的作品列表
     * @param contestId 活动 ID
     * @param judgeId 评委 ID
     * @param tenantId 租户 ID
     * @return 作品列表分页数据
     */
    Page<com.lesingle.creation.vo.review.JudgeWorkVO> getJudgeContestWorks(
            Long contestId, Long judgeId, Long tenantId,
            com.lesingle.creation.dto.review.JudgeWorkQueryDTO queryDTO);
}
