/**
 * Performance Metrics Infrastructure
 * Centralized performance tracking system used across all services
 */

export interface PerformanceMetrics {
  totalRequests: number;
  averageResponseTime: number;
  successRate: number;
  queueSize: number;
  memoryUsage: NodeJS.MemoryUsage;
  uptime: number;
}

export interface PerformanceData {
  totalRequests: number;
  totalResponseTime: number;
  successCount: number;
  startTime: number;
}

export class PerformanceTracker {
  private metrics: PerformanceData = {
    totalRequests: 0,
    totalResponseTime: 0,
    successCount: 0,
    startTime: Date.now()
  };

  /**
   * Track a successful request
   */
  trackSuccess(responseTime?: number): void {
    this.metrics.totalRequests++;
    this.metrics.successCount++;
    if (responseTime !== undefined) {
      this.metrics.totalResponseTime += responseTime;
    }
  }

  /**
   * Track a failed request
   */
  trackError(responseTime?: number): void {
    this.metrics.totalRequests++;
    if (responseTime !== undefined) {
      this.metrics.totalResponseTime += responseTime;
    }
  }

  /**
   * Track a request with timing
   */
  async trackRequest<T>(operation: () => Promise<T>): Promise<T> {
    const startTime = Date.now();
    try {
      const result = await operation();
      this.trackSuccess(Date.now() - startTime);
      return result;
    } catch (error) {
      this.trackError(Date.now() - startTime);
      throw error;
    }
  }

  /**
   * Get current performance metrics
   */
  getMetrics(): PerformanceMetrics {
    const averageResponseTime = this.metrics.totalRequests > 0
      ? this.metrics.totalResponseTime / this.metrics.totalRequests
      : 0;

    const successRate = this.metrics.totalRequests > 0
      ? (this.metrics.successCount / this.metrics.totalRequests) * 100
      : 100;

    return {
      totalRequests: this.metrics.totalRequests,
      averageResponseTime,
      successRate,
      queueSize: 0, // Override in subclasses that have queue access
      memoryUsage: process.memoryUsage(),
      uptime: Date.now() - this.metrics.startTime
    };
  }

  /**
   * Reset metrics
   */
  reset(): void {
    this.metrics = {
      totalRequests: 0,
      totalResponseTime: 0,
      successCount: 0,
      startTime: Date.now()
    };
  }

  /**
   * Get raw metrics data
   */
  getRawData(): PerformanceData {
    return { ...this.metrics };
  }
}

/**
 * Global performance tracker instance
 */
export const globalPerformanceTracker = new PerformanceTracker(); 