from rich.console import Console
import os
import shutil
import subprocess
import time
from pathlib import Path

console = Console()

def save_current_config(ctng_dir: Path, aux_dir: Path):
    """
    Salva o .config atual da toolchain em welcome/nfdos/aux/.config
    """
    src = ctng_dir / ".config"
    dst = aux_dir / ".config"

    if src.exists():
        try:
            shutil.copyfile(src, dst)
            console.print(f"[green]✔ .config atual salvo em {dst}[/green]")
        except Exception as e:
            console.print(f"[red]✖ Falha ao salvar .config: {e}[/red]")
    else:
        console.print("[yellow]⚠ Nenhum .config encontrado para salvar.[/yellow]")


def apply_profile_config(aux_dir: Path, ctng_dir: Path):
    """
    Se existir um .config personalizado em aux, aplica-o antes da build.
    """
    aux_config = aux_dir / ".config"
    if aux_config.exists():
        try:
            shutil.copyfile(aux_config, ctng_dir / ".config")
            console.print("[green]✔ Aplicado .config personalizado do perfil NFDOS.[/green]")
        except Exception as e:
            console.print(f"[red]✖ Falha ao aplicar .config personalizado: {e}[/red]")
    else:
        console.print("[yellow]⚠ Nenhum .config personalizado encontrado em aux/.[/yellow]")

def sanitize_env():
    for var in ["CFLAGS", "CPPFLAGS", "LDFLAGS", "CXXFLAGS"]:
        if var in os.environ:
            del os.environ[var]
            console.print(f"[yellow]Removido {var} do ambiente para evitar conflitos.[/yellow]")

def run():
    while True:
        console.clear()
        console.rule("[bold yellow]Toolchain NFDOS[/bold yellow]")
        console.print("1. Compilar Toolchain (usar perfil padrão)")
        console.print("2. Configurar Toolchain manualmente")
        console.print("3. Gerir Toolchain (limpar/rebuild)")
        console.print("0. Voltar")

        choice = console.input("\n[cyan]nfdos> [/cyan]")

        base_dir = Path(__file__).resolve().parents[1]
        toolchain_dir = base_dir / "_nfdos" / "toolchain"
        aux_dir = base_dir / "_nfdos" / "aux" / "toolchain"
        ctng_dir = toolchain_dir / "crosstool-ng"
        defconfig_path = aux_dir / "toolchain_defconfig"

        if choice == "1":
            os.chdir(toolchain_dir)

            if not ctng_dir.exists():
                console.print("[yellow]Clonando crosstool-ng...[/yellow]")
                subprocess.run(["git", "clone", "https://github.com/crosstool-ng/crosstool-ng.git"], check=True)

            # Garantir ambiente limpo antes de preparar o build
            sanitize_env()

            os.chdir(ctng_dir)
            console.print("[cyan]Preparando ambiente...[/cyan]")
            subprocess.run(["./bootstrap"], check=True)
            subprocess.run(["./configure", "--enable-local"], check=True)
            subprocess.run(["make"], check=True)

            # Aplicar perfil padrão se existir
            if defconfig_path.exists():
                console.print("[green]Usando perfil padrão do NFDOS...[/green]")
                shutil.copyfile(defconfig_path, ".config")
                subprocess.run(["./ct-ng", "olddefconfig"], check=True)
            else:
                console.print("[yellow]Perfil padrão não encontrado. Será necessário configurar manualmente.[/yellow]")
                subprocess.run(["./ct-ng", "menuconfig"], check=True)

            # Aplicar .config personalizado, se houver
            apply_profile_config(aux_dir, ctng_dir)

            console.print("[cyan]Compilando Toolchain...[/cyan]")
            subprocess.run(["./ct-ng", "build"], check=True, env={**os.environ, "CT_PARALLEL_JOBS": str(os.cpu_count())})
            console.print("[bold green]✔ Toolchain compilada com sucesso![/bold green]")

            # Após a build, salvar o .config atual
            save_current_config(ctng_dir, aux_dir)

        elif choice == "2":
            os.chdir(ctng_dir)
            console.print("[yellow]Abrindo menu de configuração manual...[/yellow]")
            subprocess.run(["./ct-ng", "menuconfig"], check=True)

            save = console.input("\n[cyan]Salvar este perfil como padrão? (s/n): [/cyan]").lower()
            if save == "s":
                shutil.copyfile(".config", defconfig_path)
                console.print(f"[green]✔ Perfil salvo em {defconfig_path}[/green]")
                save_current_config(ctng_dir, aux_dir)

        elif choice == "3":
            os.chdir(ctng_dir)
            console.print("[yellow]Limpando build anterior...[/yellow]")
            subprocess.run(["./ct-ng", "distclean"], check=True)
            console.print("[green]✔ Toolchain limpa.[/green]")

        elif choice == "0":
            break
        else:
            console.print("[red]Opção inválida![/red]")

        time.sleep(1)


