# exports/export_ai_pdf.py
from __future__ import annotations
from pathlib import Path
from typing import Dict, Any, List

from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import mm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib import colors

def _get(row: dict, *keys, default=None):
    for k in keys:
        if k in row:
            return row[k]
    return default

def export_ai_pdf(
    out_path: Path,
    meta: Dict[str, Any],
    preisspiegel: Dict[str, Any],
    detail_rows: List[Dict[str, Any]],
    reasons: Dict[str, str],
    sections: Dict[str, str],
) -> None:
    out_path = Path(out_path)
    doc = SimpleDocTemplate(str(out_path), pagesize=landscape(A4),
                            leftMargin=14*mm, rightMargin=14*mm, topMargin=10*mm, bottomMargin=10*mm)
    styles = getSampleStyleSheet()
    story: List = []

    title = f"Vergabebericht – {meta.get('bauvorhaben','Projekt')} – {meta.get('datum','')}"
    story.append(Paragraph(title, styles["Title"]))
    story.append(Spacer(1, 6))

    # Management Summary
    ms = sections.get("management","")
    story.append(Paragraph("<b>Management Summary</b>", styles["Heading2"]))
    story.append(Paragraph(ms or "—", styles["BodyText"]))
    story.append(Spacer(1, 8))

    # Ranking / Preisspiegel
    story.append(Paragraph("<b>Rangfolge (Preisspiegel)</b>", styles["Heading2"]))
    rank_tbl = [["Rang", "Unternehmer", "Total inkl. MwSt."]]
    ranking = preisspiegel.get("ranking") or []
    sums = {s.get("vendor"): (s.get("total_inkl_mwst") or s.get("total")) for s in preisspiegel.get("summaries") or []}
    for i, (v, t) in enumerate(ranking, start=1):
        rank_tbl.append([i, v, f"{t:,.2f} CHF" if isinstance(t,(int,float)) else "—"])
    t = Table(rank_tbl, hAlign="LEFT")
    t.setStyle(TableStyle([("GRID",(0,0),(-1,-1),0.25,colors.grey),
                           ("BACKGROUND",(0,0),(-1,0),colors.whitesmoke),
                           ("FONT",(0,0),(-1,0),"Helvetica-Bold")]))
    story.append(t)
    story.append(Spacer(1, 8))

    # Auffälligkeiten / Chancen / Risiken / Methodik
    for hdr, key in [("Auffälligkeiten", "auffaelligkeiten"),
                     ("Chancen", "chancen"),
                     ("Risiken", "risiken"),
                     ("Methodik", "methodik")]:
        story.append(Paragraph(f"<b>{hdr}</b>", styles["Heading3"]))
        story.append(Paragraph(sections.get(key,"") or "—", styles["BodyText"]))
        story.append(Spacer(1, 6))

    # Top-Ausreisser (kurz)
    story.append(Paragraph("<b>Ausreißer – Begründungen (KI)</b>", styles["Heading2"]))
    top_tbl = [["Position", "Median EP", "Begründung (KI)"]]
    shown = 0
    for r in detail_rows:
        pos = _get(r, "pos", "Pos", default="")
        med = _get(r, "median", "Median", default=None)
        reason = reasons.get(str(pos), "")
        if reason:
            top_tbl.append([str(pos), (f"{med:,.2f}" if isinstance(med,(int,float)) else "—"), reason])
            shown += 1
        if shown >= 12:
            break
    if shown == 0:
        top_tbl.append(["—","—","Keine Ausreißer mit Begründung verfügbar."])
    t2 = Table(top_tbl, hAlign="LEFT", colWidths=[40*mm, 35*mm, 200*mm])
    t2.setStyle(TableStyle([("GRID",(0,0),(-1,-1),0.25,colors.grey),
                            ("BACKGROUND",(0,0),(-1,0),colors.whitesmoke),
                            ("FONT",(0,0),(-1,0),"Helvetica-Bold"),
                            ("VALIGN",(0,0),(-1,-1),"TOP")]))
    story.append(t2)

    doc.build(story)
