"""Copia una foto dell'archivio applicando l'orientamento EXIF.

Alcuni scatti hanno il tag 274 diverso da 1, cioe' sono girati e la rotazione e'
scritta nei metadati invece che nei pixel. Chrome la interpreta a modo suo e il
ritaglio delle slide esce storto. Si scrive la rotazione nei pixel una volta per
tutte, e il tag sparisce.
"""
import os, shutil, sys
from PIL import Image, ImageOps


def copia(sorgente, destinazione, applica=True):
    """applica=True ruota i pixel secondo il tag EXIF (il caso normale).

    applica=False toglie il tag e lascia i pixel come sono: serve quando il tag
    mente, come su "Between Two Cities - 02", dove i pixel sono gia' dritti e
    l'etichetta dice di girare. Chrome all'etichetta crede, e la slide esce storta.
    """
    im = Image.open(sorgente)
    orient = im.getexif().get(274, 1)
    if orient == 1:
        shutil.copy(sorgente, destinazione)
        return orient
    dritta = ImageOps.exif_transpose(im) if applica else im
    dati = list(dritta.convert("RGB").getdata())
    pulita = Image.new("RGB", dritta.size)
    pulita.putdata(dati)              # senza EXIF: nessuno la ruota piu'
    pulita.save(destinazione, quality=95)
    return orient


def controlla(cartella):
    """Elenca le foto con un orientamento da correggere, anche nelle sottocartelle.

    L'archivio dal 2026-09-07 ha una cartella per gioco, quindi si scende di un
    livello. Il nome restituito e' relativo a `cartella`.
    """
    fuori = []
    for radice, _, files in os.walk(cartella):
        for f in sorted(files):
            if not f.lower().endswith(".jpg"):
                continue
            try:
                o = Image.open(os.path.join(radice, f)).getexif().get(274, 1)
            except Exception:
                continue
            if o != 1:
                fuori.append((os.path.relpath(os.path.join(radice, f), cartella), o))
    return fuori


if __name__ == "__main__":
    if len(sys.argv) == 3:
        print("orientamento originale:", copia(sys.argv[1], sys.argv[2]))
    else:
        storte = controlla(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "archivio"))
        print(f"foto con orientamento da correggere: {len(storte)}")
        for f, o in storte[:40]:
            print(f"   {o}  {f}")
