package org.jcnc.snow.compiler.semantic.utils;

import org.jcnc.snow.compiler.semantic.error.SemanticError;

import java.util.List;

/**
 * {@code SemanticAnalysisReporter} 是语义分析阶段的结果报告工具类。
 * <p>
 * 用于统一处理语义分析阶段产生的错误信息输出与流程终止逻辑。
 * 通常作为语义分析器的收尾阶段调用。
 *
 * <p>主要职责包括：
 * <ul>
 *   <li>打印所有收集到的 {@link SemanticError}；</li>
 *   <li>若存在错误，使用 {@code System.exit(1)} 终止编译流程；</li>
 *   <li>若无错误，输出分析通过提示。</li>
 * </ul>
 *
 * <p>该类为工具类，禁止实例化，方法均为静态调用。
 */
public final class SemanticAnalysisReporter {

    // 禁止实例化
    private SemanticAnalysisReporter() {

    }

    /**
     * 打印语义分析结果并在必要时终止程序。
     * <p>
     * 如果错误列表非空：
     * <ul>
     *   <li>逐条打印错误信息（含位置与描述）；</li>
     *   <li>使用 {@code System.exit(1)} 退出，表示语义分析失败。</li>
     * </ul>
     * 如果错误列表为空：
     * <ul>
     *   <li>打印“语义分析通过”提示。</li>
     * </ul>
     *
     * @param errors 语义分析阶段收集到的错误列表（允许为 null）
     */
    public static void reportAndExitIfNecessary(List<SemanticError> errors) {
        if (errors != null && !errors.isEmpty()) {
            System.err.println("语义分析发现错误：");
            for (SemanticError error : errors) {
                System.err.println("  " + error);
            }
            System.exit(1); // 非正常退出，阻止后续编译流程
        } else {
            System.out.println("语义分析通过，没有发现错误。");
        }
    }
}
