#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Build a clean PDF of the FFG Businessplan from the final markdown (fpdf2).
eCall-Nachrichten akzeptieren nur pdf/xls/xlsx/zip -> docx geht nicht, daher PDF."""
import re, os
from fpdf import FPDF
from fpdf.fonts import FontFace
from fpdf.enums import XPos, YPos

BASE = "/home/nk/hobo-godmode/otto/projekte/plappi/ffg-antrag"
SRC = os.path.join(BASE, "BUSINESSPLAN_FINANZPLAN_FINAL.md")
OUT = os.path.join(BASE, "BUSINESSPLAN_Plappi_FFG_final.pdf")
ASSETS = os.path.join(BASE, "_assets")
FONT = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
FONTB = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"

ABB = {
    "GERAET": "A2_lifestyle.jpg", "GERAET2": "Langpal1.jpeg", "MONTESSORI": "B1_montessori.jpg",
    "DASHBOARD": "Dashboard.png", "POSITION": "3_tonies-vergleich.jpg", "SPRACHEN": "4_27-sprachen.jpg",
    "CHART_UMSATZ": "chart_umsatz.png", "CHART_GUV": "chart_guv.png",
    "CHART_CASHFLOW": "chart_cashflow.png", "CHART_FINANZIERUNG": "chart_finanzierung.png",
    "LOGO": "Logo.png",
}
ABB_W = {"GERAET":105,"GERAET2":80,"MONTESSORI":105,"POSITION":110,"SPRACHEN":110,
         "CHART_UMSATZ":160,"CHART_GUV":160,"CHART_CASHFLOW":160,"CHART_FINANZIERUNG":150}
TBL_TITLES = {
    1:"Gründer & Schlüsselpersonen",2:"Org-Plan über 24 Monate",3:"Wettbewerbsübersicht (Lücke = Plappi-USP)",
    4:"Volumen-Hochlauf Y1–Y5",5:"Umsatz-Hochlauf in EUR (Y1–Y5)",6:"Plan-GuV über drei Jahre",
    7:"Cashflow-Inflows (kumuliert über 36 Monate)",8:"Cashflow-Outflows (kumuliert)",9:"Kumulierter Cash-Saldo",
    10:"Eröffnungs-Plan-Bilanz (Mt 0)",11:"Plan-Bilanz Ende Jahr 1",12:"Folgekosten-Posten (ab Mt 25)",
    13:"Risiken & Maßnahmen",14:"Gesamt-Kapitalbedarf 24 Monate",
}
ACCENT=(46,91,158); GREY=(89,89,89); HDR=(213,226,240)

class PDF(FPDF):
    def mcell(self,*a,**k):
        k.setdefault("new_x",XPos.LMARGIN); k.setdefault("new_y",YPos.NEXT)
        return self.multi_cell(*a,**k)
    def footer(self):
        self.set_y(-12); self.set_font("DejaVu","",7); self.set_text_color(*GREY)
        self.cell(0,6,f"Seite {self.page_no()}/{{nb}}  ·  Plappi · FFG Projektnummer 944442 · vertraulich",
                  align="C")

def md_clean(t): return t.replace("`","")

def main():
    lines = open(SRC,encoding="utf-8").read().split("\n")
    pdf = PDF(format="A4"); pdf.set_margins(20,18,20); pdf.set_auto_page_break(True,18)
    pdf.add_font("DejaVu","",FONT); pdf.add_font("DejaVu","B",FONTB)
    pdf.alias_nb_pages()

    # ---- Titelseite
    pdf.add_page(); pdf.set_text_color(0,0,0)
    pdf.ln(18)
    logo=os.path.join(ASSETS,ABB["LOGO"])
    if os.path.exists(logo):
        w=55; pdf.image(logo,x=(210-w)/2,w=w); pdf.ln(6)
    pdf.ln(8); pdf.set_font("DejaVu","B",24); pdf.set_text_color(*ACCENT)
    pdf.mcell(0,11,"Businessplan & Finanzplan — Plappi",align="C"); pdf.ln(2)
    pdf.set_font("DejaVu","",13); pdf.set_text_color(*GREY)
    pdf.mcell(0,8,"Displayloser, kameraloser KI-Sprachlernbegleiter für Kinder",align="C")
    pdf.ln(14); pdf.set_text_color(0,0,0)
    pdf.set_font("DejaVu","B",12)
    pdf.mcell(0,7,"FFG Basisprogramm · Projektnummer 944442 (eCall-Antrag 71545616)",align="C")
    pdf.set_font("DejaVu","",12)
    pdf.mcell(0,7,"Antragsteller: Plappi FlexCo (i.G.), Wien",align="C")
    pdf.mcell(0,7,"Juni 2026",align="C")

    pdf.add_page()
    table_no=0; fig_no=0
    i=0; n=len(lines)
    epw=pdf.epw
    while i<n:
        line=lines[i]; s=line.strip()
        if s=="" or s=="---": i+=1; continue
        # headings
        m=re.match(r"^(#{1,3})\s+(.*)$",s)
        if m:
            lvl=len(m.group(1)); txt=md_clean(m.group(2))
            pdf.ln(3 if lvl>1 else 5)
            pdf.set_font("DejaVu","B",{1:17,2:13.5,3:11.5}[lvl]); pdf.set_text_color(*ACCENT)
            if lvl<=2: pdf.start_section(txt)
            pdf.mcell(0,{1:9,2:7,3:6}[lvl],txt); pdf.set_text_color(0,0,0); pdf.ln(1)
            i+=1; continue
        # image marker
        mi=re.match(r"^\[\[ABB:([A-Z0-9_]+)\|(.*?)\]\]$",s)
        if mi:
            key=mi.group(1); cap=md_clean(mi.group(2)); fn=ABB.get(key)
            path=os.path.join(ASSETS,fn) if fn else None
            if path and os.path.exists(path):
                w=ABB_W.get(key,110);
                if pdf.get_y()+w*0.6>270: pdf.add_page()
                pdf.ln(2); pdf.image(path,x=(210-w)/2,w=w); fig_no+=1; pdf.ln(1)
                pdf.set_font("DejaVu","",8.5); pdf.set_text_color(*GREY)
                pdf.mcell(0,5,f"Abbildung {fig_no}: {cap}",align="C"); pdf.set_text_color(0,0,0); pdf.ln(2)
            i+=1; continue
        # table block
        if s.startswith("|"):
            tl=[]
            while i<n and lines[i].strip().startswith("|"):
                tl.append(lines[i].strip()); i+=1
            parsed=[]
            for r in tl:
                cells=[c.strip() for c in r.strip().strip("|").split("|")]
                if all(re.match(r"^:?-{2,}:?$",c) for c in cells if c!=""): continue
                parsed.append([md_clean(c) for c in cells])
            if parsed:
                table_no+=1
                pdf.ln(2); pdf.set_font("DejaVu","B",9.5); pdf.set_text_color(*ACCENT)
                pdf.mcell(0,5.5,f"Tabelle {table_no}: {TBL_TITLES.get(table_no,'')}".strip())
                pdf.set_text_color(0,0,0); pdf.ln(1)
                ncol=max(len(r) for r in parsed)
                parsed=[r+[""]*(ncol-len(r)) for r in parsed]
                fs=9 if ncol<=3 else (8 if ncol==4 else 7)
                pdf.set_font("DejaVu","",fs)
                hs=FontFace(emphasis="BOLD",fill_color=HDR,color=(0,0,0))
                with pdf.table(markdown=True,first_row_as_headings=True,headings_style=hs,
                               line_height=fs*0.55+2,text_align="LEFT",borders_layout="ALL") as table:
                    for row in parsed:
                        tr=table.row()
                        for c in row: tr.cell(c)
                pdf.ln(2)
            continue
        # blockquote
        if s.startswith(">"):
            q=[]
            while i<n and lines[i].strip().startswith(">"):
                q.append(lines[i].strip()[1:].strip()); i+=1
            qt=" ".join([x for x in q if x])
            if qt:
                pdf.set_font("DejaVu","",9.5); pdf.set_text_color(*GREY)
                pdf.set_x(pdf.l_margin+4)
                pdf.mcell(epw-4,5,md_clean(qt),markdown=True); pdf.set_text_color(0,0,0); pdf.ln(1)
            continue
        # ordered list
        mo=re.match(r"^(\d+)\.\s+(.*)$",s)
        if mo:
            pdf.set_font("DejaVu","",10.5)
            pdf.mcell(0,5.5,f"{mo.group(1)}.  {md_clean(mo.group(2))}",markdown=True); i+=1; continue
        # unordered list
        mu=re.match(r"^[-*]\s+(.*)$",s)
        if mu:
            pdf.set_font("DejaVu","",10.5)
            pdf.set_x(pdf.l_margin+2)
            pdf.mcell(epw-2,5.5,f"•  {md_clean(mu.group(1))}",markdown=True); i+=1; continue
        # paragraph
        pdf.set_font("DejaVu","",10.5)
        pdf.mcell(0,5.5,md_clean(s),markdown=True); pdf.ln(1.2); i+=1

    pdf.output(OUT)
    print("PDF:",OUT,"| Tabellen:",table_no,"| Abbildungen:",fig_no,"| Seiten:",pdf.page_no())

if __name__=="__main__":
    main()
