"""
HYPERION — activity logger.
Every log line goes to console AND buffers for Supabase (hyperion_activity),
flushed once per tick in a single insert. Prunes rows older than RETAIN_DAYS.
"""
from __future__ import annotations
from datetime import datetime, timezone, timedelta

RETAIN_DAYS = 3
MAX_BUFFER = 200


class ActivityLog:
    def __init__(self, sb_insert, sb_delete):
        self.sb_insert = sb_insert
        self.sb_delete = sb_delete
        self.buf: list[dict] = []
        self._last_prune = None

    def _add(self, level: str, event: str, message: str, detail: dict | None = None):
        print(f"[{level.upper():5}] {message}")
        if len(self.buf) < MAX_BUFFER:
            self.buf.append({"level": level, "event": event,
                             "message": message, "detail": detail,
                             "ts": datetime.now(timezone.utc).isoformat()})

    def info(self, event, msg, detail=None):  self._add("info", event, msg, detail)
    def scan(self, event, msg, detail=None):  self._add("scan", event, msg, detail)
    def trade(self, event, msg, detail=None): self._add("trade", event, msg, detail)
    def warn(self, event, msg, detail=None):  self._add("warn", event, msg, detail)
    def error(self, event, msg, detail=None): self._add("error", event, msg, detail)

    def flush(self):
        if not self.buf:
            return
        try:
            self.sb_insert("hyperion_activity", self.buf)
            self.buf = []
        except Exception as e:
            print(f"[WARN ] activity flush failed: {e}")
            self.buf = self.buf[-50:]   # keep tail, avoid unbounded growth
        self._prune()

    def _prune(self):
        today = datetime.now(timezone.utc).date()
        if self._last_prune == today:
            return
        try:
            cutoff = (datetime.now(timezone.utc) - timedelta(days=RETAIN_DAYS)).isoformat()
            self.sb_delete("hyperion_activity", {"ts": f"lt.{cutoff}"})
            self._last_prune = today
        except Exception:
            pass
