import sys
import math
import tempfile
import os

# ------------------------------
# Utilidades de color
# ------------------------------

def luminosidad(rgb):
    r, g, b = rgb
    return 0.2126*r + 0.7152*g + 0.0722*b

def distancia_rgb(c1, c2):
    return math.sqrt(
        (c1[0] - c2[0])**2 +
        (c1[1] - c2[1])**2 +
        (c1[2] - c2[2])**2
    )

# Paleta ZX Spectrum
PALETA_SPECTRUM = [
    (0, 0, 0),
    (0, 0, 0),
    (0, 0, 216),
    (0, 0, 255),
    (216, 0, 0),
    (255, 0, 0),
    (216, 0, 216),
    (255, 0, 255),
    (0, 216, 0),
    (0, 255, 0),
    (0, 216, 216),
    (0, 255, 255),
    (216, 216, 0),
    (255, 255, 0),
    (216, 216, 216),
    (255, 255, 255),
]

# ------------------------------
# Lectura / escritura JASC-PAL
# ------------------------------

def leer_paleta_jasc(ruta):
    with open(ruta, "r") as f:
        lineas = [l.strip() for l in f.readlines()]

    if lineas[0] != "JASC-PAL":
        raise ValueError("El fichero no es un JASC-PAL válido")

    num_colores = int(lineas[2])
    colores = []

    for i in range(num_colores):
        r, g, b = map(int, lineas[3 + i].split())
        colores.append((r, g, b))

    return colores

def guardar_paleta_jasc(ruta, colores):
    with open(ruta, "w") as f:
        f.write("JASC-PAL\n")
        f.write("0100\n")
        f.write(f"{len(colores)}\n")
        for r, g, b in colores:
            f.write(f"{r} {g} {b}\n")

# ------------------------------
# Métodos de ordenación
# ------------------------------

def ordenar_por_luminosidad(colores):
    return sorted(colores, key=luminosidad)

def ordenar_por_similitud_spectrum(colores):
    colores_disponibles = colores.copy()
    resultado = []

    for ref in PALETA_SPECTRUM:
        mejor = min(colores_disponibles, key=lambda c: distancia_rgb(c, ref))
        resultado.append(mejor)
        colores_disponibles.remove(mejor)

    return resultado

# ------------------------------
# Main
# ------------------------------

def main():
    if len(sys.argv) < 4:
        print("Uso: python ordenar_paleta.py entrada.pal salida.pal [luminosidad|spectrum]")
        return

    entrada = sys.argv[1]
    salida = sys.argv[2]
    modo = sys.argv[3].lower()

    colores = leer_paleta_jasc(entrada)

    if modo == "luminosidad":
        colores_ordenados = ordenar_por_luminosidad(colores)
    elif modo == "spectrum":
        colores_ordenados = ordenar_por_similitud_spectrum(colores)
    else:
        print(f"Modo desconocido: {modo}")
        print("Modos disponibles: luminosidad, spectrum")
        return

    # Si salida == entrada, sobrescribimos de forma segura
    if entrada == salida:
        # Guardamos primero en un temporal para evitar corrupción si algo falla
        with tempfile.NamedTemporaryFile(delete=False) as tmp:
            temp_path = tmp.name
        guardar_paleta_jasc(temp_path, colores_ordenados)
        os.replace(temp_path, entrada)
        print(f"Paleta sobrescrita ({modo}) en {entrada}")
    else:
        guardar_paleta_jasc(salida, colores_ordenados)
        print(f"Paleta ordenada ({modo}) guardada en {salida}")


if __name__ == "__main__":
    main()
