"""
Neurotron LogBus — Sistema Centralizado de Logging
==================================================

Objetivo:
    - Centralizar *toda* a saída de logs do Neurotron
    - Funcionar tanto no dashboard curses quanto em modo headless
    - Manter logs persistentes quando o hipocampo físico está montado
    - Fornecer uma API simples:
            from neurotron.logbus import log
            log("mensagem")

Componentes:
    - LogBus: roteador de mensagens (fila → stdout → ficheiro)
    - log(): função global simplificada
"""

from __future__ import annotations
import json
import time
from queue import Queue
from pathlib import Path


class LogBus:
    def __init__(self):
        self.queue: Queue | None = None     # usado pelo dashboard
        self.stdout_enabled = True          # imprime em modo headless
        self.persist_enabled = False        # grava em disco
        self.persist_file: Path | None = None

    # ---------------------------------------------------------
    # Inicialização de destinos
    # ---------------------------------------------------------
    def enable_dashboard(self, q: Queue):
        """Liga o LogBus ao dashboard (curses)."""
        self.queue = q

    def enable_persist(self, path: Path):
        """Ativa salvamento permanente da stream de logs."""
        self.persist_file = path
        self.persist_enabled = True
        path.parent.mkdir(parents=True, exist_ok=True)
        if not path.exists():
            path.write_text("")  # cria ficheiro vazio

    # ---------------------------------------------------------
    # Emissão centralizada
    # ---------------------------------------------------------
    def log(self, message: str):
        ts = time.strftime("%H:%M:%S")
        line = f"[{ts}] {message}"

        # 1) Dashboard (queue)
        if self.queue:
            try:
                self.queue.put(line)
            except Exception:
                pass

        # 2) STDOUT
        if self.stdout_enabled:
            try:
                print(line)
            except Exception:
                pass

        # 3) Persistência
        if self.persist_enabled and self.persist_file:
            try:
                with open(self.persist_file, "a") as f:
                    f.write(json.dumps({"ts": ts, "msg": message}) + "\n")
            except Exception:
                pass


# Instância global — usada em todo o Neurotron
logbus = LogBus()


def log(msg: str):
    """Função simples: apenas delega ao LogBus global."""
    logbus.log(msg)
