"""In-memory metrics collection for the admin backend."""

from __future__ import annotations

from datetime import datetime, timezone
from threading import Lock
from typing import Dict


class MetricsCollector:
    """Track request metrics for monitoring endpoints."""

    def __init__(self) -> None:
        self._lock = Lock()
        self._start_time = datetime.now(timezone.utc)
        self._requests_total = 0
        self._active_requests = 0
        self._error_count = 0
        self._total_response_time_ms = 0.0
        self._completed_responses = 0

    def record_request_start(self) -> None:
        with self._lock:
            self._requests_total += 1
            self._active_requests += 1

    def record_request_end(self, status_code: int, duration_ms: float) -> None:
        with self._lock:
            self._active_requests = max(0, self._active_requests - 1)
            self._total_response_time_ms += duration_ms
            self._completed_responses += 1
            if status_code >= 400:
                self._error_count += 1

    def record_request_exception(self, duration_ms: float) -> None:
        with self._lock:
            self._active_requests = max(0, self._active_requests - 1)
            self._total_response_time_ms += duration_ms
            self._completed_responses += 1
            self._error_count += 1

    def snapshot(self) -> Dict[str, float | int]:
        """Return current metrics snapshot."""
        now = datetime.now(timezone.utc)
        with self._lock:
            average_response = (
                self._total_response_time_ms / self._completed_responses
                if self._completed_responses
                else 0.0
            )
            error_rate = (
                (self._error_count / self._requests_total) * 100
                if self._requests_total
                else 0.0
            )
            return {
                "requests_total": self._requests_total,
                "active_requests": self._active_requests,
                "average_response_time_ms": average_response,
                "error_rate_percent": error_rate,
                "uptime_seconds": (now - self._start_time).total_seconds(),
            }


metrics_collector = MetricsCollector()
