package com.qqchen.deploy.backend.deploy.integration;

import com.qqchen.deploy.backend.deploy.entity.ExternalSystem;
import com.qqchen.deploy.backend.deploy.enums.JenkinsBuildStatus;
import com.qqchen.deploy.backend.deploy.integration.response.*;
import com.qqchen.deploy.backend.system.enums.ExternalSystemTypeEnum;

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

/**
 * Jenkins集成服务接口
 */
public interface IJenkinsServiceIntegration extends IExternalSystemIntegration {

    /**
     * 测试Jenkins连接
     *
     * @param system Jenkins系统配置
     * @return 连接是否成功
     */
    boolean testConnection(ExternalSystem system);

    /**
     * 获取Jenkins Crumb（用于CSRF保护）
     *
     * @return Crumb响应信息
     */
    JenkinsCrumbIssuerResponse getJenkinsCrumbIssue();

    /**
     * 使用参数触发构建
     *
     * @return 构建队列ID
     */
    String buildWithParameters(ExternalSystem externalSystem, String jobName, Map<String, String> parameters);

    /**
     * 获取队列中的构建信息
     *
     * @param queueId 队列ID
     * @return 队列构建信息
     */
    JenkinsQueueBuildInfoResponse getQueuedBuildInfo(String queueId);

    /**
     * 获取构建状态
     *
     * @param jobName     任务名称
     * @param buildNumber 构建编号
     * @return 构建状态
     */
    JenkinsBuildStatus getBuildStatus(ExternalSystem externalSystem, String jobName, Integer buildNumber);

    /**
     * 获取构建详细信息
     *
     * @param externalSystem Jenkins系统配置
     * @param jobName        任务名称
     * @param buildNumber    构建编号
     * @return 构建详细信息
     */
    JenkinsBuildResponse getBuildDetails(ExternalSystem externalSystem, String jobName, Integer buildNumber);

    /**
     * 查询所有视图
     *
     * @param externalSystem Jenkins系统配置
     * @return 视图列表
     */
    List<JenkinsViewResponse> listViews(ExternalSystem externalSystem);

    /**
     * 查询视图下的所有任务
     *
     * @param externalSystem Jenkins系统配置
     * @param viewName       视图名称
     * @return 任务列表
     */
    List<JenkinsJobResponse> listJobs(ExternalSystem externalSystem, String viewName);

    /**
     * 获取任务详情
     *
     * @param externalSystem Jenkins系统配置
     * @param jobName       任务名称
     * @return 任务详情
     */
    JenkinsJobResponse job(ExternalSystem externalSystem, String jobName);

    /**
     * 查询任务的构建信息
     *
     * @param externalSystem Jenkins系统配置
     * @param jobName        任务名称
     * @return 构建信息列表
     */
    List<JenkinsBuildResponse> listBuilds(ExternalSystem externalSystem, String jobName);

    /**
     * 获取系统类型
     *
     * @return Jenkins系统类型
     */
    @Override
    default ExternalSystemTypeEnum getSystemType() {
        return ExternalSystemTypeEnum.JENKINS;
    }
}
