#!/usr/bin/env python3
"""
generar_iconos_datos.py - Regenera src/iconos_datos.py y
src/iconos_datos_kids.py a partir de los PNG en src/iconos_editor/ y
src/iconos_kids/.

Por que existe: los iconos de la interfaz estan incrustados como texto
base64 directo en el codigo Python (no se leen como archivos sueltos en
tiempo de ejecucion), para que la barra de herramientas nunca quede sin
iconos por un instalador que copio el .py pero se olvido de copiar la
carpeta de assets -- eso paso de verdad en una version anterior del
paquete Debian. Los .png en iconos_editor/ e iconos_kids/ siguen
existiendo como la fuente editable (para abrirlos en un editor de
imagenes); este script es el paso que los convierte al formato que
usa el editor en tiempo real.

Correr esto de nuevo cada vez que se agregue o edite un icono:

    python3 herramientas/generar_iconos_datos.py
"""
import base64
import os

RAIZ_REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CARPETA_SRC = os.path.join(RAIZ_REPO, "src")

FIRMA_PNG = b"\x89PNG\r\n\x1a\n"


def generar_modulo(carpeta_iconos, nombre_archivo_salida, nombre_dict):
    carpeta = os.path.join(CARPETA_SRC, carpeta_iconos)
    if not os.path.isdir(carpeta):
        print(f"[generar_iconos_datos] AVISO: no existe '{carpeta}', se omite.")
        return 0

    entradas = []
    for archivo in sorted(os.listdir(carpeta)):
        if not archivo.endswith(".png"):
            continue
        ruta = os.path.join(carpeta, archivo)
        with open(ruta, "rb") as f:
            crudo = f.read()
        if not crudo.startswith(FIRMA_PNG):
            print(f"[generar_iconos_datos] AVISO: '{archivo}' no parece un PNG valido, se omite.")
            continue
        clave = archivo[:-4]
        datos_b64 = base64.b64encode(crudo).decode("ascii")
        entradas.append(f'    "{clave}": "{datos_b64}",')

    contenido = (
        "#!/usr/bin/env python3\n"
        f'"""\n{nombre_archivo_salida} - Iconos del editor incrustados como base64.\n\n'
        f"Generado automaticamente por herramientas/generar_iconos_datos.py a partir\n"
        f"de {carpeta_iconos}/*.png -- no editar a mano, correr el script de nuevo.\n\n"
        "Se incrustan directamente en el codigo -- en vez de leerlos como archivos\n"
        "sueltos -- para que los iconos NUNCA dependan de que un instalador se\n"
        "acuerde de copiar la carpeta de assets junto con el .py.\n\"\"\"\n\n"
        f"{nombre_dict} = {{\n" + "\n".join(entradas) + "\n}\n"
    )
    ruta_salida = os.path.join(CARPETA_SRC, nombre_archivo_salida + ".py")
    with open(ruta_salida, "w", encoding="utf-8") as f:
        f.write(contenido)
    tamano_kb = os.path.getsize(ruta_salida) / 1024
    print(f"[generar_iconos_datos] {ruta_salida} <- {len(entradas)} icono(s) de '{carpeta_iconos}/' ({tamano_kb:.0f} KB)")
    return len(entradas)


def main():
    total = 0
    total += generar_modulo("iconos_editor", "iconos_datos", "ICONOS_EDITOR_B64")
    total += generar_modulo("iconos_kids", "iconos_datos_kids", "ICONOS_KIDS_B64")
    print(f"[generar_iconos_datos] Listo: {total} icono(s) en total.")


if __name__ == "__main__":
    main()
