
package cn.orionsec.ops.handler.app.pipeline.stage;

import cn.orionsec.kit.lang.able.Executable;
import cn.orionsec.kit.lang.utils.Exceptions;
import cn.orionsec.ops.constant.app.PipelineDetailStatus;
import cn.orionsec.ops.constant.app.StageType;
import cn.orionsec.ops.entity.domain.ApplicationPipelineTaskDO;
import cn.orionsec.ops.entity.domain.ApplicationPipelineTaskDetailDO;

public interface IStageHandler extends Executable {

    /**
     * 停止执行
     */
    void terminate();

    /**
     * 跳过执行
     */
    void skip();

    /**
     * 获取状态
     *
     * @return status
     */
    PipelineDetailStatus getStatus();

    /**
     * 获取阶段处理器
     *
     * @param task   task
     * @param detail detail
     * @return 阶段处理器
     */
    static IStageHandler with(ApplicationPipelineTaskDO task, ApplicationPipelineTaskDetailDO detail) {
        StageType stageType = StageType.of(detail.getStageType());
        switch (stageType) {
            case BUILD:
                return new BuildStageHandler(task, detail);
            case RELEASE:
                return new ReleaseStageHandler(task, detail);
            default:
                throw Exceptions.argument();
        }
    }

}
