export class CacheKeyGenerator {
  /**
   * Generate cache key for market data
   */
  static marketData(symbol: string, timeframe: string, date?: Date): string {
    const dateStr = date ? date.toISOString().split('T')[0] : 'latest';
    return `market:${symbol.toLowerCase()}:${timeframe}:${dateStr}`;
  }

  /**
   * Generate cache key for technical indicators
   */
  static indicator(symbol: string, indicator: string, period: number, dataHash: string): string {
    return `indicator:${symbol.toLowerCase()}:${indicator}:${period}:${dataHash}`;
  }

  /**
   * Generate cache key for backtest results
   */
  static backtest(strategyName: string, params: Record<string, unknown>): string {
    const paramHash = this.hashObject(params);
    return `backtest:${strategyName}:${paramHash}`;
  }

  /**
   * Generate cache key for strategy results
   */
  static strategy(strategyName: string, symbol: string, timeframe: string): string {
    return `strategy:${strategyName}:${symbol.toLowerCase()}:${timeframe}`;
  }

  /**
   * Generate cache key for user sessions
   */
  static userSession(userId: string): string {
    return `session:${userId}`;
  }

  /**
   * Generate cache key for portfolio data
   */
  static portfolio(userId: string, portfolioId: string): string {
    return `portfolio:${userId}:${portfolioId}`;
  }

  /**
   * Generate cache key for real-time prices
   */
  static realtimePrice(symbol: string): string {
    return `price:realtime:${symbol.toLowerCase()}`;
  }

  /**
   * Generate cache key for order book data
   */
  static orderBook(symbol: string, depth: number = 10): string {
    return `orderbook:${symbol.toLowerCase()}:${depth}`;
  }

  /**
   * Create a simple hash from object for cache keys
   */
  private static hashObject(obj: Record<string, unknown>): string {
    const str = JSON.stringify(obj, Object.keys(obj).sort());
    let hash = 0;
    for (let i = 0; i < str.length; i++) {
      const char = str.charCodeAt(i);
      hash = (hash << 5) - hash + char;
      hash = hash & hash; // Convert to 32-bit integer
    }
    return Math.abs(hash).toString(36);
  }
}
