import cv2
import numpy as np
from PIL import Image

import os
import cv2
import numpy as np
from PIL import Image

def procesar_carpeta(carpeta_entrada, carpeta_salida="transparentes"):

    """
    Procesa todas las imágenes de una carpeta, haciendo transparente el color del píxel (4, 4).
    
    Parámetros:
        carpeta_entrada (str): Ruta de la carpeta con imágenes.
        carpeta_salida (str): Carpeta donde se guardarán las imágenes procesadas.
    """
    # Crear carpeta de salida si no existe
    os.makedirs(carpeta_salida, exist_ok=True)
    
    # Procesar cada imagen en la carpeta
    n=1
    for archivo in os.listdir(carpeta_entrada):

        if archivo.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
            ruta_entrada = os.path.join(carpeta_entrada, archivo)
            nombre_salida = os.path.splitext(str(n) + "_" + archivo)[0] + ".png"
            ruta_salida = os.path.join(carpeta_salida, nombre_salida)
            
            # Cargar imagen 
            imagen = cv2.imread(ruta_entrada)
            if imagen is None:
                print(f"Error al cargar {archivo}. Saltando...")
                continue

            # 1. Obtener el color en (4, 4) en BGR
            color_bgr = imagen[4, 4, :]  # Formato: [B, G, R]
            # 2. Convertir la imagen a RGBA
            imagen_rgba = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGBA)  # Formato: [R, G, B, A]

            # 3. Definir tolerancia para cada canal (R, G, B)
            tolerancia = 0.29
            color_rgb = color_bgr[::-1]  # Convertir BGR a RGB ([R, G, B])

            # Calcular límites inferior y superior para cada canal
            lower_bound = np.array([
                max(0, color_rgb[0] - 255 * tolerancia),  # R mínimo
                max(0, color_rgb[1] - 255 * tolerancia),  # G mínimo
                max(0, color_rgb[2] - 255 * tolerancia)   # B mínimo
            ], dtype=np.uint8)

            upper_bound = np.array([
                min(255, color_rgb[0] + 255 * tolerancia),  # R máximo
                min(255, color_rgb[1] + 255 * tolerancia),  # G máximo
                min(255, color_rgb[2] + 255 * tolerancia)   # B máximo
            ], dtype=np.uint8)

            # 4. Crear máscara con tolerancia (píxeles dentro del rango)
            mask = np.all(
                (imagen_rgba[:, :, :3] >= lower_bound) & 
                (imagen_rgba[:, :, :3] <= upper_bound),
                axis=-1
            )

            # 5. Aplicar transparencia (Alpha=0) donde la máscara es True
            imagen_rgba[mask, 3] = 0
            
            # Guardar con PIL
            Image.fromarray(imagen_rgba).save(ruta_salida)
            print(f"Procesada: {archivo} -> {nombre_salida}")
            n+=1

def listar_archivos_y_guardar_txt(ruta_carpeta, nombre_archivo_salida="lista_archivos.txt"):
    try:
        # Verificar si la ruta existe y es una carpeta
        if not os.path.exists(ruta_carpeta):
            return "La ruta no existe."
        if not os.path.isdir(ruta_carpeta):
            return "La ruta no corresponde a una carpeta."
        
        # Obtener lista de archivos (solo archivos, no carpetas)
        archivos = [archivo for archivo in os.listdir(ruta_carpeta) 
                   if os.path.isfile(os.path.join(ruta_carpeta, archivo))]
        
        # Convertir a string separado por saltos de línea
        contenido_txt = "\n".join(archivos)
        
        # Obtener la ruta del directorio donde está este script
        ruta_script = os.path.dirname(os.path.abspath(__file__))
        ruta_archivo_salida = os.path.join(ruta_script, nombre_archivo_salida)
        
        # Escribir en el archivo .txt
        with open(ruta_archivo_salida, "w", encoding="utf-8") as f:
            f.write(contenido_txt)
        
        return f"Se creó el archivo '{nombre_archivo_salida}' en: {ruta_script}"
    
    except Exception as e:
        return f"Ocurrió un error: {str(e)}"

# Ejemplo de uso:
# resultado = listar_archivos_y_guardar_txt("C:/mi_carpeta")
# print(resultado)


#procesar_carpeta('src/img/OBJETOS_JPG','src/img/OBJETOSS_PNG')
listar_archivos_y_guardar_txt('src/img/ROPA_PNG', 'lista_archivos.txt')
