import { MigrationInterface, QueryRunner } from 'typeorm';

/**
 * Trip Source — split into its own permission module (moved from the
 * Settings group into Masters, 2026-10-10). Companion:
 * ModuleName.TRIP_SOURCE in role-permission.entity.ts.
 *
 * Access-preserving seed: every existing role gets a `trip_source` row
 * equal to its CURRENT `settings` level, so nobody who could manage
 * trip sources under Settings loses that ability after the split.
 * Roles with no settings row (unlikely) are left to the onModuleInit
 * backfill, which seeds the role's default access. New tenants pick up
 * `trip_source` from the same backfill / onboarding seed (which equals
 * each role's defaultAccess — identical to settings, since no seed role
 * overrides settings).
 */
export class TripSourcePermissionModule1787200000000 implements MigrationInterface {
  name = 'TripSourcePermissionModule1787200000000';

  public async up(qr: QueryRunner): Promise<void> {
    await qr.query(`
      INSERT INTO "role_permissions" ("id", "tenant_id", "role_id", "module", "access_level", "created_at", "updated_at", "is_deleted")
      SELECT
        gen_random_uuid(),
        s."tenant_id",
        s."role_id",
        'trip_source',
        s."access_level",
        NOW(),
        NOW(),
        false
      FROM "role_permissions" s
      JOIN "roles" r ON r."id" = s."role_id" AND r."is_deleted" = false
      WHERE s."module" = 'settings'
        AND s."is_deleted" = false
        AND NOT EXISTS (
          SELECT 1 FROM "role_permissions" t
          WHERE t."role_id" = s."role_id"
            AND t."module" = 'trip_source'
        )
    `);
  }

  public async down(qr: QueryRunner): Promise<void> {
    await qr.query(`DELETE FROM "role_permissions" WHERE "module" = 'trip_source'`);
  }
}
