from rich.console import Console
from rich.prompt import Prompt
from rich import box
import os
import subprocess
import time
from pathlib import Path
from colorama import Fore, Style

console = Console()

# ============================================================
#  Caminhos base
# ============================================================

ROOT = Path(__file__).resolve().parent.parent  # /src/tui → /src
DOCS_DIR = ROOT / "docs"
SITE_DIR = ROOT / "site"
VENV_BIN = ROOT / "venv" / "bin"

MKDOCS_BIN = VENV_BIN / "mkdocs"
PIP_BIN = VENV_BIN / "pip"


# ============================================================
#  Helpers
# ============================================================

def ensure_mkdocs_installed():
    """Instala MkDocs e temas caso ainda não estejam disponíveis."""
    if MKDOCS_BIN.exists():
        return True

    console.print("[yellow]MkDocs não encontrado. Instalando…[/yellow]")

    if not PIP_BIN.exists():
        console.print("[red]❌ Ambiente virtual (venv) não encontrado![/red]")
        console.print("Cria-o com:  python3 -m venv venv")
        time.sleep(1)
        return False

    try:
        subprocess.run([str(PIP_BIN), "install", "-U", "mkdocs", "mkdocs-material"],
                       check=True)
        console.print("[green]✔ MkDocs instalado com sucesso.[/green]")
        return True
    except Exception as e:
        console.print(f"[red]Erro ao instalar MkDocs: {e}[/red]")
        return False


def build_docs():
    """Compila o site estático com MkDocs."""
    console.print("[cyan]🚧 A compilar documentação com MkDocs…[/cyan]")

    if not ensure_mkdocs_installed():
        return False

    try:
        subprocess.run([str(MKDOCS_BIN), "build", "--clean"],
                       cwd=str(ROOT), check=True)
        console.print("[green]✔ Documentação compilada para 'site/'.[/green]")
        return True
    except subprocess.CalledProcessError as e:
        console.print(f"[red]Erro ao compilar documentação: {e}[/red]")
        return False


def open_docs():
    """Abre a documentação HTML compilada."""
    index = SITE_DIR / "Home" / "index.html"

    if not index.exists():
        console.print(f"{Fore.RED}[✗]{Style.RESET_ALL} Documentação ainda não foi gerada.")
        return False

    console.print(f"{Fore.GREEN}[✓]{Style.RESET_ALL} Abrindo documentação…")
    os.system(f"xdg-open '{index}' &")
    return True


# ============================================================
#  Menu principal
# ============================================================

def run():
    while True:
        console.clear()
        console.rule("[bold yellow]Documentação NFDOS[/bold yellow]")

        console.print("1. Compilar documentação (MkDocs)")
        console.print("2. Abrir documentação (MkDocs)")
        console.print("3. Compilar documentação técnica (Doxygen)")
        console.print("4. Abrir documentação técnica (Doxygen)")
        console.print("0. Voltar")

        choice = Prompt.ask("\nnfdos>", default="0")

        # -------------------------------------------------------
        # 1 — Compilar MkDocs
        # -------------------------------------------------------
        if choice == "1":
            build_docs()
            time.sleep(1)

        # -------------------------------------------------------
        # 2 — Abrir MkDocs
        # -------------------------------------------------------
        elif choice == "2":
            open_docs()
            time.sleep(1)

        # -------------------------------------------------------
        # 3 — Compilar Doxygen (future)
        # -------------------------------------------------------
        elif choice == "3":
            console.print("[yellow]Função em desenvolvimento…[/yellow]")
            time.sleep(1)

        # -------------------------------------------------------
        # 4 — Abrir Doxygen (future)
        # -------------------------------------------------------
        elif choice == "4":
            console.print("[yellow]Função em desenvolvimento…[/yellow]")
            time.sleep(1)

        # -------------------------------------------------------
        # Exit
        # -------------------------------------------------------
        elif choice == "0":
            break

        else:
            console.print("[red]Opção inválida![/red]")
            time.sleep(0.3)
