from typing import Any, Dict, Optional
from neurotron.logbus import logbus


class Neuron:
    """
    Classe-base de um neurónio-agente.
    
    Cada neurónio participa no ciclo cognitivo do Cortex:
      observe() → think() → act()

    Pode comunicar via:
      - publish(channel, payload)
      - consume(channel)

    Implementações devem respeitar esta interface sem causar efeitos colaterais
    externos (sem prints, sem IO não controlado).
    """

    name: str = "Neuron"

    def __init__(self, ctx: "Cortex"):
        self.ctx = ctx

    # ----------------------------------------------------------------------
    # Ciclo cognitivo — para override por neurónios concretos
    # ----------------------------------------------------------------------

    def observe(self) -> None:
        """Ler estado do mundo (sensores, perceções, eventos internos)."""
        return

    def think(self) -> None:
        """Processar informação, planear, atualizar estado interno."""
        return

    def act(self) -> None:
        """Executar uma ação, enviar comandos, publicar eventos."""
        return

    # ----------------------------------------------------------------------
    # Comunicação inter-neurónios via Cortex Bus
    # ----------------------------------------------------------------------

    def publish(self, channel: str, payload: Dict[str, Any]) -> None:
        """Publica mensagem num canal do bus cognitivo."""
        try:
            self.ctx.bus_publish(channel, payload)
        except Exception as e:
            logbus.debug(f"[warn] {self.name}.publish falhou: {e}")

    def consume(self, channel: str) -> Optional[Dict[str, Any]]:
        """Lê (e remove) última mensagem disponível num canal."""
        try:
            return self.ctx.bus_consume(channel)
        except Exception as e:
            logbus.debug(f"[warn] {self.name}.consume falhou: {e}")
            return None
