/**
 * Integration Test Setup
 * Provides shared utilities and fixtures for integration tests
 */

import { FastifyInstance } from 'fastify';
import { getPool } from '@the-order/database';

export interface TestContext {
  identityService: FastifyInstance;
  intakeService: FastifyInstance;
  financeService: FastifyInstance;
  dataroomService: FastifyInstance;
  dbPool: ReturnType<typeof getPool>;
}

export async function setupTestContext(): Promise<TestContext> {
  // Import services dynamically to avoid circular dependencies
  const { createServer: createIdentityServer } = await import('../../services/identity/src/index');
  const { createServer: createIntakeServer } = await import('../../services/intake/src/index');
  const { createServer: createFinanceServer } = await import('../../services/finance/src/index');
  const { createServer: createDataroomServer } = await import('../../services/dataroom/src/index');

  const identityService = await createIdentityServer();
  const intakeService = await createIntakeServer();
  const financeService = await createFinanceServer();
  const dataroomService = await createDataroomServer();

  await Promise.all([
    identityService.ready(),
    intakeService.ready(),
    financeService.ready(),
    dataroomService.ready(),
  ]);

  const dbPool = getPool({
    connectionString: process.env.TEST_DATABASE_URL || process.env.DATABASE_URL || '',
  });

  return {
    identityService,
    intakeService,
    financeService,
    dataroomService,
    dbPool,
  };
}

export async function teardownTestContext(context: TestContext): Promise<void> {
  await Promise.all([
    context.identityService.close(),
    context.intakeService.close(),
    context.financeService.close(),
    context.dataroomService.close(),
  ]);

  await context.dbPool.end();
}

export async function cleanupDatabase(pool: ReturnType<typeof getPool>): Promise<void> {
  // Clean up test data
  await pool.query('TRUNCATE TABLE credentials, documents, payments, deals CASCADE');
}

