# -*- coding: utf-8 -*-
"""
Face cele sase fisiere din setul de proba `documente-v1`.

⛔ Fisierele NU se scriu de mana si NU se editeaza dupa. Se regenereaza cu scriptul asta, ca sa
   fie identice pentru toata lumea si de fiecare data. Vezi PROBA.md.

Ruleaza:  python fa_intrari.py
Iese in:  _probe/documente-v1/
"""

import os
import fitz  # PyMuPDF

AICI = os.path.dirname(os.path.abspath(__file__))
IESIRE = os.path.join(AICI, "documente-v1")
os.makedirs(IESIRE, exist_ok=True)

NEGRU = (0.05, 0.13, 0.11)
GRI = (0.35, 0.40, 0.38)


def pagina_noua(doc, titlu):
    p = doc.new_page(width=595, height=842)  # A4
    p.insert_text((56, 70), titlu, fontsize=17, fontname="hebo", color=NEGRU)
    p.draw_line(fitz.Point(56, 82), fitz.Point(539, 82), color=GRI, width=0.7)
    return p


def scrie(p, y, text, marime=10.5, font="helv", culoare=NEGRU):
    p.insert_text((56, y), text, fontsize=marime, fontname=font, color=culoare)
    return y + marime + 5


# ---------------------------------------------------------------- 1. simplu
def unu():
    doc = fitz.open()
    for i in range(1, 6):
        p = pagina_noua(doc, "Sectiunea %d. Instructiuni de utilizare" % i)
        y = 120
        for r in range(18):
            y = scrie(p, y, "Rand %d. Text simplu, fara nimic special, doar ca sa existe volum "
                            "si sa se poata numara ce a intrat si ce a iesit." % (r + 1))
        p.insert_text((56, 800), "pagina %d din 5" % i, fontsize=8, color=GRI)
    doc.save(os.path.join(IESIRE, "1-simplu.pdf"))
    doc.close()
    return "1-simplu.pdf", "document simplu, text curat, 5 pagini", "sa iasa perfect"


# ---------------------------------------------------------------- 2. tabele
def doi():
    doc = fitz.open()
    randuri = [("Cod", "Denumire", "Tensiune", "Curent", "Masa"),
               ("A-101", "Motor principal", "230 V", "4,2 A", "3,10 kg"),
               ("A-102", "Motor auxiliar", "230 V", "1,8 A", "1,45 kg"),
               ("B-201", "Placa de comanda", "24 V", "0,6 A", "0,22 kg"),
               ("B-202", "Senzor de temperatura", "5 V", "0,02 A", "0,04 kg"),
               ("C-310", "Cablu de alimentare", "-", "-", "0,80 kg")]
    lat = [70, 190, 80, 70, 80]
    for pag in range(1, 4):
        p = pagina_noua(doc, "Tabelul %d. Date tehnice" % pag)
        y = 120
        for idx in range(14):  # tabel care curge pe mai multe pagini
            r = randuri[idx % len(randuri)]
            x = 56
            gros = "hebo" if idx % len(randuri) == 0 else "helv"
            for celula, w in zip(r, lat):
                p.insert_text((x + 3, y), celula, fontsize=9.5, fontname=gros, color=NEGRU)
                x += w
            p.draw_line(fitz.Point(56, y + 4), fitz.Point(56 + sum(lat), y + 4), color=GRI, width=0.35)
            y += 20
        x = 56
        for w in lat + [0]:
            p.draw_line(fitz.Point(x, 110), fitz.Point(x, y - 16), color=GRI, width=0.35)
            x += w
    doc.save(os.path.join(IESIRE, "2-tabele.pdf"))
    doc.close()
    return "2-tabele.pdf", "tabele pe mai multe pagini", "tabelele intregi, nu rupte"


