import time


class TransaksiPerformanceService:
    def __init__(self, enabled=False, log_info=None, log_warning=None):
        self.enabled = bool(enabled)
        self._log_info = log_info
        self._log_warning = log_warning
        self._once_flags = set()

    def mark(self):
        return time.perf_counter()

    def record(self, metric_name, started_at, threshold_ms=None, context="", once_key=None):
        if not self.enabled:
            return None

        if once_key and once_key in self._once_flags:
            return None

        try:
            elapsed_ms = (time.perf_counter() - float(started_at)) * 1000.0
        except (TypeError, ValueError):
            return None

        message = f"Perf {metric_name}: {elapsed_ms:.2f}ms"
        if context:
            message = f"{message} | {context}"

        if once_key:
            self._once_flags.add(once_key)

        if threshold_ms is not None and elapsed_ms > float(threshold_ms):
            if callable(self._log_warning):
                self._log_warning(message)
        else:
            if callable(self._log_info):
                self._log_info(message)
        return elapsed_ms
