package tech.easyflow.skill.gitimport;

import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * Git 仓库 Skill 候选扫描结果。
 *
 * @param scanToken 短期扫描令牌
 * @param repository 仓库固定提交信息
 * @param summary 候选数量摘要
 * @param candidates 候选列表
 * @param expiresAt 令牌过期时间
 */
public record SkillGitScanResult(
        String scanToken,
        RepositoryInfo repository,
        Summary summary,
        List<Candidate> candidates,
        Date expiresAt) implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 创建不可变扫描结果。
     */
    public SkillGitScanResult {
        candidates = candidates == null ? List.of() : List.copyOf(candidates);
        expiresAt = expiresAt == null ? null : new Date(expiresAt.getTime());
    }

    /**
     * 返回防御性复制的过期时间。
     *
     * @return 过期时间
     */
    @Override
    public Date expiresAt() {
        return expiresAt == null ? null : new Date(expiresAt.getTime());
    }

    /**
     * 固定提交的仓库信息。
     *
     * @param name 仓库名称
     * @param url 规范化仓库地址
     * @param defaultBranch 默认分支
     * @param commitSha 完整提交 SHA
     */
    public record RepositoryInfo(String name, String url, String defaultBranch,
                                 String commitSha) implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;
    }

    /**
     * 候选数量摘要。
     *
     * @param discovered 发现数量
     * @param importable 可导入数量
     * @param needsAttention 需处理数量
     */
    public record Summary(int discovered, int importable, int needsAttention) implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;
    }

    /**
     * 单个 Skill 候选。
     *
     * @param candidateId 固定提交内稳定候选 ID
     * @param path 仓库相对路径
     * @param name 标准 Skill 名称
     * @param description 用途描述
     * @param status 候选状态
     * @param resourceCount 资源文件数量
     * @param totalBytes 候选总字节数
     * @param issues 校验问题
     */
    public record Candidate(String candidateId, String path, String name, String description,
                            CandidateStatus status, int resourceCount, long totalBytes,
                            List<Issue> issues) implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 创建不可变候选。
         */
        public Candidate {
            issues = issues == null ? List.of() : List.copyOf(issues);
        }

        /**
         * 判断候选是否可以进入标准包预检。
         *
         * @return 可导入时为 true
         */
        public boolean importable() {
            return status == CandidateStatus.IMPORTABLE;
        }
    }

    /**
     * 候选状态。
     */
    public enum CandidateStatus {
        /** 可进入标准包预检。 */
        IMPORTABLE,
        /** 需修正仓库内容后重新扫描。 */
        NEEDS_ATTENTION
    }

    /**
     * 候选校验问题。
     *
     * @param code 稳定问题码
     * @param message 用户可读说明
     * @param path 问题文件路径
     */
    public record Issue(String code, String message, String path) implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;
    }
}
