import fitz
import os

couleur_bleu_rvb = (0.071, 0.208, 0.325)
couleur_blanche = (1.0, 1.0, 1.0)

rect_unique_a_effacer = fitz.Rect(10.0, 10.0, 84.3, 49.5)

X_depart = 14.0
Y_depart = 16.0
largeur_blanc = 70.5
hauteur_blanc = 50.5
rect_blanc = fitz.Rect(X_depart, Y_depart, X_depart + largeur_blanc, Y_depart + hauteur_blanc)

rect_fond_bleu_logo = fitz.Rect(14.5, 17.8, 84.7, 66)

X_insertion = 14.2
Y_insertion = 17.1
largeur_png = 70.3
hauteur_png = 49.2
rect_insertion = fitz.Rect(X_insertion, Y_insertion, X_insertion + largeur_png, Y_insertion + hauteur_png)

rect_bas_droite = fitz.Rect(198.0, 688.7, 198.0 + 377.1, 688.7 + 136.4)


def process_logo(source, dest, logo_path, ref_pdf_path=None, selected_files=None, progress_callback=None):
    if not os.path.exists(logo_path):
        raise FileNotFoundError(f"Logo introuvable : {logo_path}")

    if ref_pdf_path and not os.path.exists(ref_pdf_path):
        raise FileNotFoundError(f"PDF modèle introuvable : {ref_pdf_path}")

    os.makedirs(dest, exist_ok=True)
    total = 0
    processed = 0
    errors = []

    file_list = []
    for root, dirs, files in os.walk(source):
        for filename in files:
            if filename.lower().endswith('.pdf'):
                rel_path = os.path.relpath(os.path.join(root, filename), source)
                if selected_files is None or rel_path in selected_files:
                    file_list.append((root, filename))

    total = len(file_list)

    doc_ref = None
    if ref_pdf_path and os.path.exists(ref_pdf_path):
        doc_ref = fitz.open(ref_pdf_path)

    for root, filename in file_list:
        if progress_callback and progress_callback.is_cancelled():
            break

        doc_path = os.path.join(root, filename)
        rel_dir = os.path.relpath(root, source)
        display_path = filename if rel_dir == "." else os.path.join(rel_dir, filename)
        target_dir = os.path.join(dest, rel_dir)
        out_path = os.path.join(target_dir, filename)

        try:
            os.makedirs(target_dir, exist_ok=True)
            doc = fitz.open(doc_path)

            for page in doc:
                page.add_redact_annot(rect_unique_a_effacer)
                if doc_ref:
                    page.add_redact_annot(rect_bas_droite)
                
                page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_REMOVE)

                page.draw_rect(rect_blanc, color=couleur_blanche, fill=couleur_blanche, overlay=True)

                page.draw_rect(rect_fond_bleu_logo, color=couleur_bleu_rvb, fill=couleur_bleu_rvb, overlay=True)

                page.insert_image(rect_insertion, filename=logo_path, overlay=True)
                
                if doc_ref:
                    page.draw_rect(rect_bas_droite, color=couleur_blanche, fill=couleur_blanche, overlay=True)
                    page.show_pdf_page(rect_bas_droite, doc_ref, 0, clip=rect_bas_droite)

            doc.save(out_path, garbage=3, deflate=True)
            doc.close()
            processed += 1
            if progress_callback:
                progress_callback.on_file_done(display_path, True, None)
        except Exception as e:
            errors.append((display_path, str(e)))
            if progress_callback:
                progress_callback.on_file_done(display_path, False, str(e))
        finally:
            if progress_callback:
                progress_callback.on_progress(processed, total)

    if doc_ref:
        doc_ref.close()

    return processed, total, errors


if __name__ == '__main__':
    import sys
    source = sys.argv[1] if len(sys.argv) > 1 else r"D:\ANNEXES"
    dest = sys.argv[2] if len(sys.argv) > 2 else r"D:\ANNEXES CORRIGEES"
    logo = sys.argv[3] if len(sys.argv) > 3 else r"D:\logo.png"
    p, t, e = process_logo(source, dest, logo)
    print(f"Traités : {p}/{t}, Erreurs : {len(e)}")
    for f, msg in e:
        print(f"  ERREUR {f} : {msg}")
