/**
 * E2E Tests for Enhanced Rate Limiting Generator
 * Generated by Bangstack
 */

import * as fs from 'fs';
import '../generators/index';
import * as path from 'path';
import { GenerationOrchestrator } from '../generators/generation-orchestrator';
import { Workflow } from '../types/workflow';

describe('Enhanced Rate Limiting E2E Tests', () => {
  const testOutputDir = path.join(__dirname, '../../.e2e-output/enhanced-rate-limiting');

  beforeAll(() => {
    if (fs.existsSync(testOutputDir)) {
      fs.rmSync(testOutputDir, { recursive: true, force: true });
    }
  });

  afterAll(() => {
    if (fs.existsSync(testOutputDir)) {
      fs.rmSync(testOutputDir, { recursive: true, force: true });
    }
  });

  it('should generate complete rate limiting infrastructure', async () => {
    const workflow: Workflow = {
      workflow: {
        id: 'test-rate-limiting',
        version: '1.0.0',
        name: 'Test Rate Limiting',
        description: 'Testing rate limiting',
      },
      stack: {},
      rate_limiting: {
        middleware: true,
        storage: {
          type: 'redis',
          redis_url: 'redis://localhost:6379',
        },
        strategy: 'sliding_window',
        per_user: {
          requests: 100,
          window: '1m',
        },
      },
    };

    const orchestrator = new GenerationOrchestrator();
    const _result = await orchestrator.generate(workflow, { outputDirectory: testOutputDir, dryRun: false });

    // Verify config file
    const configPath = path.join(testOutputDir, 'api/src/config/rate-limiting.ts');
    expect(fs.existsSync(configPath)).toBe(true);

    const configContent = fs.readFileSync(configPath, 'utf-8');
    expect(configContent).toContain('sliding_window');

    // Verify middleware
    const middlewarePath = path.join(testOutputDir, 'api/src/middleware/rate-limit.ts');
    expect(fs.existsSync(middlewarePath)).toBe(true);

    // Verify Redis store
    const storePath = path.join(testOutputDir, 'api/src/middleware/rate-limit-store.ts');
    expect(fs.existsSync(storePath)).toBe(true);

    const storeContent = fs.readFileSync(storePath, 'utf-8');
    expect(storeContent).toContain('Redis');

    // Verify strategies
    const strategiesPath = path.join(testOutputDir, 'api/src/middleware/rate-limit-strategies.ts');
    expect(fs.existsSync(strategiesPath)).toBe(true);
  });

  it('should generate memory store', async () => {
    const workflow: Workflow = {
      workflow: {
        id: 'test-memory-store',
        version: '1.0.0',
        name: 'Test Memory Store',
        description: 'Testing memory store',
      },
      stack: {},
      rate_limiting: {
        storage: {
          type: 'memory',
        },
      },
    };

    const orchestrator = new GenerationOrchestrator();
    const _result = await orchestrator.generate(workflow, { outputDirectory: testOutputDir, dryRun: false });

    const storePath = path.join(testOutputDir, 'api/src/middleware/rate-limit-store.ts');
    expect(fs.existsSync(storePath)).toBe(true);

    const storeContent = fs.readFileSync(storePath, 'utf-8');
    expect(storeContent).toContain('Map<string, StoreEntry>');
  });
});
