"""
Konverze JPG/PNG → PDF se správnou orientací stránky (A4).

Řeší:
- EXIF orientaci (fotky z telefonu/skeneru bývají otočené)
- Správné umístění na A4 stránce (na výšku nebo na šířku dle obsahu)
- Zachování kvality

Použití:
  python jpg_to_pdf.py soubor.jpg
  python jpg_to_pdf.py soubor.jpg vystup.pdf
"""

import io
import sys
from pathlib import Path

from PIL import Image, ImageOps

# A4 rozměry v mm
A4_W_MM = 210
A4_H_MM = 297
MARGIN_MM = 0  # bez okraje, tisk si řeší Acrobat (Fit to Print)


def fix_orientation(img: Image.Image) -> Image.Image:
    """Opraví rotaci podle EXIF dat (tag 274)."""
    return ImageOps.exif_transpose(img)


def image_to_pdf(src: Path, dst: Path, dpi: int = 150, quality: int = 80, rotate_ccw: int = 0):
    img = Image.open(src)
    print(f"  Originál: {img.size[0]}×{img.size[1]} px, mode={img.mode}, format={img.format}")

    # 1. Oprav EXIF orientaci
    img = fix_orientation(img)
    print(f"  Po EXIF korekci: {img.size[0]}×{img.size[1]} px")

    # 2. Rotace dle parametru (od Claude nebo ručně)
    if rotate_ccw and rotate_ccw != 0:
        img = img.rotate(rotate_ccw, expand=True)
        print(f"  Po rotaci {rotate_ccw}° CCW: {img.size[0]}×{img.size[1]} px")

    # 2. Převeď na RGB (PDF nepodporuje RGBA/P)
    if img.mode in ("RGBA", "P", "LA"):
        img = img.convert("RGB")

    # 3. Urči orientaci stránky podle poměru stran obrázku
    img_w, img_h = img.size
    if img_w > img_h:
        # Obrázek na šířku → stránka na šířku (A4 landscape)
        page_w_mm, page_h_mm = A4_H_MM, A4_W_MM
        print(f"  Orientace stránky: na šířku (landscape)")
    else:
        # Obrázek na výšku → stránka na výšku (A4 portrait)
        page_w_mm, page_h_mm = A4_W_MM, A4_H_MM
        print(f"  Orientace stránky: na výšku (portrait)")

    # 4. Vypočti cílovou velikost s okrajem (mm → px při daném DPI)
    mm_to_px = dpi / 25.4
    max_w_px = int((page_w_mm - 2 * MARGIN_MM) * mm_to_px)
    max_h_px = int((page_h_mm - 2 * MARGIN_MM) * mm_to_px)

    # 5. Škáluj obrázek na stránku (zachovej poměr stran)
    img.thumbnail((max_w_px, max_h_px), Image.LANCZOS)
    print(f"  Výsledná velikost obrázku: {img.size[0]}×{img.size[1]} px")

    # 6. Vlož obrázek na bílé A4 plátno
    page_w_px = int(page_w_mm * mm_to_px)
    page_h_px = int(page_h_mm * mm_to_px)
    canvas = Image.new("RGB", (page_w_px, page_h_px), "white")

    offset_x = (page_w_px - img.size[0]) // 2
    offset_y = (page_h_px - img.size[1]) // 2
    canvas.paste(img, (offset_x, offset_y))

    # 7. Ulož jako PDF
    canvas.save(dst, "PDF", resolution=dpi, quality=quality)
    print(f"  ✓ Uloženo: {dst.name}  ({dst.stat().st_size // 1024} KB)")


if __name__ == "__main__":
    if sys.platform == "win32":
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
        sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace")

    if len(sys.argv) < 2:
        print("Použití: python jpg_to_pdf.py soubor.jpg [vystup.pdf] [rotace_ccw]")
        print("  rotace_ccw: 0 / 90 / 180 / 270 (výchozí: 0)")
        sys.exit(1)

    src = Path(sys.argv[1])
    if not src.exists():
        print(f"Soubor nenalezen: {src}")
        sys.exit(1)

    dst = Path(sys.argv[2]) if len(sys.argv) > 2 else src.with_suffix(".pdf")
    rotate_ccw = int(sys.argv[3]) if len(sys.argv) > 3 else 0

    print(f"Konvertuji: {src.name} → {dst.name}")
    image_to_pdf(src, dst, rotate_ccw=rotate_ccw)
