"""Generator für die Fabric Eventhouse-Dokumentation.

Analog zu :mod:`core.lakehouse_doc_generator`: eingebaute Standard-Vorlage +
Rendering aus einem :class:`~core.models.EventhouseInfo`. Eventhouses sind
property-basierte Items (kein ``getDefinition``); die Doku stützt sich auf die
Item-Properties (Query-/Ingestion-URI) und die enthaltenen KQL-Datenbanken.
"""
from __future__ import annotations

from core.models import EventhouseDatabaseInfo, EventhouseInfo
from core.template_renderer import TemplateRenderer
from core.workspace_doc_generator import _escape_cell, ensure_template, load_template

EVENTHOUSE_TEMPLATE_FILENAME = "WorkspaceEventhousevorlage.md"

__all__ = [
    "EVENTHOUSE_TEMPLATE_FILENAME",
    "DEFAULT_EVENTHOUSE_TEMPLATE",
    "ensure_template",
    "load_template",
    "build_databases_table",
    "build_endpoint_section",
    "build_service_hint",
    "build_eventhouse_values",
    "render_eventhouse",
]


DEFAULT_EVENTHOUSE_TEMPLATE = """# Microsoft Fabric Eventhouse-Dokumentation

> **Hinweis:** Diese Dokumentation ist verpflichtend für alle Produktiv-Eventhouses.
> Nicht relevante Kapitel können leer bleiben, dürfen jedoch nicht entfernt werden.
> Automatisch befüllte Felder stammen aus dem Microsoft Fabric Service; mit
> _„Manuell zu ergänzen"_ markierte Felder sind fachlich zu vervollständigen.

---

## 1. Metadaten

| Feld | Wert |
|-----|------|
| Eventhouse-Name | {{EH_Name}} |
| Beschreibung | {{EH_Beschreibung}} |
| Eventhouse-ID | {{EH_ID}} |
| Web-URL | {{EH_WebUrl}} |
| Query-Service-URI | {{EH_QueryUri}} |
| Ingestion-Service-URI | {{EH_IngestionUri}} |
| Min. Consumption Units | {{EH_MinConsumption}} |
| Anzahl KQL-Datenbanken | {{EH_AnzahlDatenbanken}} |
| Erstellt / konfiguriert von | {{EH_ConfiguredBy}} |
| Zuletzt geändert | {{EH_ModifiedTime}} |
| Fachbereich | {{EH_Fachbereich}} |
| Konzerndomäne | {{EH_Konzerndomaene}} |
| Aktuelle Version | 1.0 |
| Status | Produktiv |
| Letzte Aktualisierung | {{EH_ExportDatum}} |

---

## 2. Ansprechpartner & Verantwortlichkeiten

| Rolle | Name / Team | Kontakt |
|-----|-------------|--------|
| Fachlicher Owner | {{KONTAKT_BusinessOwner}} | {{KONTAKT_BusinessOwnerMail}} |
| Technischer Owner | {{KONTAKT_TechOwner}} | {{KONTAKT_TechOwnerMail}} |
| Data Steward | {{KONTAKT_DataSteward}} | {{KONTAKT_DataStewardMail}} |
| Betrieb / Support | {{KONTAKT_Betrieb}} | {{KONTAKT_BetriebMail}} |

---

## 3. Business-Ziel & fachlicher Kontext

### 3.1 Zielsetzung
{{EH_Zielsetzung}}

### 3.2 Fachlicher Anwendungsfall
{{EH_Anwendungsfall}}

### 3.3 Nachgelagerte Verbraucher (KQL-Querysets / Berichte / weitere)
{{EH_Konsumenten}}

---

## 4. Aufbau & Struktur

### 4.1 Übersicht der KQL-Datenbanken

{{EH_DatenbankenTabelle}}

### 4.2 Endpunkte (Query & Ingestion)

{{EH_EndpunktTabelle}}

---

## 5. Datenquellen & Ingestion

### 5.1 Datenquellen / Eventstreams

{{EH_DatenquellenTabelle}}

### 5.2 Detailbeschreibung je Datenquelle
{{EH_DatenquellenDetail}}

---

## 6. Inhalt & Nutzung

{{EH_ServiceHinweis}}

### 6.1 KQL-Datenbanken im Detail

{{EH_DatenbankenDetail}}

### 6.2 Zugriff über die Query-URI (KQL)
{{EH_EndpointHinweis}}

### 6.3 Parameter & Konfiguration
{{EH_ParameterHinweis}}

### 6.4 Datenqualität & Aufbewahrung

- Cache-/Retention-Policies: {{EH_Retention}}
- Datenvalidierungsregeln: {{EH_Validierungsregeln}}
- Sonstige Hinweise: {{EH_DatenqualitaetSonstige}}

### 6.5 Performance-Hinweise

- Minimum Consumption / Skalierung: {{EH_Skalierung}}
- Bekannte Performance-Engpässe: {{EH_PerformanceHinweise}}
- Weitere Maßnahmen: {{EH_Optimierungen}}

---

## 7. Betrieb & Wartung

### 7.1 Ingestion & Orchestrierung

{{EH_Ingestion}}

### 7.2 Monitoring & Fehlerbehandlung
{{EH_Monitoring}}

### 7.3 Bekannte Probleme / Technische Schulden
{{EH_BekannteProbleme}}

---

## 8. Sicherheit & Berechtigungen

### 8.1 Zugriff & Freigaben
{{EH_Zugriffe}}

### 8.2 Sensitivity Labels
{{EH_Labels}}

### 8.3 Risiken & Einschränkungen
{{EH_Risiken}}

---

## 9. Versionierung & Änderungsverlauf

### 9.1 Repository / Ablage
{{EH_Repository}}

### 9.2 Änderungsprotokoll

| Version | Datum | Änderung | Typ (fachlich/technisch) | Autor |
|-------|-------|---------|--------------------------|-------|
| 1.0 | {{EH_ExportDatum}} | Automatische Erst-Dokumentation | technisch | Auto-Dokumentation |

---

## 10. Freigabe & Review

| Rolle | Name | Datum | Kommentar |
|-----|------|-------|----------|
| Fachlich | {{REVIEW_FachName}} | {{REVIEW_FachDatum}} | {{REVIEW_FachKommentar}} |
| Technisch | {{REVIEW_TechName}} | {{REVIEW_TechDatum}} | {{REVIEW_TechKommentar}} |

---

## 11. Anhänge & Referenzen
- Übergeordnete Workspace-Dokumentation
- Architekturdiagramme
- Regulatorische Nachweise (separat)
"""


