package cd.casic.ci.process.process.service.stage;


import cd.casic.ci.process.dto.req.stage.StageCreateReq;
import cd.casic.ci.process.dto.req.stage.StageUpdateReq;
import cd.casic.ci.process.dto.resp.context.SingletonRunContextResp;
import cd.casic.ci.process.dto.resp.stage.StageResp;
import cd.casic.ci.process.process.dataObject.stage.PipStage;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;
import java.util.Map;

public interface StageService extends IService<PipStage> {
    /**
     * 创建阶段及关联任务
     * @param stage 阶段信息
     * @return 阶段id
     */
    String createStagesOrTask(StageCreateReq stage);


    /**
     * 查询所有阶段任务
     * @param pipelineId 流水线id
     * @return 任务
     */
    List<StageResp> findAllStagesTask(String pipelineId);
    List<PipStage> findAllFirstStagesAndChild(String pipelineId);

    /**
     * 删除阶段及任务,如果当前节点是当前阶段最后一个节点，
     * 会自动删除阶段
     *
     * @param taskId 配置id
     */
    void deleteStagesAndTask(String taskId);

    /**
     *  删除流水线所有阶段
     * @param pipelineId 流水线id
     */
    void  deleteAllStagesOrTask(String pipelineId);


    /**
     * 获取所有阶段的根节点
     * @param pipelineId 流水线id
     * @return 主分支
     */
    List<PipStage> findAllMainStage(String pipelineId);

    /**
     * 根据根节点查询从节点
     * @param stagesId 根节点id
     * @return 从节点列表
     */
    List<PipStage> findSecondStage(String stagesId);

    /**
     * 更新阶段任务
     * @param stage 更新内容
     */
    void updateStagesTask(StageUpdateReq stage);


    /**
     * 效验阶段配置必填字段
     * @param pipelineId 流水线id
     * @return 配置id集合
     */
    List<String> validStagesMustField(String pipelineId);

    /**
     * 更新阶段
     * @param stage 阶段信息
     */
    void updateStages(PipStage stage);

    /**
     * 删除阶段
     * @param stageId 阶段id
     */
    void deleteStages(String stageId);


    void copyStage(@NotEmpty String stageId);
    void deleteFirstStage(String stageId);
    Map<String, SingletonRunContextResp> getStageRunState(@PathVariable String stageId);
}
