from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase.pdfmetrics import stringWidth
from pathlib import Path

OUTDIR = Path('/home/agent/family/Lernen/Pruefungen_Emilia_4_Klasse/Mathe/_Neu_erstellte_Uebungsblaetter')
OUTDIR.mkdir(parents=True, exist_ok=True)
W, H = A4
M = 36

BLUE = colors.Color(0.58, 0.70, 0.92, alpha=0.45)
YELLOW = colors.Color(1.0, 0.93, 0.45)
GREEN = colors.Color(0.34, 0.70, 0.34)
DARK = colors.Color(0.08, 0.08, 0.08)
LIGHT = colors.Color(0.94,0.94,0.94)


def fit_text(c, text, x, y, max_width, font='Helvetica', size=10, leading=13):
    words = text.split()
    line = ''
    for w in words:
        cand = (line + ' ' + w).strip()
        if stringWidth(cand, font, size) <= max_width or not line:
            line = cand
        else:
            c.drawString(x,y,line); y -= leading; line = w
    if line:
        c.drawString(x,y,line); y -= leading
    return y


def grid(c, x, y, w, h, step=14):
    c.saveState()
    c.setStrokeColor(BLUE)
    c.setLineWidth(0.35)
    xx=x
    while xx <= x+w+0.1:
        c.line(xx,y,xx,y+h); xx += step
    yy=y
    while yy <= y+h+0.1:
        c.line(x,yy,x+w,yy); yy += step
    c.restoreState()


def header(c, code, title, subtitle='', mins='40 min', points=''):
    c.setStrokeColor(DARK); c.setLineWidth(1)
    c.rect(M, H-75, W-2*M, 42)
    c.setFont('Helvetica-Bold', 13)
    c.drawString(M+8, H-52, code)
    c.line(M+75, H-75, M+75, H-33)
    c.setFont('Helvetica-Bold', 10)
    c.drawString(M+84, H-48, title)
    c.setFont('Helvetica', 8)
    if subtitle: c.drawString(M+84, H-61, subtitle)
    c.line(W-205, H-75, W-205, H-33)
    c.setFont('Helvetica', 9)
    c.drawCentredString(W-178, H-55, mins)
    c.line(W-150, H-75, W-150, H-33)
    c.drawString(W-140, H-55, 'Name: __________________')
    if points:
        c.drawRightString(W-M-5, H-86, points)


def side_band(c, label='Grundanforderungen', color=YELLOW):
    c.saveState()
    c.setFillColor(color)
    c.rect(M-18, 80, 12, H-170, stroke=0, fill=1)
    c.setFillColor(DARK); c.setFont('Helvetica', 7)
    c.translate(M-9, H/2)
    c.rotate(90)
    c.drawCentredString(0, -2, label)
    c.restoreState()


def footer(c, page, total=4):
    c.setFont('Helvetica',8); c.setFillColor(colors.grey)
    c.drawRightString(W-M, 24, f'Seite {page}/{total} – neu erstelltes Übungsblatt auf Basis der Original-LZK, ohne Lösungen')
    c.setFillColor(DARK)


def ex_title(c, n, text, pts=None, y=None):
    """Draw an exercise title, wrapping before the points column."""
    c.setFont('Helvetica-Bold', 10.0)
    if y is None:
        return None
    prefix = f'{n}. '
    x = M
    max_width = W - 2*M - (42 if pts else 0)
    words = text.split()
    line = prefix
    first = True
    for w in words:
        cand = (line + ' ' + w).strip()
        if stringWidth(cand, 'Helvetica-Bold', 10.0) <= max_width or line == prefix:
            line = cand
        else:
            c.drawString(x, y, line)
            y -= 13
            line = '   ' + w
            first = False
    c.drawString(x, y, line)
    if pts:
        c.drawRightString(W-M, y, pts)
    return y-18


def blank_line(c, x, y, width=80):
    c.line(x, y-2, x+width, y-2)


