package org.springblade.modules.martial.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.modules.martial.pojo.dto.AthleteOrderDTO;
import org.springblade.modules.martial.pojo.dto.MoveAthletesDTO;
import org.springblade.modules.martial.pojo.entity.MartialScheduleConflict;
import org.springblade.modules.martial.pojo.entity.MartialSchedulePlan;

import java.util.List;

/**
 * 编排方案服务类
 *
 * @author BladeX
 */
public interface IMartialSchedulePlanService extends IService<MartialSchedulePlan> {

	/**
	 * 自动编排
	 *
	 * @param competitionId 赛事ID
	 * @return 编排方案
	 */
	MartialSchedulePlan autoSchedule(Long competitionId);

	/**
	 * 冲突检测
	 *
	 * @param planId 编排方案ID
	 * @return 冲突列表
	 */
	List<MartialScheduleConflict> detectConflicts(Long planId);

	/**
	 * 检测移动运动员是否会产生冲突
	 *
	 * @param moveDTO 移动参数
	 * @return 冲突列表
	 */
	List<MartialScheduleConflict> checkMoveConflicts(MoveAthletesDTO moveDTO);

	/**
	 * 批量移动运动员到其他时间槽
	 *
	 * @param moveDTO 移动参数
	 * @return 是否成功
	 */
	Boolean moveAthletes(MoveAthletesDTO moveDTO);

	/**
	 * 调整场地内运动员出场顺序
	 *
	 * @param slotId   时间槽ID
	 * @param newOrder 新的出场顺序列表
	 * @return 是否成功
	 */
	Boolean updateAppearanceOrder(Long slotId, List<AthleteOrderDTO> newOrder);

	/**
	 * 确认并发布编排方案
	 *
	 * @param planId 编排方案ID
	 * @return 是否成功
	 */
	Boolean confirmAndPublishPlan(Long planId);

	/**
	 * 解决冲突
	 *
	 * @param planId 编排方案ID
	 * @param conflicts 冲突列表
	 * @return 是否成功
	 */
	Boolean resolveConflicts(Long planId, List<MartialScheduleConflict> conflicts);

}
