#!/usr/bin/env python3
"""
Neurotron — ponto de entrada do “cérebro” do NFDOS.
Boot flow (novo): init (BusyBox) → /usr/bin/neurotron → este ficheiro.
"""

import os
import sys
from pathlib import Path

from datetime import datetime
from rich.console import Console

# -----------------------------------------------------------------------------
#  Ajuste de caminho: tornar "src/" o root dos módulos Neurotron
# -----------------------------------------------------------------------------
THIS_DIR = Path(__file__).resolve().parent  # .../neurotron/src

if str(THIS_DIR) not in sys.path:
    sys.path.insert(0, str(THIS_DIR))

# Agora os imports ficam locais ao diretório src/
from neurotron_config import (  # noqa: E402
    NEUROTRON_TICK,
    NEUROTRON_MODE,
    NEUROTRON_HOMEOSTASIS,
    CORTEX_LOOP_DELAY,
    MOTOR_OUTPUT_DEVICE,
)
from autodiagnostic import AutoDiagnostic  # noqa: E402
from perception import Perception          # noqa: E402
from cortex import Cortex                  # noqa: E402

console = Console()


def detect_persistent_mount() -> bool:
    """Verifica se o hipocampo físico está montado em /var/neurotron"""
    mount_point = Path("/var/neurotron")
    try:
        if mount_point.exists() and os.path.ismount(mount_point):
            console.print(f"[green]💾 Hipocampo físico montado:[/] {mount_point}")
            return True
        else:
            # fallback: check via /proc/mounts em early boot
            with open("/proc/mounts") as f:
                for line in f:
                    if " /var/neurotron " in line:
                        console.print(f"[green]💾 Hipocampo físico montado (via /proc):[/] {mount_point}")
                        return True
    except Exception as e:
        console.print(f"[yellow]⚠ Falha ao verificar montagem persistente:[/] {e}")
    return False


def main():
    # -------------------------------------------------------------------------
    #  Seleção de modo: persistente vs volátil
    # -------------------------------------------------------------------------
    persistent_mode = detect_persistent_mount()
    if persistent_mode:
        os.environ["NEUROTRON_MODE"] = "persistent"
        os.environ["NEUROTRON_RUNTIME"] = "/var/neurotron/data"
        os.environ["NEUROTRON_LOG"] = "/var/neurotron/logs"
    else:
        os.environ["NEUROTRON_MODE"] = "volatile"
        os.environ["NEUROTRON_RUNTIME"] = "/tmp/neurotron_data"
        os.environ["NEUROTRON_LOG"] = "/tmp/neurotron_logs"

    runtime_dir = Path(os.environ["NEUROTRON_RUNTIME"])
    log_dir = Path(os.environ["NEUROTRON_LOG"])
    runtime_dir.mkdir(parents=True, exist_ok=True)
    log_dir.mkdir(parents=True, exist_ok=True)

    mode = os.environ["NEUROTRON_MODE"]
    console.print(f"[cyan]🌍 Modo atual do Neurotron:[/] [bold]{mode.upper()}[/]")

    # -------------------------------------------------------------------------
    #  Inicializa o Córtex
    # -------------------------------------------------------------------------
    cortex = Cortex(
        runtime_dir=runtime_dir,
        log_dir=log_dir,
        tick_seconds=NEUROTRON_TICK,
    )

    try:
        cortex.boot()
        state = cortex.diagnostic._load_previous().get("state", "?")
        console.print(f"[cyan]🩺 Estado inicial:[/] {state}\n")
        console.print("[green]👉 Neurotron inicializado com sucesso.[/]\n")
        console.print("[green]✔ [Mensagem Simbolica] Boot OK[/]\n")

        console.print("[green]✔ Iniciando ciclo cognitivo.[/]\n")
        while True:
            cortex.observe()
            cortex.think()
            cortex.act()
            cortex.rest()

    except KeyboardInterrupt:
        console.print("[yellow]⚠ Interrompido pelo utilizador (SIGINT)[/]")
        cortex.shutdown(reason="SIGINT")

    except SystemExit:
        cortex.shutdown(reason="SystemExit")

    except Exception as e:
        console.print(f"[red]💥 Exceção não tratada:[/] {e}")
        cortex.fatal(e)


if __name__ == "__main__":
    main()