def _t(language: str, de: str, en: str) -> str:
    return en if (language or "de").lower().startswith("en") else de


def _manual_hint(language: str) -> str:
    return _t(language, "_Manuell zu ergänzen_", "_To be completed_")


def _none(language: str) -> str:
    return _t(language, "–", "–")


def build_databases_table(
    databases: list[EventhouseDatabaseInfo], language: str = "de"
) -> str:
    """Baut die Übersichtstabelle der KQL-Datenbanken."""
    if not databases:
        return _t(
            language,
            "_Keine KQL-Datenbanken verfügbar._",
            "_No KQL databases available._",
        )
    header = _t(language, "| KQL-Datenbank | ID |", "| KQL database | ID |")
    dash = _none(language)
    lines = [header, "|---|---|"]
    for db in databases:
        lines.append(
            f"| {_escape_cell(db.name) or dash} | {_escape_cell(db.id) or dash} |"
        )
    return "\n".join(lines)


def build_endpoint_section(eh: EventhouseInfo, language: str = "de") -> str:
    """Baut die Tabelle mit den Endpunkt-URIs."""
    dash = _none(language)
    header = _t(language, "| Endpunkt | URI |", "| Endpoint | URI |")
    query_lbl = _t(language, "Query-Service", "Query service")
    ingest_lbl = _t(language, "Ingestion-Service", "Ingestion service")
    lines = [
        header,
        "|---|---|",
        f"| {query_lbl} | {_escape_cell(eh.query_service_uri) or dash} |",
        f"| {ingest_lbl} | {_escape_cell(eh.ingestion_service_uri) or dash} |",
    ]
    return "\n".join(lines)


def build_service_hint(language: str = "de") -> str:
    return _t(
        language,
        "> **Hinweis:** Die Metadaten stammen aus den Eventhouse-Properties des "
        "Microsoft Fabric Service. Die enthaltenen KQL-Datenbanken werden über "
        "die Query-URI (KQL) abgefragt; Schema-/Tabellen-Details sind dort "
        "einsehbar und fachlich zu ergänzen.",
        "> **Note:** The metadata comes from the eventhouse properties of the "
        "Microsoft Fabric service. The contained KQL databases are queried via "
        "the query URI (KQL); schema/table details are available there and must "
        "be completed manually.",
    )


