from __future__ import annotations

from pathlib import Path

from jarvis_finance.config.paths import RuntimePaths
from jarvis_finance.config.settings import Settings, load_settings
from jarvis_finance.dashboard.components.tables import show_table
from jarvis_finance.dashboard import data
from jarvis_finance.reports.crypto_inventory import export_crypto_inventory_report

PAGE_TITLE = "Reports"


def _settings_for_reports(st) -> Settings:
    runtime_override = None
    try:
        runtime_override = st.session_state.get("jarvis_reports_runtime_dir")
    except Exception:
        runtime_override = None
    if runtime_override:
        return Settings(runtime_paths=RuntimePaths.from_base(Path(runtime_override)))
    return load_settings()


def _visible_report_rows(rows: list[dict], *, admin_mode: bool) -> list[dict]:
    if admin_mode:
        return rows
    visible = []
    for row in rows:
        visible.append({
            "Typ": data.translate_status(row.get("report_type")),
            "Titel": row.get("title", ""),
            "Erzeugt am": row.get("generated_at", ""),
            "Format": str(row.get("format") or "").upper(),
            "Datenqualität": data.translate_status(row.get("data_quality_status")),
            "Ablage": "Runtime-Reports-Ordner",
        })
    return visible


def render(st, conn) -> None:
    st.title("Reports")
    st.caption("Reports werden ausschließlich aus der Runtime-DB erzeugt und im Runtime-Reports-Ordner gespeichert.")

    c1, c2 = st.columns(2)
    with c1:
        if st.button("Crypto-Report erzeugen", key="generate_crypto_report"):
            try:
                st.spinner("Crypto-Report wird aus lokalen Daten erzeugt …")
                result = export_crypto_inventory_report(conn, settings=_settings_for_reports(st), preferred_format="pdf")
                warn = f" Hinweis: {'; '.join(result['warnings'])}" if result.get("warnings") else ""
                st.success(f"Report erzeugt ({result['format']}): {result['file_path']}.{warn}")
            except Exception as exc:
                st.error(f"Report konnte nicht erzeugt werden: {exc}")
    with c2:
        st.button("Portfolio-Report erzeugen", disabled=True, help="Kommt später; Crypto-Report ist der MVP-Fokus.")
        st.caption("Portfolio-Report kommt später; kein toter Button, bewusst deaktiviert.")

    rows = data.rowdicts(conn.execute("SELECT report_type, title, generated_at, file_path, format, data_quality_status FROM reports ORDER BY generated_at DESC").fetchall())
    admin_mode = bool(getattr(st, "session_state", {}).get("jarvis_admin_mode", False))
    show_table(st, _visible_report_rows(rows, admin_mode=admin_mode), empty_message="Noch keine Reports vorhanden.")
