package com.aegis.emergency.dispatch.service;

import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.aegis.emergency.dispatch.domain.DispatchTask;
import com.aegis.emergency.dispatch.domain.DispatchTaskParticipant;
import com.aegis.emergency.dispatch.domain.DispatchTaskStep;
import com.aegis.emergency.dispatch.domain.DispatchResourceUsageLink;

/**
 * 调度任务 Service 接口
 *
 * 负责调度任务生命周期与关联实体（参与方、行动项、资源链接等）的核心业务操作
 *
 * @author aegis
 */
public interface IDispatchTaskService extends IService<DispatchTask> {

    /**
     * 根据条件查询调度任务列表
     *
     * @param condition 任务查询条件
     * @return 任务集合
     */
    List<DispatchTask> listByCondition(DispatchTask condition);

    /**
     * 查询当前用户关联的调度任务
     *
     * @param condition 查询条件（状态、时间范围等）
     * @param keyword 关键字（任务名称 / 编号模糊匹配）
     * @return 当前用户的任务列表
     */
    List<DispatchTask> listMyTasks(DispatchTask condition, String keyword);

    /**
     * 根据任务编号查询任务
     *
     * @param taskNo 任务编号
     * @return 任务信息
     */
    DispatchTask getByTaskNo(String taskNo);

    /**
     * 发布任务（状态从 draft -> published）
     *
     * @param id 任务ID
     * @return 是否成功
     */
    boolean publish(Long id);

    /**
     * 标记任务执行中（通常由参与方确认触发，状态从 published -> in_progress）
     *
     * @param id 任务ID
     * @return 是否成功
     */
    boolean markInProgress(Long id);

    /**
     * 关闭任务（状态从 in_progress -> closed）
     *
     * @param id 任务ID
     * @param remark 关闭备注
     * @return 是否成功
     */
    boolean close(Long id, String remark);

    /**
     * 取消任务（状态从 published/in_progress -> cancelled）
     *
     * @param id 任务ID
     * @param reason 取消原因
     * @return 是否成功
     */
    boolean abort(Long id, String reason);

    /**
     * 添加参与方（批量）
     *
     * @param taskId 任务ID
     * @param participants 参与方集合
     */
    void addParticipants(Long taskId, List<DispatchTaskParticipant> participants);

    /**
     * 查询参与方列表
     *
     * @param taskId 任务ID
     * @return 参与方集合
     */
    List<DispatchTaskParticipant> listParticipants(Long taskId);

    /**
     * 移除参与方
     *
     * @param taskId 任务ID
     * @param participantId 参与方ID
     * @return 是否成功
     */
    boolean removeParticipant(Long taskId, Long participantId);

    /**
     * 查询行动项列表
     *
     * @param taskId 任务ID
     * @return 行动项集合
     */
    List<DispatchTaskStep> listSteps(Long taskId);

    /**
     * 追加/更新任务行动项（手动调整）
     *
     * @param taskId 任务ID
     * @param steps 行动项集合
     */
    void upsertSteps(Long taskId, List<DispatchTaskStep> steps);

    /**
     * 开始执行行动项（pending -> in_progress）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @return 是否成功
     */
    boolean startStep(Long taskId, Long stepId);

    /**
     * 完成行动项（in_progress -> completed）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @param remark 完成备注/总结
     * @return 是否成功
     */
    boolean completeStep(Long taskId, Long stepId, String remark);

    /**
     * 标记行动项失败（in_progress -> failed）
     *
     * @param taskId 任务ID
     * @param stepId 行动项ID
     * @param reason 失败原因
     * @return 是否成功
     */
    boolean failStep(Long taskId, Long stepId, String reason);

    /**
     * 查询任务资源链接
     *
     * @param taskId 任务ID
     * @return 资源链接集合
     */
    List<DispatchResourceUsageLink> listResourceLinks(Long taskId);

}