# ---------------------------------------------------------------- 3. text in imagini
def trei():
    """Textul e DESENAT, nu scris ca text — adica nu se poate extrage, trebuie citit din imagine.
       Asta e capcana care lasa figurile netraduse la aproape toata lumea."""
    doc = fitz.open()
    for pag in range(1, 3):
        p = pagina_noua(doc, "Figura %d. Schema de montaj" % pag)
        # desenul
        p.draw_rect(fitz.Rect(90, 140, 300, 300), color=NEGRU, width=1.2)
        p.draw_rect(fitz.Rect(340, 140, 500, 240), color=NEGRU, width=1.2)
        p.draw_line(fitz.Point(300, 200), fitz.Point(340, 200), color=NEGRU, width=1.2)
        p.draw_circle(fitz.Point(195, 360), 34, color=NEGRU, width=1.2)
        # "text" desenat ca parte din figura
        for punct, eticheta in (((110, 165), "CARCASA PRINCIPALA"), ((355, 165), "MODUL DE COMANDA"),
                                ((150, 420), "SURUB M6 (4 buc.)"), ((110, 275), "ATENTIE: 230 V")):
            p.insert_text(punct, eticheta, fontsize=9, fontname="hebo", color=NEGRU,
                          render_mode=0)
        p.insert_text((56, 520), "Textul de mai sus face parte din figura. O traducere care nu se "
                                 "uita in imagine il lasa neatins.", fontsize=9.5, color=GRI)
    # Transform paginile in imagini, ca sa nu mai existe strat de text deloc.
    # ⚠️ JPEG la 110 dpi, nu PNG la 150: cu PNG fisierul iesea de 12,7 MB, adica de 190 de ori
    #    mai mare decat trebuie. Un set de proba pe care nu-l poate descarca nimeni nu e un set.
    imagini = fitz.open()
    for p in doc:
        pix = p.get_pixmap(dpi=110)
        jpg = pix.tobytes("jpeg", jpg_quality=78)
        np = imagini.new_page(width=595, height=842)
        np.insert_image(fitz.Rect(0, 0, 595, 842), stream=jpg)
    imagini.save(os.path.join(IESIRE, "3-text-in-imagini.pdf"), deflate=True)
    imagini.close()
    doc.close()
    return "3-text-in-imagini.pdf", "text desenat in figuri, fara strat de text", "textul din desene, tratat"


# ---------------------------------------------------------------- 4. diacritice
def patru():
    doc = fitz.open()
    p = pagina_noua(doc, "Verificare de caractere")
    y = 120
    linii = [
        "Romana:  a a i s t   A A I S T   (a-caciula, a-din-a, i-din-i, s-virgula, t-virgula)",
        "Reale:   ă â î ș ț   Ă Â Î Ș Ț",
        "Gresite: ş ţ Ş Ţ   (s si t cu sedila, NU cu virgula - capcana clasica)",
        "Germana: ä ö ü ß      Franceza: é è ê ç à",
        "Semne:   °C  ±  ×  –  —  „”  «»  µm  Ω  €",
        "Cifre:   0,5 kg   1.200 buc   3,14   10³   45°",
    ]
    for l in linii:
        y = scrie(p, y, l, 11)
        y += 6
    y += 14
    y = scrie(p, y, "Daca vreunul din caracterele de mai sus lipseste sau se schimba in altceva,", 10, culoare=GRI)
    y = scrie(p, y, "proba a picat la punctul 4. Nu e o chestie de finete: un manual in romana", 10, culoare=GRI)
    scrie(p, y, "fara diacritice arata a facut in graba.", 10, culoare=GRI)
    doc.save(os.path.join(IESIRE, "4-diacritice.pdf"))
    doc.close()
    return "4-diacritice.pdf", "diacritice si caractere speciale", "niciun caracter pierdut"


