/**
 * E2E Tests for Enhanced Background Jobs 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 Background Jobs E2E Tests', () => {
  const testOutputDir = path.join(__dirname, '../../.e2e-output/enhanced-background-jobs');

  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 background jobs infrastructure', async () => {
    const workflow: Workflow = {
      workflow: {
        id: 'test-background-jobs',
        version: '1.0.0',
        name: 'Test Background Jobs',
        description: 'Testing background jobs',
      },
      stack: {},
      background_jobs: {
        provider: 'bullmq',
        redis: {
          url: 'redis://localhost:6379',
        },
        jobs: [
          {
            name: 'SendEmail',
            handler: 'sendEmailHandler',
          },
        ],
        cron_jobs: [
          {
            name: 'DailyReport',
            schedule: '0 0 * * *',
            handler: 'generateDailyReport',
          },
        ],
        dashboard: {
          enabled: true,
        },
      },
    };

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

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

    // Verify queue
    const queuePath = path.join(testOutputDir, 'api/src/queues/job-queue.ts');
    expect(fs.existsSync(queuePath)).toBe(true);

    // Verify job handler
    const handlerPath = path.join(testOutputDir, 'api/src/jobs/sendemail-handler.ts');
    expect(fs.existsSync(handlerPath)).toBe(true);

    // Verify worker
    const workerPath = path.join(testOutputDir, 'api/src/workers/job-worker.ts');
    expect(fs.existsSync(workerPath)).toBe(true);

    // Verify cron scheduler
    const cronPath = path.join(testOutputDir, 'api/src/jobs/cron-scheduler.ts');
    expect(fs.existsSync(cronPath)).toBe(true);

    // Verify dashboard
    const dashboardPath = path.join(testOutputDir, 'api/src/dashboard/job-dashboard.ts');
    expect(fs.existsSync(dashboardPath)).toBe(true);
  });

  it('should generate dead letter queue', async () => {
    const workflow: Workflow = {
      workflow: {
        id: 'test-dlq',
        version: '1.0.0',
        name: 'Test Dead Letter Queue',
        description: 'Testing DLQ',
      },
      stack: {},
      background_jobs: {
        provider: 'bullmq',
        dead_letter_queue: {
          enabled: true,
        },
      },
    };

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

    const dlqPath = path.join(testOutputDir, 'api/src/queues/dead-letter-queue.ts');
    expect(fs.existsSync(dlqPath)).toBe(true);
  });
});
