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

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Jenkins构建响应对象
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class JenkinsBuildResponse {
    /**
     * 构建编号
     */
    private Integer number;
    
    /**
     * 构建URL
     */
    private String url;
    
    /**
     * 构建结果
     */
    private String result;
    
    /**
     * 构建时间戳
     */
    private Long timestamp;
    
    /**
     * 构建开始时间
     */
    private Long startTimeMillis;
    
    /**
     * 构建持续时间（毫秒）
     */
    private Long duration;

    /**
     * 构建结束时间（毫秒）= timestamp + duration
     */
    private Long endTimeMillis;

    /**
     * 构建结束时间（格式化字符串），例如：yyyy-MM-dd HH:mm:ss
     */
    private String endTime;
    
    /**
     * 预计持续时间
     */
    private Long estimatedDuration;
    
    /**
     * 是否正在构建
     */
    private Boolean building;
    
    /**
     * 构建描述
     */
    private String description;
    
    /**
     * 显示名称
     */
    private String displayName;
    
    /**
     * 完整显示名称
     */
    private String fullDisplayName;
    
    /**
     * 构建ID
     */
    private String id;
    
    /**
     * 构建队列ID
     */
    private Long queueId;
    
    /**
     * 构建参数
     */
    private List<BuildParameter> actions;
    
    /**
     * 构建变更集（Jenkins FreeStyle 任务返回 changeSet 单数形式）
     */
    private ChangeSet changeSet;
    
    /**
     * 构建变更集（Jenkins Pipeline 任务返回 changeSets 复数形式）
     */
    private List<ChangeSet> changeSets;
    
    /**
     * 构建制品
     */
    private List<Artifact> artifacts;
    /**
     * 构建制品URL（逗号分隔的完整URL串），由服务层拼接
     */
    private String artifactUrl;

    /**
     * 获取所有变更集（统一处理 FreeStyle 的 changeSet 和 Pipeline 的 changeSets）
     * 调用方无需关心底层差异，直接使用此方法获取所有变更集
     */
    public List<ChangeSet> getAllChangeSets() {
        List<ChangeSet> result = new ArrayList<>();
        if (changeSet != null) {
            result.add(changeSet);
        }
        if (changeSets != null) {
            result.addAll(changeSets);
        }
        return result;
    }
    
    /**
     * 获取所有变更集中的提交记录（统一处理 FreeStyle 和 Pipeline）
     * 调用方无需关心底层差异，直接使用此方法获取所有 commit 信息
     */
    public List<ChangeSetItem> getAllChangeSetItems() {
        List<ChangeSetItem> items = new ArrayList<>();
        for (ChangeSet cs : getAllChangeSets()) {
            if (cs.getItems() != null) {
                items.addAll(cs.getItems());
            }
        }
        return items;
    }
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class BuildParameter {
        @JsonProperty("_class")
        private String type;
        private List<Parameter> parameters;
        private List<Map<String, Object>> causes;
    }
    
    @Data
    public static class Parameter {
        @JsonProperty("_class")
        private String type;
        private String name;
        private String value;
    }
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class ChangeSet {
        private String kind;
        private List<ChangeSetItem> items;
    }
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class ChangeSetItem {
        private String commitId;
        private Author author;  // Jenkins 返回的是对象，不是字符串
        private String authorEmail;
        private String msg;
        private String comment;
        private Long timestamp;
        private String date;
        private String id;
        private List<String> affectedPaths;
    }
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Author {
        private String absoluteUrl;
        private String fullName;
    }
    
    @Data
    public static class Artifact {
        private String displayPath;
        private String fileName;
        private String relativePath;
    }
}