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

import org.jcnc.snow.compiler.parser.ast.ModuleNode;
import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.semantic.error.SemanticError;
import org.jcnc.snow.compiler.semantic.utils.SemanticAnalysisReporter;

import java.util.List;
import java.util.stream.Collectors;

/**
 * {@code SemanticAnalyzerRunner} 是语义分析的统一入口。
 * <p>
 * 负责从原始 AST 中提取模块节点、调用语义分析主流程、
 * 并在出现语义错误时统一报告并终止编译流程。
 * <p>
 * 使用方式：
 * <pre>{@code
 *   SemanticAnalyzerRunner.runSemanticAnalysis(ast, true);
 * }</pre>
 * <p>
 * 功能概述：
 * <ul>
 *   <li>筛选出所有 {@link ModuleNode} 节点（模块级入口）；</li>
 *   <li>调用 {@link SemanticAnalyzer} 执行完整语义分析流程；</li>
 *   <li>将收集到的 {@link SemanticError} 列表交由报告器处理；</li>
 *   <li>若存在语义错误，调用 {@link SemanticAnalysisReporter#reportAndExitIfNecessary(List)} 自动中止流程。</li>
 * </ul>
 */
public class SemanticAnalyzerRunner {

    /**
     * 对输入的语法树执行语义分析。
     * <p>
     * 语法树应为编译前阶段（如解析器）产出的 AST 列表，
     * 本方法会自动筛选其中的 {@link ModuleNode} 节点，并调用语义分析器执行完整分析。
     *
     * @param ast     根节点列表（应包含一个或多个 {@link ModuleNode}）
     * @param verbose 是否启用详细日志（将控制内部 {@link Context#log(String)} 的行为）
     */
    public static void runSemanticAnalysis(List<Node> ast, boolean verbose) {
        // 1. 提取模块节点
        List<ModuleNode> modules = ast.stream()
                .filter(ModuleNode.class::isInstance)
                .map(ModuleNode.class::cast)
                .collect(Collectors.toList());

        // 2. 执行语义分析
        List<SemanticError> errors = new SemanticAnalyzer(verbose).analyze(modules);

        // 3. 报告并在必要时终止
        SemanticAnalysisReporter.reportAndExitIfNecessary(errors);
    }
}
