import { describe, expect, it } from '@jest/globals';
import fs from 'node:fs';
import path from 'node:path';

const schemaPath = path.resolve(__dirname, '../../../prisma/schema.prisma');
const migrationPath = path.resolve(
  __dirname,
  '../../../prisma/migrations/20260801120000_add_translation_execution_mode/migration.sql'
);

const modelBlock = (schema: string, modelName: string): string => {
  const match = schema.match(new RegExp(`model ${modelName} \\{([\\s\\S]*?)\\n\\}`));
  if (!match) throw new Error(`Missing Prisma model: ${modelName}`);
  return match[1];
};

describe('translation execution mode schema contract', () => {
  it('defines execution modes and mock scenarios', () => {
    const schema = fs.readFileSync(schemaPath, 'utf8');

    expect(schema).toMatch(/enum TranslationExecutionMode \{\s+live\s+mock\s+\}/);
    expect(schema).toMatch(
      /enum MockTranslationScenario \{\s+success\s+pending_hold\s+processing_hold\s+rate_limited\s+transient_failure\s+permanent_failure\s+timeout\s+malformed_response\s+\}/
    );
  });

  it('keeps license and job execution indexes and live defaults', () => {
    const schema = fs.readFileSync(schemaPath, 'utf8');
    const license = modelBlock(schema, 'License');
    const job = modelBlock(schema, 'TranslationJob');

    expect(license).toMatch(/execution_mode\s+TranslationExecutionMode\s+@default\(live\)/);
    expect(license).toContain('@@index([execution_mode, status])');
    expect(job).toMatch(/execution_mode\s+TranslationExecutionMode\s+@default\(live\)/);
    expect(job).toMatch(/mock_scenario\s+MockTranslationScenario\?/);
    expect(job).not.toMatch(/mock_scenario[^\n]*@default/);
    expect(job).toContain('@@index([execution_mode, status, created_at])');
  });

  it('uses an additive migration without backfill or destructive SQL', () => {
    const migration = fs.readFileSync(migrationPath, 'utf8');

    expect(migration).toContain('CREATE TYPE "TranslationExecutionMode" AS ENUM');
    expect(migration).toContain('CREATE TYPE "MockTranslationScenario" AS ENUM');
    expect(migration).toContain(
      'ADD COLUMN "execution_mode" "TranslationExecutionMode" NOT NULL DEFAULT \'live\''
    );
    expect(migration).toContain('ADD COLUMN "mock_scenario" "MockTranslationScenario"');
    expect(migration).toContain('licenses_execution_mode_status_idx');
    expect(migration).toContain('translation_jobs_execution_mode_status_created_at_idx');
    expect(migration).not.toMatch(/\b(?:DROP|DELETE|UPDATE)\b/i);
  });
});
