# neurotron/logbus.py

from collections import deque
from datetime import datetime
import sys


class LogBus:
    """
    Canal central de logs do Neurotron.
    - escreve tudo em stdout (texto simples, sem Rich)
    - mantém um buffer em memória para o dashboard (tail)
    """

    def __init__(self, maxlen: int = 1000):
        self._buffer = deque(maxlen=maxlen)

    # -------------------------
    # núcleo
    # -------------------------
    def _emit(self, level: str, msg: str):
        ts = datetime.utcnow().strftime("%H:%M:%S")
        line = f"[{ts}] [{level}] {msg}"

        # guarda em memória para o dashboard
        self._buffer.append(line)

        # escreve em stdout (uma linha)
        sys.stdout.write(line + "\n")
        sys.stdout.flush()

    # -------------------------
    # API pública de logs
    # -------------------------
    def info(self, msg: str):
        self._emit("info", msg)

    def warn(self, msg: str):
        self._emit("warn", msg)

    def error(self, msg: str):
        self._emit("error", msg)

    def debug(self, msg: str):
        self._emit("debug", msg)

    def disk(self, msg: str):
        self._emit("disk", msg)

    def heart(self, msg: str):
        # heartbeat mini e compacto
        self._emit("heart", msg)

    def diag(self, msg: str):
        self._emit("diag", msg)

    # -------------------------
    # Integração com código antigo (emit)
    # -------------------------
    def emit(self, msg: str):
        # fallback para chamadas antigas tipo logbus.emit("...")
        self.info(msg)

    # -------------------------
    # Para o dashboard
    # -------------------------
    def tail(self, n: int = 150):
        """Devolve as últimas n linhas de log como lista de strings."""
        if n <= 0:
            return []
        buf = list(self._buffer)
        return buf[-n:]


# instância global
logbus = LogBus()
