package org.springblade.modules.martial.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.modules.martial.excel.ResultExportExcel;
import org.springblade.modules.martial.pojo.entity.MartialResult;
import org.springblade.modules.martial.pojo.vo.CertificateVO;

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

/**
 * Result 服务类
 *
 * @author BladeX
 */
public interface IMartialResultService extends IService<MartialResult> {

	/**
	 * 计算有效平均分（去掉最高分和最低分）
	 */
	BigDecimal calculateValidAverageScore(Long athleteId, Long projectId);

	/**
	 * 应用难度系数
	 */
	BigDecimal applyDifficultyCoefficient(BigDecimal averageScore, Long projectId);

	/**
	 * 计算最终成绩
	 */
	MartialResult calculateFinalScore(Long athleteId, Long projectId);

	/**
	 * 自动排名
	 */
	void autoRanking(Long projectId);

	/**
	 * 分配奖牌
	 */
	void assignMedals(Long projectId);

	/**
	 * 成绩复核
	 */
	void reviewResult(Long resultId, String reviewNote, BigDecimal adjustment);

	/**
	 * 发布成绩
	 */
	void publishResults(Long projectId);

	/**
	 * 撤销发布
	 */
	void unpublishResults(Long projectId);

	/**
	 * Task 3.1: 导出成绩单
	 */
	List<ResultExportExcel> exportResults(Long competitionId, Long projectId);

	/**
	 * Task 3.4: 生成证书数据
	 */
	CertificateVO generateCertificateData(Long resultId);

	/**
	 * Task 3.4: 批量生成证书数据
	 */
	List<CertificateVO> batchGenerateCertificates(Long projectId);


	// ========== 三级裁判评分流程方法 ==========

	/**
	 * 主裁判确认/修改分数
	 */
	boolean confirmByChiefJudge(Long resultId, Long chiefJudgeId, BigDecimal score, String note);

	/**
	 * 总裁确认/修改分数
	 */
	boolean confirmByGeneralJudge(Long resultId, Long generalJudgeId, BigDecimal score, String note);

	/**
	 * 获取待主裁判确认的成绩列表
	 */
	List<MartialResult> getPendingChiefConfirmList(Long venueId);

	/**
	 * 获取待总裁确认的成绩列表
	 */
	List<MartialResult> getPendingGeneralConfirmList(Long competitionId);


	/**
	 * 获取已总裁确认的成绩列表
	 */
	List<MartialResult> getConfirmedGeneralList(Long competitionId);

}
