# -*- coding: utf-8 -*-
"""Assemble le site jury : copie les pièces, calcule tailles/pages, écrit data/candidatures.json."""
import json, shutil, subprocess, re, unicodedata, pathlib, sys
sys.path.insert(0, str(pathlib.Path(__file__).parent))
from dossiers import DOSSIERS, CATEGORIES

S = pathlib.Path('/tmp/claude-0/-home-claude/20b1cbe4-c861-5948-bdb4-2af2c7a33d7a/scratchpad')
SRC = pathlib.Path('/mnt/user-data/uploads/CANDIDATURES')
MEDIA = S / 'web-media'
EXTRACT = S / 'extract'
DESIGN = S / 'design'
OUT = S / 'site'

# ordre de réception (date du formulaire sur le disque partagé)
ORDRE = ["emma-barme", "soofut", "petitbag", "hakoona-matata", "living-museum", "mosaique-nantes",
         "hamadryade", "tzcld", "bm-conseil", "enedis-formation", "groupe-sf", "enedis-partenariat", "mobisafe"]

def slug(s):
    s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode()
    s = re.sub(r'[^A-Za-z0-9.]+', '-', s).strip('-').lower()
    return re.sub(r'-+', '-', s)

def taille(p):
    n = p.stat().st_size
    return f"{n/1024/1024:.1f} Mo".replace('.', ',') if n > 1024*1024 else f"{max(1, round(n/1024))} Ko"

def pages(p):
    out = subprocess.run(['pdfinfo', str(p)], capture_output=True, text=True).stdout
    m = re.search(r'Pages:\s+(\d+)', out)
    return int(m.group(1)) if m else None

def put(src_path, did, name=None):
    d = OUT / 'dossiers' / did
    d.mkdir(parents=True, exist_ok=True)
    dst = d / (name or slug(src_path.name))
    shutil.copy2(src_path, dst)
    return dst, f"dossiers/{did}/{dst.name}"

if OUT.exists():
    shutil.rmtree(OUT / 'dossiers', ignore_errors=True)
    (OUT / 'data').mkdir(parents=True, exist_ok=True)
else:
    (OUT / 'data').mkdir(parents=True)

out_dossiers = []
for x in sorted(DOSSIERS, key=lambda d: ORDRE.index(d['id'])):
    did = x['id']
    y = {k: v for k, v in x.items() if k not in ('dossierPdf', 'annexes', 'logo')}
    y.setdefault('autresCategories', []); y.setdefault('voirAussi', []); y.setdefault('note', '')
    # logo
    y['logo'] = ''
    if x.get('logo'):
        p = SRC / x['logo']
        ext = p.suffix.lower().replace('jpeg', 'jpg')
        _, rel = put(p, did, 'logo' + ext); y['logo'] = rel
    # dossier original
    p = SRC / x['dossierPdf']
    dst, rel = put(p, did, 'dossier-candidature.pdf')
    y['dossierPdf'] = {"fichier": rel, "pages": pages(dst), "taille": taille(dst)}
    # annexes
    a = x['annexes']; na = {"videos": [], "images": [], "liens": list(a.get('liens', [])), "documents": []}
    for v in a.get('videos', []):
        v = dict(v)
        if v['type'] == 'mp4':
            sp = MEDIA / v.pop('media') if 'media' in v else SRC / v.pop('src')
            dst, rel = put(sp, did, slug(sp.stem) + '.mp4'); v['src'] = rel; v['taille'] = taille(dst)
        else:
            m = re.search(r'(?:youtu\.be/|v=)([\w-]{11})', v['src']); v['youtubeId'] = m.group(1)
            v['src'] = f"https://www.youtube.com/watch?v={v['youtubeId']}"
        na['videos'].append(v)
    for im in a.get('images', []):
        im = dict(im)
        if 'extract' in im:
            sp = EXTRACT / im.pop('extract') / 'image1.png'
            _, rel = put(sp, did, f"image-{len(na['images'])+1}.png")
        elif 'pdfimg' in im:
            sp = SRC / im.pop('pdfimg'); d = OUT / 'dossiers' / did; d.mkdir(parents=True, exist_ok=True)
            base = d / f"image-{len(na['images'])+1}"
            subprocess.run(['pdftoppm', '-r', '150', '-png', '-singlefile', str(sp), str(base)], check=True)
            rel = f"dossiers/{did}/{base.name}.png"
        else:
            sp = SRC / im.pop('src'); _, rel = put(sp, did, f"image-{len(na['images'])+1}{sp.suffix.lower()}")
        im['src'] = rel; na['images'].append(im)
    for doc in a.get('documents', []):
        doc = dict(doc)
        sp = MEDIA / doc.pop('media') if 'media' in doc else SRC / doc.pop('src')
        dst, rel = put(sp, did, slug(sp.stem) + sp.suffix.lower())
        doc['fichier'] = rel; doc['taille'] = taille(dst); doc['pages'] = pages(dst) if dst.suffix == '.pdf' else None
        na['documents'].append(doc)
    y['annexes'] = na
    out_dossiers.append(y)

data = {"edition": "2026", "ceremonie": "lundi 16 novembre 2026", "miseAJour": "",
        "categories": CATEGORIES, "dossiers": out_dossiers}
import datetime
data['miseAJour'] = datetime.date.today().strftime('%d/%m/%Y')
(OUT / 'data' / 'candidatures.json').write_text(json.dumps(data, ensure_ascii=False, indent=1), encoding='utf-8')
# copie en JavaScript : permet d'ouvrir le site en double-cliquant sur index.html (file://)
(OUT / 'data' / 'candidatures.js').write_text('window.CANDIDATURES = ' + json.dumps(data, ensure_ascii=False) + ';\n', encoding='utf-8')

# assets (logos + polices)
ad = OUT / 'assets'; (ad / 'fonts').mkdir(parents=True, exist_ok=True); (ad / 'logos').mkdir(exist_ok=True)
for f in ['trophees-blanc.svg', 'trophees-bleu.svg', 'medef44-logo-blanc.png', 'medef44-logo-rvb.png']:
    shutil.copy2(DESIGN / 'assets' / 'logos' / f, ad / 'logos' / f)
for f in (DESIGN / '_ds').glob('*/assets/fonts/*.ttf'):
    shutil.copy2(f, ad / 'fonts' / f.name)

print(len(out_dossiers), 'dossiers')
for d in out_dossiers:
    print(f"{d['categorie']:12} {d['id']:20} pdf {d['dossierPdf']['pages']}p {d['dossierPdf']['taille']:8} "
          f"v{len(d['annexes']['videos'])} i{len(d['annexes']['images'])} l{len(d['annexes']['liens'])} d{len(d['annexes']['documents'])} logo={'oui' if d['logo'] else '-'}")
