import os
import uuid
import shutil
import json
import subprocess
import hashlib
from datetime import datetime

# Archivo JSON para guardar los datos de los contenedores
CONTAINER_DATA_FILE = os.getenv("CONTAINER_DATA_FILE")
# Nombre y etiqueta para la imagen base
BASE_IMAGE_TAG = os.getenv("BASE_IMAGE_TAG")


# -------------------------------
# Función: Eliminar todos los contenedores listados en el JSON
# -------------------------------
def delete_all_containers():
    if not os.path.exists(CONTAINER_DATA_FILE):
        print("❌ No hay contenedores para eliminar.")
        return

    with open(CONTAINER_DATA_FILE, 'r') as file:
        containers = json.load(file)

    if not containers:
        print("❌ No hay contenedores listados en el archivo JSON.")
        return

    # Lista para los contenedores que no pudieron eliminarse
    remaining_containers = []

    # Eliminar contenedores y redes
    for container in containers:
        try:
            # Comprobar si el contenedor existe realmente
            result = subprocess.getoutput(f"docker ps -a -q -f id={container['id']}")
            if not result:
                print(f"⚠️ El contenedor {container['name']} ya no existe. Eliminando del JSON...")
            else:
                print(f"➤ Eliminando contenedor: {container['name']} con ID: {container['id']}")
                os.system(f"docker rm -f {container['id']}")
                print(f"➤ Eliminando red: {container['network']}")
                os.system(f"docker network rm {container['network']}")
                eliminar_carpeta(container['name'])
                print(f"➤ Eliminando carpeta: {container['network']}")

        except Exception as e:
            print(f"❌ Error eliminando el contenedor {container['name']}: {e}")
            # Guardar el contenedor en la lista si no se pudo eliminar
            remaining_containers.append(container)
            continue

    # Actualizar el archivo JSON solo con los contenedores que no pudieron eliminarse
    if remaining_containers:
        with open(CONTAINER_DATA_FILE, 'w') as file:
            json.dump(remaining_containers, file, indent=4)
        print("⚠️ Algunos contenedores no pudieron eliminarse y se mantuvieron en el JSON.")
    else:
        # Si todos los contenedores fueron eliminados, vaciar el archivo JSON
        open(CONTAINER_DATA_FILE, 'w').close()
        print("✔ Todos los contenedores y redes han sido eliminados y el archivo JSON ha sido limpiado.")


# -------------------------------
# Función: Eliminar carpeta de datos de un contenedor
# -------------------------------

def eliminar_carpeta(nombre_carpeta):
    ruta_carpeta = os.path.join('d_apps/', nombre_carpeta)
    shutil.rmtree(ruta_carpeta)
    print(f"✔ Carpeta {nombre_carpeta} eliminada correctamente.")

# -------------------------------
# Función: Limpiar imágenes huérfanas
# -------------------------------
def clean_unused_images():
    print("➤ Eliminando imágenes huérfanas...")
    os.system('docker image prune -f')

# -------------------------------
# Función: Limpiar redes huérfanas
# -------------------------------
def clean_unused_networks():
    print("➤ Eliminando redes huérfanas...")
    os.system('docker network prune -f')


##############################################
# Ejecución del script
##############################################

if __name__ == "__main__":

    # Eliminar todos los contenedores y redes
    delete_all_containers() 

    clean_unused_images()
    clean_unused_networks()


