"""Metrics collection service"""
from typing import Dict, List
from datetime import datetime
from app.core.logging import get_logger

logger = get_logger(__name__)


class MetricsCollector:
    """Collect and aggregate application metrics"""
    
    def __init__(self):
        self.metrics: Dict = {
            "messages_received": 0,
            "messages_sent": 0,
            "matches_found": 0,
            "no_matches": 0,
            "errors": 0,
            "rate_limited": 0,
            "duplicates": 0,
            "processing_times": []
        }
        self.start_time = datetime.now()
    
    def increment(self, metric: str, value: int = 1) -> None:
        """Increment a counter metric"""
        if metric in self.metrics and not isinstance(self.metrics[metric], list):
            self.metrics[metric] += value
    
    def record_processing_time(self, time_ms: float) -> None:
        """Record message processing time"""
        self.metrics["processing_times"].append(time_ms)
        
        # Keep only last 1000 measurements
        if len(self.metrics["processing_times"]) > 1000:
            self.metrics["processing_times"] = self.metrics["processing_times"][-1000:]
    
    def get_average_processing_time(self) -> float:
        """Calculate average processing time"""
        times = self.metrics["processing_times"]
        return sum(times) / len(times) if times else 0.0
    
    def get_p95_processing_time(self) -> float:
        """Calculate 95th percentile processing time"""
        times = sorted(self.metrics["processing_times"])
        if not times:
            return 0.0
        
        index = int(len(times) * 0.95)
        return times[index] if index < len(times) else times[-1]
    
    def get_metrics(self) -> Dict:
        """Get all metrics"""
        uptime = (datetime.now() - self.start_time).total_seconds()
        
        return {
            **self.metrics,
            "avg_processing_time_ms": round(self.get_average_processing_time(), 2),
            "p95_processing_time_ms": round(self.get_p95_processing_time(), 2),
            "uptime_seconds": round(uptime, 2),
            "timestamp": datetime.now().isoformat()
        }
    
    def reset(self) -> None:
        """Reset all metrics"""
        self.metrics = {
            "messages_received": 0,
            "messages_sent": 0,
            "matches_found": 0,
            "no_matches": 0,
            "errors": 0,
            "rate_limited": 0,
            "duplicates": 0,
            "processing_times": []
        }
        self.start_time = datetime.now()
        logger.info("Metrics reset")
