#!/usr/bin/env python3
"""
Tiền xử lý toàn bộ trang PDF — Pali-Taykha
Thông số chuẩn: C=25, block=21, morph 3x3
"""
import cv2
import numpy as np
import os
import subprocess
import time

BASE = "/home/tuan-nguyen/.openclaw/workspace/010-pali-thaykha"
PDF  = os.path.join(BASE, "Pali-Taykha-page-001-044.pdf")
RAW  = os.path.join(BASE, "raw_pages")
OUT  = os.path.join(BASE, "cleaned")
os.makedirs(RAW, exist_ok=True)
os.makedirs(OUT, exist_ok=True)

# ── Thông số chuẩn ──
BLOCK_SIZE = 21
C_CONST    = 25
MORPH_K    = 3  # kernel 3x3

# ── Bước 1: Trích xuất tất cả trang từ PDF ──
print("📄 Trích xuất 44 trang từ PDF (300 DPI)...")
t0 = time.time()
subprocess.run([
    "pdftoppm", "-r", "300", "-png",
    PDF, os.path.join(RAW, "page")
], check=True)
t1 = time.time()
print(f"   ✅ Xong trong {t1-t0:.1f}s")

# ── Bước 2: Xử lý từng trang ──
pages = sorted(f for f in os.listdir(RAW) if f.endswith(".png"))
total = len(pages)
print(f"\n🖼️  Xử lý {total} trang...")

for i, fname in enumerate(pages, 1):
    in_path  = os.path.join(RAW, fname)
    out_path = os.path.join(OUT, fname)

    img = cv2.imread(in_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        print(f"   ⚠️  Trang {i}: không đọc được, bỏ qua")
        continue

    # Bilateral filter
    filtered = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)

    # Adaptive threshold
    thresh = cv2.adaptiveThreshold(
        filtered, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY,
        BLOCK_SIZE, C_CONST
    )

    # Morphology close
    kernel = np.ones((MORPH_K, MORPH_K), np.uint8)
    cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

    cv2.imwrite(out_path, cleaned)

    if i % 10 == 0 or i == total:
        elapsed = time.time() - t1
        print(f"   📄 {i}/{total} trang ({elapsed:.0f}s)")

t2 = time.time()

# ── Bước 3: Thống kê ──
raw_size  = sum(os.path.getsize(os.path.join(RAW, f)) for f in pages)
out_size  = sum(os.path.getsize(os.path.join(OUT, f)) for f in pages)

print(f"\n{'='*50}")
print(f"✅ Hoàn tất {total} trang trong {t2-t1:.0f}s")
print(f"📁 Raw:     {RAW}/  ({raw_size/1024/1024:.1f} MB)")
print(f"📁 Cleaned: {OUT}/ ({out_size/1024/1024:.1f} MB)")
print(f"📐 Tỉ lệ nén: {out_size/raw_size*100:.1f}%")
print(f"{'='*50}")