# ---------------------------------------------------------------- 5. mare
def cinci():
    doc = fitz.open()
    sectiuni = ["Introducere", "Continutul pachetului", "Date tehnice", "Montaj",
                "Punere in functiune", "Utilizare zilnica", "Intretinere", "Depanare",
                "Piese de schimb", "GARANTIE", "Conformitate", "Contact"]
    nr_fig = 0
    for i, s in enumerate(sectiuni):
        for sub in range(5):
            p = pagina_noua(doc, "%d.%d %s" % (i + 1, sub + 1, s))
            y = 120
            for r in range(14):
                y = scrie(p, y, "Paragraf %d din sectiunea %s. Text de umplutura cu volum realist." % (r + 1, s))
            if sub % 2 == 0:
                nr_fig += 1
                p.draw_rect(fitz.Rect(56, y + 10, 300, y + 130), color=GRI, width=0.8)
                p.insert_text((62, y + 145), "Figura %d" % nr_fig, fontsize=9, fontname="hebo", color=NEGRU)
            p.insert_text((56, 800), "pagina %d" % (len(doc)), fontsize=8, color=GRI)
    doc.save(os.path.join(IESIRE, "5-mare.pdf"))
    n = len(doc)
    doc.close()
    return "5-mare.pdf", "document mare: %d pagini, %d figuri" % (n, nr_fig), "sa termine, fara sectiuni pierdute"


# ------------------------------------------------- 6 si 7. CAZURILE CARE TREBUIE SA PICE
#
# ⛔ MASURAT PE 13 SEP 2026, si a schimbat proiectul probei:
#    un cititor de PDF aproape NICIODATA nu refuza. Repara si intoarce ceva.
#      taiat la 55%  -> se deschide, 6330 din 6345 caractere (99,8%)
#      taiat la 30%  -> se deschide, 52% din text
#      taiat la  8%  -> se deschide, 9,6% din text
#      taiat la  4%  -> se deschide, raporteaza "5 pagini", are 39 de caractere
#      octeti amestecati -> se deschide, 8460 de caractere, adica GUNOI mai lung ca originalul
#      antet distrus -> 0 pagini
# 🔑 Deci intrebarea corecta nu e "refuza?", ci "observa ca lipseste continut?".
#    O unealta care verifica doar "s-a deschis" si "cate pagini" raporteaza SUCCES pe un
#    fisier din care a mai ramas 0,6%.

def sase():
    """Se deschide, zice ca are 5 pagini, dar din text a mai ramas sub 1%.
       Unealta trebuie sa OBSERVE ca lipseste continutul. Sa raporteze succes = a picat."""
    date = open(os.path.join(IESIRE, "1-simplu.pdf"), "rb").read()
    taiat = date[: int(len(date) * 0.04)]
    open(os.path.join(IESIRE, "6-golit.pdf"), "wb").write(taiat)
    return ("6-golit.pdf",
            "taiat la 4%% (%d din %d octeti) - SE DESCHIDE, dar e gol pe dinauntru" % (len(taiat), len(date)),
            "sa OBSERVE ca lipseste continut. Succes raportat = proba a picat")


def sapte():
    """Antetul distrus: aici chiar nu mai e nimic de recuperat, zero pagini."""
    date = open(os.path.join(IESIRE, "1-simplu.pdf"), "rb").read()
    open(os.path.join(IESIRE, "7-fara-antet.pdf"), "wb").write(b"%PDF-1.7\n" + date[200:])
    return ("7-fara-antet.pdf", "antet inlocuit: zero pagini recuperabile",
            "TREBUIE SA REFUZE clar")


if __name__ == "__main__":
    rezultate = [unu(), doi(), trei(), patru(), cinci(), sase(), sapte()]
    print("Setul documente-v1, in %s\n" % IESIRE)
    for i, (nume, ce, astept) in enumerate(rezultate, 1):
        k = os.path.getsize(os.path.join(IESIRE, nume)) / 1024.0
        print("  %d. %-24s %7.1f KB   %s" % (i, nume, k, ce))
        print("     asteptat: %s" % astept)
