AnalysisFacade.java

package com.taxonomy.analysis.service;

import com.taxonomy.dto.RelationHypothesisDto;
import com.taxonomy.dto.SavedAnalysis;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * Facade that aggregates the analysis domain services into a single high-level API.
 *
 * <p>Controllers should prefer this facade over calling individual services directly,
 * keeping transaction boundaries and orchestration logic in one place.
 */
@Service
public class AnalysisFacade {

    private final LlmService llmService;
    private final SavedAnalysisService savedAnalysisService;
    private final AnalysisRelationGenerator analysisRelationGenerator;

    public AnalysisFacade(@Lazy LlmService llmService,
                          SavedAnalysisService savedAnalysisService,
                          AnalysisRelationGenerator analysisRelationGenerator) {
        this.llmService = llmService;
        this.savedAnalysisService = savedAnalysisService;
        this.analysisRelationGenerator = analysisRelationGenerator;
    }

    /**
     * Builds a {@link SavedAnalysis} export from the given analysis data.
     *
     * @param requirement the business requirement text
     * @param scores      node code → score map
     * @param reasons     node code → reason text (may be null or sparse)
     * @param provider    LLM provider name
     * @return populated {@link SavedAnalysis} ready for serialization
     */
    public SavedAnalysis buildAnalysisExport(String requirement,
                                             Map<String, Integer> scores,
                                             Map<String, String> reasons,
                                             String provider) {
        return savedAnalysisService.buildExport(requirement, scores, reasons, provider);
    }

    /**
     * Generates provisional relation hypotheses from analysis scores.
     *
     * @param scores map of nodeCode → integer score (0–100)
     * @return list of relation hypotheses sorted by confidence descending
     */
    @Transactional(readOnly = true)
    public List<RelationHypothesisDto> generateRelationsFromScores(Map<String, Integer> scores) {
        return analysisRelationGenerator.generate(scores);
    }
}