package com.aicheck.model;

import java.util.ArrayList;
import java.util.List;

/**
 * 单次类变更的完整报告：变更类型、字段 diff、接口/转换影响，供通知渲染。
 */
public class ClassChangeReport {
    private final String className;
    private final String oldClassName;
    private final ClassType classType;
    private final ClassChangeKind changeKind;
    private final String sourceFile;
    private final String classDescription;
    private final List<FieldChange> fieldChanges = new ArrayList<>();
    private final List<ApiEndpoint> inputImpactEndpoints = new ArrayList<>();
    private final List<String> conversionEntities = new ArrayList<>();
    private final List<ApiEndpoint> frontendImpactEndpoints = new ArrayList<>();
    private final boolean conversionCheckEnabled;

    public ClassChangeReport(String className, String oldClassName, ClassType classType,
                             ClassChangeKind changeKind, String sourceFile,
                             boolean conversionCheckEnabled, String classDescription) {
        this.className = className;
        this.oldClassName = oldClassName;
        this.classType = classType;
        this.changeKind = changeKind;
        this.sourceFile = sourceFile;
        this.conversionCheckEnabled = conversionCheckEnabled;
        this.classDescription = classDescription == null ? "" : classDescription.trim();
    }

    /** 当前（新）简单类名 */
    public String getClassName() {
        return className;
    }

    /** 重命名前的简单类名，未重命名则为 null */
    public String getOldClassName() {
        return oldClassName;
    }

    /** 是否发生类名变更 */
    public boolean isRenamed() {
        return oldClassName != null && !oldClassName.equals(className);
    }

    /** 是否仅类名变更、字段无变化 */
    public boolean isRenameOnly() {
        return changeKind == ClassChangeKind.RENAME_ONLY;
    }

    public ClassType getClassType() {
        return classType;
    }

    public ClassChangeKind getChangeKind() {
        return changeKind;
    }

    /** Git 相对路径，通知「文件路径」展示用 */
    public String getSourceFile() {
        return sourceFile;
    }

    /** 类级中文说明（@Schema / 类 Javadoc），无则空串 */
    public String getClassDescription() {
        return classDescription;
    }

    /** 是否整文件删除 */
    public boolean isDeleted() {
        return changeKind == ClassChangeKind.DELETED;
    }

    public List<FieldChange> getFieldChanges() {
        return fieldChanges;
    }

    /** 入参引用该类的接口（request 影响） */
    public List<ApiEndpoint> getInputImpactEndpoints() {
        return inputImpactEndpoints;
    }

    /** Dto→Entity 转换目标类名列表 */
    public List<String> getConversionEntities() {
        return conversionEntities;
    }

    /** 返回值引用该类的接口（response 影响） */
    public List<ApiEndpoint> getFrontendImpactEndpoints() {
        return frontendImpactEndpoints;
    }

    /** 是否启用类转换检测 */
    public boolean isConversionCheckEnabled() {
        return conversionCheckEnabled;
    }

    /** 追加一条字段变更 */
    public void addFieldChange(FieldChange change) {
        fieldChanges.add(change);
    }

    /** 追加 request 影响接口（按 endpointKey 去重） */
    public void addInputImpact(ApiEndpoint endpoint) {
        if (inputImpactEndpoints.stream().noneMatch(e -> e.endpointKey().equals(endpoint.endpointKey()))) {
            inputImpactEndpoints.add(endpoint);
        }
    }

    /** 追加关联 Entity 类名（去重） */
    public void addConversionEntity(String entityName) {
        if (!conversionEntities.contains(entityName)) {
            conversionEntities.add(entityName);
        }
    }

    /** 追加 response 影响接口（按 endpointKey 去重） */
    public void addFrontendImpact(ApiEndpoint endpoint) {
        if (frontendImpactEndpoints.stream().noneMatch(e -> e.endpointKey().equals(endpoint.endpointKey()))) {
            frontendImpactEndpoints.add(endpoint);
        }
    }
}
