"""Wiederverwendbarer Renderer für ein vollständiges Berichts-/Modell-Dokument.

Spiegelt die Render-Logik aus :meth:`AppController.save_document`
(Neuerzeugungs-Pfad) wider, damit der Workspace-Bulk-Export dieselben,
konsistenten Dokumente erzeugt wie die Einzeldokumentation.
"""
from __future__ import annotations

import logging

from core.architecture_generator import generate_architecture
from core.access_generator import (
    generate_report_access_table,
    generate_rls_members_table,
)
from core.endorsement_analyzer import EndorsementAnalyzer
from core.form_generator import FormGenerator
from core.lineage_generator import generate_lineage_diagram
from core.models import ParseResult, ReportMetadata
from core.table_expander import expand_manual_table_rows, expand_table_rows
from core.template_renderer import TemplateRenderer
from core.visuals_generator import generate_visuals_summary

logger = logging.getLogger(__name__)


def render_report_markdown(
    parse_result: ParseResult,
    metadata: ReportMetadata | None,
    mappings: list | None,
    manual_values: dict[str, str],
    connection_type: str,
    *,
    language: str = "de",
    form_generator: FormGenerator | None = None,
    renderer: TemplateRenderer | None = None,
    endorsement_analyzer: EndorsementAnalyzer | None = None,
) -> str:
    """Rendert ein komplettes Dokument aus Vorlage, Metadaten und manuellen Werten.

    Args:
        parse_result: Ergebnis des Template-Parsings (enthält template_content).
        metadata: Extrahierte Metadaten (oder None).
        mappings: Platzhalter-Zuordnungen (auto-Werte) oder None.
        manual_values: Vom Benutzer eingegebene/angepasste Werte.
        connection_type: "fabric", "local" oder "pbip" (für Service-Hinweis).
        language: Sprachcode ("de"/"en") für die Diagramm-/Analyse-Generatoren.
        form_generator: Optionaler FormGenerator (sonst wird einer erzeugt).
        renderer: Optionaler TemplateRenderer.
        endorsement_analyzer: Optionaler EndorsementAnalyzer.

    Returns:
        Das gerenderte Markdown-Dokument.
    """
    form_generator = form_generator or FormGenerator()
    renderer = renderer or TemplateRenderer()
    endorsement_analyzer = endorsement_analyzer or EndorsementAnalyzer(language=language)

    # Auto-Werte mit manuellen zusammenführen
    auto_values: dict[str, str] = {}
    if mappings:
        for m in mappings:
            if m.value is not None:
                auto_values[m.placeholder.name] = m.value
    all_values = form_generator.merge_values(auto_values, manual_values)

    template_content = parse_result.template_content

    if metadata is not None:
        # Tabellenzeilen mit Listen-Daten expandieren
        template_content, expanded_phs = expand_table_rows(template_content, metadata)
        for ph_name in expanded_phs:
            all_values.pop(ph_name, None)

        all_values["DS_Lineage"] = generate_lineage_diagram(metadata, language=language)
        all_values["DS_Architektur"] = generate_architecture(metadata, language=language)
        all_values["MODELL_Visuals"] = generate_visuals_summary(
            metadata, language=language
        )

        endorsement_result = endorsement_analyzer.analyze(metadata)
        all_values["ENDORSEMENT_Analyse"] = endorsement_analyzer.format_markdown(
            endorsement_result
        )

        # RLS-Rollen-Mitglieder und Berichtszugriffe (nur Fabric; sonst Hinweis)
        all_values["RLS_Mitglieder"] = generate_rls_members_table(
            metadata, connection_type, language
        )
        all_values["RPT_Zugriffe"] = generate_report_access_table(
            metadata, connection_type, language
        )

        if connection_type == "fabric":
            all_values["PQ_ServiceHinweis"] = (
                "> **Hinweis:** Die Dokumentation wurde über den Power BI / Fabric "
                "Service erstellt. Die Power Query M-Abfragen (Transformationsschritte, "
                "Quellsysteme) sind über die REST API nicht verfügbar. Für vollständige "
                "Abfrage-Details verwenden Sie bitte die lokale Verbindung "
                "(Power BI Desktop) oder das PBIP-Format."
            )
        else:
            all_values["PQ_ServiceHinweis"] = ""

    # Manuelle Tabellen expandieren (KPIs, Glossar, Parameter etc.)
    template_content, manual_expanded = expand_manual_table_rows(
        template_content, all_values
    )
    for ph_name in manual_expanded:
        all_values.pop(ph_name, None)

    rendered, warnings = renderer.render(template_content, all_values)
    if warnings:
        logger.debug("Render-Warnungen: %d", len(warnings))
    return rendered
