import subprocess
from neurotron.logbus import logbus


class Motor:
    """
    Subsistema 'ator' do Neurotron.

    Executa comandos controlados (whitelist rígida),
    sem side-effects e com logging centralizado.

    FUTURO:
      - níveis de permissão
      - sandboxes
      - ações abstratas (ex: mover, sinalizar, emitir evento)
    """

    SAFE_CMDS = {
        "echo": ["echo"],
        "sh": ["/bin/sh"],  # shell básico — útil para debug interno
    }

    def __init__(self):
        pass

    def run(self, cmd: str, args: list[str] | None = None) -> dict:
        """
        Executa um comando permitido e retorna:
            {
                "ok": bool,
                "code": int | None,
                "stdout": str,
                "stderr": str,
            }
        """

        if cmd not in self.SAFE_CMDS:
            logbus.debug(f"[motor.warn] comando bloqueado: '{cmd}'")
            return {
                "ok": False,
                "code": None,
                "stdout": "",
                "stderr": f"cmd '{cmd}' não permitido",
            }

        try:
            full = self.SAFE_CMDS[cmd] + (args or [])
            res = subprocess.run(
                full,
                capture_output=True,
                text=True,
                env={},       # ambiente neutro → evita leaks
            )

            ok = (res.returncode == 0)

            if not ok:
                logbus.debug(
                    f"[motor.warn] '{cmd}' retornou código {res.returncode}"
                )

            return {
                "ok": ok,
                "code": res.returncode,
                "stdout": res.stdout or "",
                "stderr": res.stderr or "",
            }

        except Exception as e:
            logbus.debug(f"[motor.error] exceção ao executar '{cmd}': {e}")
            return {
                "ok": False,
                "code": None,
                "stdout": "",
                "stderr": str(e),
            }

