"""Télécharge la photo retenue pour chaque lieu, la recadre en 3:2, la recompresse
et la stocke en data URI avec son crédit (auteur + licence + page source)."""
import json, subprocess, os, base64, re, html
from PIL import Image

PICKS = {
 "grand-popo": "Mono river estuary in Avloh, Grand-Popo, Benin.jpg",
 "ouidah":     "Porte du non-retour au Benin.jpg",
 "cotonou":    "Lever de soleil sur l'Esplanade de l'amazone à Cotonou.jpg",
 "ganvie":     "The village of Ganvié on Lake Nokoué.jpg",
 "porto-novo": "Grande Mosquée de Porto-Novo au Bénin 01.jpg",
 "aheme":      "Lac aheme à Guezin.jpg",
 "ketou":      "Gèlèdé masked dancer, Kétou, Benin.jpg",
 "lama":       "Natural forest of Lama in Benin.jpg",
 "abomey":     "Royal Palaces of Abomey-133471.jpg",
 "dassa":      "Vue de Dassa depuis la colline de Kamaté.jpg",
 "parakou":    "ParakouMosque.jpg",
 "nikki":      "Place publique pour la Gaani, Nikki, département du Borgou, Bénin.jpg",
 "djougou":    "Straßenbild djougou.JPG",
 "kota":       "Baignade aux chutes de Kota.jpg",
 "boukoumbe":  "Tata somba, la maison traditionnelle à étage.jpg",
 "natitingou": "Benin Natitingou.JPG",
 "tanougou":   "Chutes de Tanougou (2).jpg",
 "pendjari":   "Eléphants in Pendjari.jpg",
 "parc-w":     "Mekrou river in W-National Park MS 6380.JPG",
 "malanville": "On the edge from the Niger river, Malanville.jpg",
 "allada":     "Divinite-vodun-legba-lac-sacre-awouto-allada-benin.jpg",
 "dogbo":      "Salle d'accueil du site homme à queue à Dogbo (Bénin).jpg",
 "savalou":    "Monument à Savalou.jpg",
 "save":       "Les Collines de save .jpg",
 "tchaourou":  "Scène de marché, commune de Tchaourou 01.jpg",
 "taneka":     "L'entrée du village Tanéka Béri 1.jpg",
 "tanguieta":  "Entrée de la ville de Tanguiéta.jpg",
 "aeroport":   "Avion de la Royal Air Maroc à Cotonou 03.jpg",
 "port":       "Port autonome de Cotonou vu de haut (1).jpg",
}

cands = json.load(open("photo_candidates.json"))
by_title = {}
for lst in cands.values():
    for c in lst:
        by_title[c["title"]] = c

os.makedirs("photos", exist_ok=True)
W, H = 720, 480                      # 3:2, le cadrage fin est fait en CSS
Q_WEBP = 74                          # au-delà, le gain de poids ne se voit plus à l'écran


def cadre(im):
    """Redimensionne au plus juste puis rogne au centre, sans jamais compléter
    en noir — c'est le défaut de `sips -c` qui nous avait donné trois photos
    barrées de bandes noires."""
    sw, sh = im.size
    k = max(W / sw, H / sh)
    im = im.convert("RGB").resize((round(sw * k), round(sh * k)), Image.LANCZOS)
    x, y = (im.width - W) // 2, (im.height - H) // 2
    return im.crop((x, y, x + W, y + H))


out = {}
for sid, title in PICKS.items():
    c = by_title.get(title)
    if not c:
        print(f"!! {sid}: introuvable dans les candidats — {title}")
        continue
    raw = f"photos/{sid}.raw.jpg"
    web = f"photos/{sid}.webp"
    subprocess.run(["curl", "-sL", "-m", "90", "-A", "BeninMapBuilder/1.0",
                    "-o", raw, c["thumb"]], check=True)
    # On encode le WebP directement depuis l'original : passer par un JPEG
    # intermédiaire empilait deux compressions et coûtait ~30 % de poids.
    cadre(Image.open(raw)).save(web, "WEBP", quality=Q_WEBP, method=6)
    os.remove(raw)
    b = open(web, "rb").read()
    author = re.sub(r"\s+", " ", c["author"]).strip()
    out[sid] = {
        "src": "data:image/webp;base64," + base64.b64encode(b).decode(),
        "author": author,
        "license": c["license"],
        "page": c["page"],
        "title": title,
        "ko": round(len(b) / 1024, 1),
    }
    print(f"{sid:12s} {out[sid]['ko']:6.1f} ko  © {author[:34]:34s} {c['license']}")

json.dump(out, open("photos.json", "w"), ensure_ascii=False)
tot = sum(v["ko"] for v in out.values())
print(f"\n{len(out)} photos · {tot/1024:.2f} Mo bruts · ~{tot*1.34/1024:.2f} Mo en base64")
