import os
import json
import subprocess
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

PROGRAM_DIR = os.path.dirname(os.path.abspath(__file__))
config_file = os.path.join(PROGRAM_DIR, 'config.json')
with open(config_file, 'r') as f:
    config = json.load(f)

INSTALL_OGBOOT_TARGET = config["ogBoot_Dir"]


def update_ipxe_boot_files():
    """
    Actualiza los archivos de arranque iPXE.
    """
    ipxe_repo_url = "https://github.com/ipxe/ipxe.git"
    install_ogboot_target = INSTALL_OGBOOT_TARGET
    cwd = os.getcwd()
    clone_dir = "/tmp/ipxe_repo"

    if not os.path.exists(clone_dir):
        os.makedirs(clone_dir)
        logger.info(f"Clonando el repositorio {ipxe_repo_url}")
        clone_cmd = ["git", "-c", "http.sslVerify=false", "clone", ipxe_repo_url, clone_dir]

        if subprocess.call(clone_cmd) == 0:
            logger.info("Repositorio clonado correctamente.")
        else:
            logger.error(f"ERROR\tNo se pudo clonar el repositorio {ipxe_repo_url}.")
            return False
    else:
        logger.info(f"Usando el repositorio clonado previamente en {clone_dir}")

    os.chdir(f"{clone_dir}/src")

    logger.info("Generando make de undionly.kpxe:")
    undionly_cmd = [
        "make", "-s", "bin/undionly.kpxe", 
        f"EMBED={install_ogboot_target}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"
    ]
    if subprocess.run(undionly_cmd, capture_output=True).returncode == 0:
        logger.info("Boot file undionly.kpxe generado correctamente.")
    else:
        logger.error("ERROR\tNo se pudo generar el archivo undionly.kpxe.")
        return False

    logger.info("Copiando undionly.kpxe al directorio de destino:")
    dest_undionly = os.path.join(install_ogboot_target, "tftpboot")
    if subprocess.call(["cp", "bin/undionly.kpxe", dest_undionly]) == 0:
        logger.info(f"Archivo undionly.kpxe copiado a {dest_undionly}")
    else:
        logger.error("ERROR\tNo se pudo copiar el archivo undionly.kpxe.")
        return False

    logger.info("Generando make de ipxe.efi:")
    ipxe_efi_cmd = [
        "make", "-s", "bin-x86_64-efi/ipxe.efi",
        f"EMBED={install_ogboot_target}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"
    ]
    if subprocess.run(ipxe_efi_cmd, capture_output=True).returncode == 0:
        logger.info("Archivo ipxe.efi generado correctamente.")
    else:
        logger.error("ERROR\tNo se pudo generar el archivo ipxe.efi.")
        return False

    logger.info("Copiando ipxe.efi al directorio de destino:")
    dest_ipxe_efi = os.path.join(install_ogboot_target, "tftpboot")
    if subprocess.call(["cp", "bin-x86_64-efi/ipxe.efi", dest_ipxe_efi]) == 0:
        logger.info(f"Archivo ipxe.efi copiado a {dest_ipxe_efi}")
    else:
        logger.error("ERROR\tNo se pudo copiar el archivo ipxe.efi.")
        return False

    os.chdir(cwd)
    logger.info("Proceso completado exitosamente.")
    return True


if __name__ == "__main__":
    try:
        if update_ipxe_boot_files():
            logger.info("Archivos de arranque actualizados correctamente.")
        else:
            logger.error("Hubo un error durante la actualización de los archivos de arranque.")
    except Exception as e:
        logger.error(f"ERROR\tFallo crítico: {e}")