_MANUAL_PLACEHOLDERS = (
    "KONTAKT_BusinessOwner",
    "KONTAKT_BusinessOwnerMail",
    "KONTAKT_TechOwner",
    "KONTAKT_TechOwnerMail",
    "KONTAKT_DataSteward",
    "KONTAKT_DataStewardMail",
    "KONTAKT_Betrieb",
    "KONTAKT_BetriebMail",
    "EH_Fachbereich",
    "EH_Konzerndomaene",
    "EH_Zielsetzung",
    "EH_Anwendungsfall",
    "EH_Konsumenten",
    "EH_DatenquellenDetail",
    "EH_ParameterHinweis",
    "EH_Retention",
    "EH_Validierungsregeln",
    "EH_DatenqualitaetSonstige",
    "EH_Skalierung",
    "EH_PerformanceHinweise",
    "EH_Optimierungen",
    "EH_Monitoring",
    "EH_BekannteProbleme",
    "EH_Zugriffe",
    "EH_Labels",
    "EH_Risiken",
    "EH_Repository",
    "REVIEW_FachName",
    "REVIEW_FachDatum",
    "REVIEW_FachKommentar",
    "REVIEW_TechName",
    "REVIEW_TechDatum",
    "REVIEW_TechKommentar",
)


def build_eventhouse_values(
    eh: EventhouseInfo, export_date: str, language: str = "de"
) -> dict[str, str]:
    """Baut das Platzhalter-Wörterbuch für die Eventhouse-Vorlage."""
    hint = _manual_hint(language)
    dash = _none(language)

    values: dict[str, str] = {name: hint for name in _MANUAL_PLACEHOLDERS}
    values.update(
        {
            "EH_Name": eh.name or dash,
            "EH_Beschreibung": eh.description or dash,
            "EH_ID": eh.id or dash,
            "EH_WebUrl": eh.web_url or dash,
            "EH_QueryUri": eh.query_service_uri or dash,
            "EH_IngestionUri": eh.ingestion_service_uri or dash,
            "EH_MinConsumption": eh.minimum_consumption_units or dash,
            "EH_AnzahlDatenbanken": str(len(eh.databases)),
            "EH_ConfiguredBy": eh.configured_by or dash,
            "EH_ModifiedTime": eh.modified_time or dash,
            "EH_ExportDatum": export_date,
            "EH_DatenbankenTabelle": build_databases_table(eh.databases, language),
            "EH_DatenbankenDetail": build_databases_table(eh.databases, language),
            "EH_EndpunktTabelle": build_endpoint_section(eh, language),
            "EH_ServiceHinweis": build_service_hint(language),
            "EH_DatenquellenTabelle": _t(
                language,
                "_Eventstreams/Ingestion-Quellen werden nicht automatisch "
                "ermittelt. Bitte fachlich ergänzen._",
                "_Eventstreams/ingestion sources are not determined "
                "automatically. Please complete manually._",
            ),
            "EH_EndpointHinweis": _t(
                language,
                f"Die KQL-Datenbanken sind über die Query-URI erreichbar: "
                f"`{eh.query_service_uri or dash}`.",
                f"The KQL databases are available via the query URI: "
                f"`{eh.query_service_uri or dash}`.",
            ),
            "EH_Ingestion": _t(
                language,
                "_Die Ingestion erfolgt i. d. R. über Eventstreams, Pipelines "
                "oder direkte KQL-Ingestion. Bitte fachlich ergänzen._",
                "_Ingestion is typically done via eventstreams, pipelines or "
                "direct KQL ingestion. Please complete manually._",
            ),
        }
    )
    return values


def render_eventhouse(
    template_content: str,
    eh: EventhouseInfo,
    export_date: str,
    language: str = "de",
) -> str:
    """Rendert ein eigenständiges Eventhouse-Dokument anhand der Vorlage."""
    values = build_eventhouse_values(eh, export_date, language)
    rendered, _warnings = TemplateRenderer().render(template_content, values)
    return rendered
