import fitz  # PyMuPDF
from PIL import Image
import io
import os
import shutil

# --- VAŠE VÍTĚZNÉ NASTAVENÍ ---
CHOSEN_DPI = 150
CHOSEN_THRESHOLD = 150

# Cesty
INPUT_FOLDER = r'u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller'
OUTPUT_SUBFOLDER = '_HOTOVO'


def process_all_files():
    # Vytvoření výstupní složky
    output_dir = os.path.join(INPUT_FOLDER, OUTPUT_SUBFOLDER)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # Nalezení všech PDF (ignorujeme již hotové v podsložkách)
    files = [f for f in os.listdir(INPUT_FOLDER) if f.lower().endswith('.pdf')]

    print(f"Startuji zpracování {len(files)} souborů.")
    print(f"Nastavení: DPI={CHOSEN_DPI}, Práh={CHOSEN_THRESHOLD}")
    print("-" * 60)

    success_count = 0

    for filename in files:
        input_path = os.path.join(INPUT_FOLDER, filename)

        # Přidáme '_bw' do názvu, aby se to nepletlo
        name_without_ext = os.path.splitext(filename)[0]
        output_filename = f"{name_without_ext}_bw.pdf"
        output_path = os.path.join(output_dir, output_filename)

        try:
            # Zpracování jednoho souboru
            process_single_pdf(input_path, output_path)

            # Výpis výsledku
            orig_size = os.path.getsize(input_path) / 1024
            new_size = os.path.getsize(output_path) / 1024
            ratio = (1 - (new_size / orig_size)) * 100

            print(f"[OK] {filename}")
            print(f"     {orig_size:.1f} kB -> {new_size:.1f} kB (úspora {ratio:.0f} %)")
            success_count += 1

            # --- VOLITELNÉ: SMAZÁNÍ ORIGINÁLU ---
            # Pokud chcete, aby skript po úspěchu smazal původní velký soubor,
            # odkomentujte následující řádek (odstraňte mřížku #):
            # os.remove(input_path)

        except Exception as e:
            print(f"[CHYBA] {filename}: {e}")

    print("-" * 60)
    print(f"Hotovo. Úspěšně zpracováno {success_count} z {len(files)} souborů.")
    print(f"Výstupy jsou ve složce: {output_dir}")


def process_single_pdf(input_path, output_path):
    doc = fitz.open(input_path)
    new_doc = fitz.open()

    for page in doc:
        # 1. Renderování stránky (Downsampling na 150 DPI)
        zoom = CHOSEN_DPI / 72
        matrix = fitz.Matrix(zoom, zoom)
        pix = page.get_pixmap(matrix=matrix, colorspace=fitz.csGRAY)

        # 2. Binarizace (Threshold 150)
        img = Image.frombytes("L", [pix.width, pix.height], pix.samples)
        img_bw = img.point(lambda x: 255 if x > CHOSEN_THRESHOLD else 0, mode='1')

        # 3. Uložení 1-bitového obrázku
        buffer = io.BytesIO()
        img_bw.save(buffer, format="PNG", optimize=True)

        # 4. Vložení do nového PDF
        # Zachováme fyzické rozměry stránky (aby se netiskla jako známka)
        new_page = new_doc.new_page(width=page.rect.width, height=page.rect.height)
        new_page.insert_image(page.rect, stream=buffer.getvalue())

    # Uložení s maximální kompresí
    new_doc.save(output_path, garbage=4, deflate=True)
    new_doc.close()
    doc.close()


if __name__ == "__main__":
    process_all_files()