import client from 'prom-client';

/**
 * Prometheus metrics registry
 */
const register = new client.Registry();

// Add default metrics (CPU, memory, etc.)
client.collectDefaultMetrics({ register });

/**
 * Custom metrics for the proxy application
 */

// Counter: Total sessions created
export const sessionsCreatedCounter = new client.Counter({
  name: 'proxy_sessions_created_total',
  help: 'Total number of browser sessions created',
  labelNames: ['device_mode'],
  registers: [register],
});

// Counter: Total sessions closed
export const sessionsClosedCounter = new client.Counter({
  name: 'proxy_sessions_closed_total',
  help: 'Total number of browser sessions closed',
  labelNames: ['reason'],
  registers: [register],
});

// Gauge: Active sessions
export const activeSessionsGauge = new client.Gauge({
  name: 'proxy_sessions_active',
  help: 'Current number of active browser sessions',
  registers: [register],
});

// Gauge: Browser pool size
export const browserPoolSizeGauge = new client.Gauge({
  name: 'proxy_browser_pool_size',
  help: 'Current number of browsers in the pool',
  registers: [register],
});

// Histogram: Navigation duration
export const navigationDurationHistogram = new client.Histogram({
  name: 'proxy_navigation_duration_seconds',
  help: 'Duration of page navigations',
  labelNames: ['status'],
  buckets: [0.1, 0.5, 1, 2, 5, 10, 30],
  registers: [register],
});

// Counter: Total navigations
export const navigationsCounter = new client.Counter({
  name: 'proxy_navigations_total',
  help: 'Total number of page navigations',
  labelNames: ['status'],
  registers: [register],
});

// Counter: WebSocket connections
export const wsConnectionsCounter = new client.Counter({
  name: 'proxy_websocket_connections_total',
  help: 'Total number of WebSocket connections',
  labelNames: ['status'],
  registers: [register],
});

// Gauge: Active WebSocket connections
export const activeWsConnectionsGauge = new client.Gauge({
  name: 'proxy_websocket_connections_active',
  help: 'Current number of active WebSocket connections',
  registers: [register],
});

// Counter: Authentication attempts
export const authAttemptsCounter = new client.Counter({
  name: 'proxy_auth_attempts_total',
  help: 'Total number of authentication attempts',
  labelNames: ['status'],
  registers: [register],
});

// Counter: Rate limit hits
export const rateLimitCounter = new client.Counter({
  name: 'proxy_rate_limit_hits_total',
  help: 'Total number of rate limit hits',
  registers: [register],
});

// Histogram: Memory usage per session
export const sessionMemoryHistogram = new client.Histogram({
  name: 'proxy_session_memory_bytes',
  help: 'Memory usage per browser session',
  buckets: [50e6, 100e6, 200e6, 500e6, 1e9, 2e9], // 50MB to 2GB
  registers: [register],
});

/**
 * Get all metrics in Prometheus format
 */
export async function getMetrics(): Promise<string> {
  return register.metrics();
}

/**
 * Get metrics registry
 */
export function getRegistry() {
  return register;
}

export default {
  register,
  getMetrics,
  sessionsCreatedCounter,
  sessionsClosedCounter,
  activeSessionsGauge,
  browserPoolSizeGauge,
  navigationDurationHistogram,
  navigationsCounter,
  wsConnectionsCounter,
  activeWsConnectionsGauge,
  authAttemptsCounter,
  rateLimitCounter,
  sessionMemoryHistogram,
};
