/**
 * Performance Services Package
 * Optimizations for caching, message batching, and offline queue management.
 */

// ============================================================================
// Cache System
// ============================================================================

export {
  // Types
  type CacheEntry,
  type CacheStats,
  type CacheOptions,
  // Classes
  LRUCache,
  QueryCache,
  PlayerDataCache,
  // Global instances
  getQueryCache,
  getPlayerDataCache,
  getGeneralCache,
  // Utilities
  memoize,
  memoizeSync,
  clearAllCaches,
  getAllCacheStats,
  logCacheStats,
  // Service object
  cacheService,
} from './cache.js';

// ============================================================================
// Batch Messaging System
// ============================================================================

export {
  // Types
  type MessagePriority,
  type QueuedMessage,
  type BatchedPayload,
  type BatchStats,
  type BatchOptions,
  // Classes
  MessageBatcher,
  BatchMessageManager,
  // Global instance
  getBatchMessageManager,
  // Utilities
  sendBatchedMessage,
  sendImmediateMessage,
  flushPlayerMessages,
  deduplicateBatch,
  mergeBatch,
  logBatchStats,
  // Service object
  batchMessagingService,
} from './batchMessaging.js';

// ============================================================================
// Offline Queue System (re-exported from background service)
// ============================================================================

// Note: The offline queue is implemented in background/offline_queue.ts
// We re-export it here for convenience when importing performance services
export {
  type QueuedEvent,
  type OfflineQueueStats,
  type ReconnectInfo,
  type IterateGamesOptions,
  OfflineEventQueue,
  getOfflineQueue,
  handlePlayerDisconnect,
  handlePlayerReconnect,
  replayEvents,
  iterateGames,
  registerOfflineQueueJobs,
  offlineQueueService,
} from '../background/offline_queue.js';

// ============================================================================
// Combined Performance Service
// ============================================================================

import { cacheService } from './cache.js';
import { batchMessagingService } from './batchMessaging.js';
import { offlineQueueService } from '../background/offline_queue.js';

/**
 * Combined performance service for easy access to all performance utilities.
 */
export const performanceService = {
  cache: cacheService,
  batching: batchMessagingService,
  offlineQueue: offlineQueueService,

  /**
   * Log all performance statistics.
   */
  logAllStats(): void {
    console.log('=== Performance Statistics ===');
    cacheService.logCacheStats();
    batchMessagingService.logBatchStats();
    const queueStats = offlineQueueService.getOfflineQueue().getStats();
    console.log(
      `[OfflineQueue] Stats: ` +
      `offlinePlayers=${queueStats.offlinePlayers}, ` +
      `queuedEvents=${queueStats.totalQueuedEvents}, ` +
      `maxQueueSize=${queueStats.maxQueueSize}, ` +
      `maxOfflineHours=${queueStats.maxOfflineHours}`
    );
    console.log('==============================');
  },

  /**
   * Clear all caches and reset statistics.
   */
  reset(): void {
    cacheService.clearAllCaches();
    batchMessagingService.getBatchMessageManager().clear();
  },
};