def mult_pdf(path):
    c=canvas.Canvas(str(path), pagesize=A4)
    # Page 1
    header(c,'LZK 4.12','Textaufgaben / Schriftliche Multiplikation','Rechenstrategien Multiplikation', '40 min')
    side_band(c)
    y=H-105
    y=ex_title(c,1,'Ergänze die fehlenden Zahlen im Rechenprotokoll.', '4 P.', y)
    c.setFont('Helvetica',10)
    for col,(label,expr,rows) in enumerate([
        ('a)','4 · 3508 = ______',[('4 · 3000 =','________'),('4 · 500 =','________'),('4 · 8 =','________'),('Summe =','________')]),
        ('b)','7 · 8179 = ______',[('7 · 8000 =','________'),('7 · 100 =','________'),('7 · 70 =','________'),('7 · 9 =','________'),('Summe =','________')])]):
        x=M+20+col*260
        c.drawString(x,y,label); c.drawString(x+25,y,expr)
        grid(c,x+20,y-128,210,112)
        yy=y-28
        for a,b in rows:
            c.drawString(x+35,yy,a); c.drawString(x+130,yy,b); yy-=21
    c.setFont('Helvetica-Bold',10)
    c.drawString(M, y-170, 'Hinweis: Zerlege die Zahl in Stellenwerte und addiere die Teilprodukte.')
    grid(c,M,y-360,W-2*M,160)
    footer(c,1); c.showPage()

    # Page 2
    header(c,'LZK 4.12','Textaufgaben / Schriftliche Multiplikation','Strategie wählen', '40 min')
    side_band(c)
    y=H-105
    y=ex_title(c,2,'Wähle eine geeignete Strategie und rechne aus. Du kannst im Kopf, mit Notizen oder schriftlich rechnen.', '3 P.', y)
    tasks=['a) 4 · 20 500 = __________','b) 9 · 65 201 = __________','c) 6 · 27 083 = __________','d) 5 · 30 007 = __________','e) 2 · 321 111 = __________','f) 6 · 39 999 = __________']
    c.setFont('Helvetica',10)
    for i,t in enumerate(tasks):
        x=M+(i%2)*260; yy=y-(i//2)*28
        c.drawString(x,yy,t)
    grid(c,M,90,W-2*M,520)
    footer(c,2); c.showPage()

    # Page 3
    header(c,'LZK 4.12','Textaufgaben / Schriftliche Multiplikation','Schriftlich multiplizieren', '40 min')
    side_band(c)
    y=H-105
    y=ex_title(c,3,'Rechne schriftlich. Schreibe jede Ziffer in ein Häuschen und benutze dein Lineal zum Unterstreichen!', '4 P.', y)
    c.setFont('Helvetica',11)
    tasks=['a) 3 · 718','b) 4 · 6672','c) 6 · 35 490','d) 5 · 81 296']
    for i,t in enumerate(tasks):
        c.drawString(M+i*130,y,t)
    grid(c,M,90,W-2*M,560)
    footer(c,3); c.showPage()

    # Page 4
    header(c,'LZK 4.12','Textaufgaben / Schriftliche Multiplikation','Fehlende Ziffern', '40 min')
    side_band(c, 'erweiterte Anforderungen', GREEN)
    y=H-105
    y=ex_title(c,4,'Ergänze die fehlenden Ziffern.', '2 P.', y)
    c.setFont('Helvetica',12)
    puzzles=[('a)','2 · 7?8 = 1?76'),('b)','7 · 28?7 = 19 649'),('c)','? · 7726 = 30 904'),('d)','9 · 8?3 = 7?57')]
    for i,(lab,p) in enumerate(puzzles):
        x=M+(i%2)*255; yy=y-(i//2)*95
        c.drawString(x,yy,lab); c.drawString(x+28,yy,p)
        grid(c,x+28,yy-62,190,50)
    c.setFont('Helvetica',10)
    c.drawString(M, 360, 'Zusatz: Erfinde selbst eine Aufgabe mit einer fehlenden Ziffer und löse sie.')
    grid(c,M,130,W-2*M,210)
    c.line(M,75,W-M,75); c.setFont('Helvetica',9); c.drawString(M,58,'Unterschrift Eltern: _________________________')
    footer(c,4); c.save()


def div_pdf(path):
    c=canvas.Canvas(str(path), pagesize=A4)
    # P1
    header(c,'LZK 4.13','Rechenstrategien Division / Schriftliche Division','Flexibel rechnen', '35 min')
    side_band(c)
    y=H-105
    y=ex_title(c,1,'Ergänze die fehlenden Zahlen im Rechenprotokoll.', '4 P.', y)
    c.setFont('Helvetica',10)
    for col,(lab,expr,rows) in enumerate([
        ('a)','3840 : 6 = ______',[('3600 : 6 =','________'),('240 : 6 =','________'),('Summe =','________')]),
        ('b)','16 192 : 8 = ______',[('16 000 : 8 =','________'),('192 : 8 =','________'),('Summe =','________')])]):
        x=M+20+col*260
        c.drawString(x,y,lab); c.drawString(x+25,y,expr)
        grid(c,x+20,y-112,210,95)
        yy=y-32
        for a,b in rows:
            c.drawString(x+35,yy,a); c.drawString(x+130,yy,b); yy-=24
    y2=y-160
    y2=ex_title(c,2,'Wähle ein geeignetes Vorgehen und rechne aus. Du kannst im Kopf, mit Notizen oder schriftlich rechnen.', '6 P.', y2)
    tasks=['a) 39 996 : 4 = __________','b) 180 000 : 6 = __________','c) 99 666 : 3 = __________','d) 116 945 : 5 = __________','e) 42 256 : 8 = __________','f) 140 140 : 7 = __________']
    c.setFont('Helvetica',10)
    for i,t in enumerate(tasks):
        x=M+(i%2)*260; yy=y2-(i//2)*25
        c.drawString(x,yy,t)
    grid(c,M,85,W-2*M,270)
    footer(c,1); c.showPage()

    # P2
    header(c,'LZK 4.13','Rechenstrategien Division / Schriftliche Division','Schriftlich dividieren', '35 min')
    side_band(c)
    y=H-105
    y=ex_title(c,3,'Rechne schriftlich. Schreibe jede Ziffer in ein Häuschen und benutze dein Lineal zum Unterstreichen!', '2 P.', y)
    c.setFont('Helvetica',11)
    c.drawString(M,y,'a) 6608 : 4 = __________')
    c.drawString(M+270,y,'b) 7535 : 5 = __________')
    grid(c,M,390,W-2*M,270)
    y=355
    y=ex_title(c,4,'Rechne aus. Überlege zuerst, wie du vorgehen willst.', '3 P.', y)
    c.setFont('Helvetica',10)
    for i,t in enumerate(['a) 1000 + 25 + 25 + 25 + 25 + 50 + 50 + 100 = __________',
                         'b) 700 - 30 - 30 - 30 - 30 - 600 = __________',
                         'c) 800 - 35 + 15 - 35 + 15 - 35 + 15 = __________']):
        c.drawString(M,y-i*28,t)
    grid(c,M,85,W-2*M,170)
    footer(c,2); c.showPage()

    # P3
    header(c,'LZK 4.13','Rechenstrategien Division / Schriftliche Division','Flexibel rechnen und Rest', '35 min')
    side_band(c, 'Grundanforderungen / erweiterte Anforderungen', GREEN)
    y=H-105
    y=ex_title(c,5,'Rechne aus. Überlege zuerst, wie du vorgehen willst.', '4 P.', y)
    tasks=['a) 3 · 40 · 5 = __________','b) 2 · 24 · 50 = __________','c) 2 · 8 · 20 = __________','d) 5 · 10 · 4 · 3 = __________']
    c.setFont('Helvetica',10)
    for i,t in enumerate(tasks):
        x=M+(i%2)*260; yy=y-(i//2)*28
        c.drawString(x,yy,t)
    grid(c,M,390,W-2*M,230)
    y=350
    y=ex_title(c,6,'Dividiere mit und ohne Rest.', '4 P.', y)
    c.setFont('Helvetica',11)
    c.drawString(M,y,'a) 238 360 : 7 = ____________________')
    c.drawString(M+270,y,'b) 406 376 : 8 = ____________________')
    grid(c,M,85,W-2*M,225)
    footer(c,3); c.showPage()

    # P4
    header(c,'LZK 4.13','Rechenstrategien Division / Schriftliche Division','Monsterzahl und Umkehraufgabe', '35 min')
    side_band(c, 'erweiterte Anforderungen', GREEN)
    y=H-105
    y=ex_title(c,7,'Löse diese Division mit einer Monsterzahl. Schreibe sauber und jede Ziffer in ein Häuschen.', '2 P.', y)
    c.setFont('Helvetica',12)
    c.drawString(M,y,'574 689 521 : 7 = __________________________________')
    grid(c,M,365,W-2*M,275)
    y=330
    y=ex_title(c,8,'Finde die gesuchte Zahl. Achtung: Ohne Lösungsweg erhältst du keine Punkte!', '2 P.', y)
    c.setFont('Helvetica',10)
    text='Wenn ich die gesuchte Zahl mit 4 multipliziere, das Resultat zuerst durch 5 dividiere und dann durch 2 dividiere, erhalte ich 500.'
    fit_text(c,text,M,y,W-2*M,size=10,leading=14)
    grid(c,M,85,W-2*M,170)
    c.line(M,58,W-M,58); c.setFont('Helvetica',9); c.drawString(M,42,'Unterschrift Eltern: _________________________')
    footer(c,4); c.save()

mult_path = OUTDIR/'Mathe_Valerie_Uebungsblatt_LZK_4_12_Textaufgaben_Schriftliche_Multiplikation_neu.pdf'
div_path = OUTDIR/'Mathe_Valerie_Uebungsblatt_LZK_4_13_Schriftliche_Division_Monsterzahl_neu.pdf'
mult_pdf(mult_path)
div_pdf(div_path)
print(mult_path)
print(div_path)
