﻿import os
import subprocess
import re


# --- CONFIGURATION ---
nom_fichier_source = "castanuelas_def.ily" 
variable_musique = "Toques"
forcer_tout_recompiler = False 


def detecter_tags(fichier):
    tags_trouves = []
    if not os.path.exists(fichier):
        return tags_trouves
    try:
        with open(fichier, 'r', encoding='utf-8') as f:
            contenu = f.read()
            motif = r"\\tag\s+#'([\w\d]+)"
            matches = re.findall(motif, contenu)
            return list(dict.fromkeys(matches))
    except:
        return []


# --- LE TEMPLATE ---
template_brut = """\\version "2.24.4"
\\include "%%SOURCE%%"


\\paper {
  indent = 0
  tagline = ##f
  page-breaking = #ly:one-page-breaking
  top-margin = 2\\mm
  bottom-margin = 2\\mm
  left-margin = 2\\mm
  right-margin = 2\\mm
  line-width = 150\\mm
}


\\new DrumStaff {
  \\drummode {
    \\globalCasta
    \\keepWithTag #'%%TAG%% \\%%VARIABLE%%
  }
}
"""


# --- EXÉCUTION ---
tags = detecter_tags(nom_fichier_source)


for i, tag in enumerate(tags, 1):
    nom_base = f"snippet{i}"
    nom_pdf = f"{nom_base}.pdf"
    nom_ly = f"{nom_base}.ly"


    # Si le PDF existe déjà, on ne fait rien (sauf si forcé)
    if os.path.exists(nom_pdf) and not forcer_tout_recompiler:
        continue


    print(f"🎼 Traitement de {nom_base} (Tag: {tag})...")
    
    # On ne génère le .ly que s'il n'existe pas ou si on force
    # Cela vous permet de corriger un .ly à la main et de supprimer le PDF 
    # pour que le script utilise votre version corrigée.
    if not os.path.exists(nom_ly) or forcer_tout_recompiler:
        contenu = template_brut.replace("%%SOURCE%%", nom_fichier_source)
        contenu = contenu.replace("%%TAG%%", tag)
        contenu = contenu.replace("%%VARIABLE%%", variable_musique)
        with open(nom_ly, "w", encoding='utf-8') as f:
            f.write(contenu)
    
    # Compilation LilyPond
    subprocess.run(["lilypond", "--pdf", "-dno-gs-load-fonts", nom_ly], 
                   stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
    
    # On ne supprime QUE le fichier .log, on garde le .ly
    if os.path.exists(nom_base + ".log"): 
        os.remove(nom_base + ".log")


print("\n✨ Terminé ! Les fichiers .ly et .pdf sont conservés dans le dossier.")
