/* eslint-disable no-console */
import path from 'node:path';

/**
 * Playwright globalTeardown — runs once after all E2E tests.
 *
 * Cleans up test-generated data (users, listings, etc.) while preserving
 * seed data for the next run. This ensures isolation between test runs.
 */
export default async function globalTeardown() {
  const root = path.resolve(__dirname, '..');
  const isCI = !!process.env.CI;

  if (!isCI) {
    const { config } = await import('dotenv');
    config({ path: path.join(root, '.env.test'), override: true });
  }

  const databaseUrl = process.env.DATABASE_URL;
  if (!databaseUrl) {
    console.warn('[E2E globalTeardown] DATABASE_URL not set, skipping cleanup.');
    return;
  }

  console.log('\n[E2E globalTeardown] Cleaning up test-generated data...');

  // Dynamic import to avoid top-level side effects
  const pg = await import('pg');
  const pool = new pg.default.Pool({ connectionString: databaseUrl });

  try {
    // Delete test-generated records (those NOT created by seed).
    // Seed data uses known IDs (seed-user-*, prop-1..prop-5, listing-1..listing-5)
    // and known phones (0900000001..0900000005).
    // Test fixtures generate users with phone starting with '09' + timestamp digits.
    //
    // Order matters due to foreign key constraints.
    // Seed user IDs and phones to preserve between runs
    const SEED_USER_IDS = `('seed-user-admin','seed-user-agent1','seed-user-agent2','seed-user-buyer','seed-user-seller')`;
    const SEED_PHONES = `('0900000001','0900000002','0900000003','0900000004','0900000005')`;
    const SEED_LISTING_IDS = `('listing-1','listing-2','listing-3','listing-4','listing-5')`;
    const SEED_PROP_IDS = `('prop-1','prop-2','prop-3','prop-4','prop-5')`;
    const NON_SEED_USERS = `SELECT id FROM "User" WHERE id NOT IN ${SEED_USER_IDS} AND phone NOT IN ${SEED_PHONES}`;

    await pool.query(`
      -- Delete test-generated data in dependency order (FK-safe)
      DELETE FROM "NotificationLog" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "NotificationPreference" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "Review" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "Lead" WHERE "agentId" IN (
        SELECT a.id FROM "Agent" a
        JOIN "User" u ON a."userId" = u.id
        WHERE u.id NOT IN ${SEED_USER_IDS} AND u.phone NOT IN ${SEED_PHONES}
      );
      DELETE FROM "Inquiry" WHERE "listingId" NOT IN ${SEED_LISTING_IDS};
      DELETE FROM "Transaction" WHERE "buyerId" IN (${NON_SEED_USERS});
      DELETE FROM "Payment" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "UsageRecord" WHERE "subscriptionId" IN (
        SELECT s.id FROM "Subscription" s
        JOIN "User" u ON s."userId" = u.id
        WHERE u.phone NOT IN ${SEED_PHONES}
      );
      DELETE FROM "Subscription" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "Valuation" WHERE "propertyId" NOT IN ${SEED_PROP_IDS};
      DELETE FROM "Listing" WHERE id NOT IN ${SEED_LISTING_IDS};
      DELETE FROM "PropertyMedia" WHERE "propertyId" NOT IN ${SEED_PROP_IDS};
      DELETE FROM "Property" WHERE id NOT IN ${SEED_PROP_IDS};
      DELETE FROM "Agent" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "RefreshToken" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "OAuthAccount" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "SavedSearch" WHERE "userId" IN (${NON_SEED_USERS});
      DELETE FROM "User" WHERE id NOT IN ${SEED_USER_IDS} AND phone NOT IN ${SEED_PHONES};
    `);

    console.log('[E2E globalTeardown] Test data cleaned up successfully.\n');
  } catch (err) {
    console.error('[E2E globalTeardown] Cleanup error (non-fatal):', err);
  } finally {
    await pool.end();
  }
}
