import "dotenv/config";
import { Pool } from "pg";

async function main() {
  const databaseUrl =
    process.env.ORCHESTRATOR_DATABASE_URL ||
    process.env.DATABASE_URL ||
    "";

  if (!databaseUrl) {
    throw new Error("Missing ORCHESTRATOR_DATABASE_URL or DATABASE_URL");
  }

  const pool = new Pool({
    connectionString: databaseUrl,
  });

  try {
    await pool.query("BEGIN");

    await pool.query(`
      ALTER TABLE IF EXISTS user_wallet_mappings
      DROP CONSTRAINT IF EXISTS user_wallet_mappings_user_id_fkey
    `);

    await pool.query(`
      ALTER TABLE IF EXISTS tracked_addresses
      DROP COLUMN IF EXISTS address,
      DROP COLUMN IF EXISTS user_id,
      DROP COLUMN IF EXISTS chain_type,
      DROP COLUMN IF EXISTS wallet_id,
      DROP COLUMN IF EXISTS webhook_id
    `);

    await pool.query(`
      ALTER TABLE IF EXISTS tracked_addresses
      DROP CONSTRAINT IF EXISTS tracked_addresses_shard_key_fkey
    `);

    await pool.query(`
      ALTER TABLE IF EXISTS tracked_addresses
      ADD CONSTRAINT tracked_addresses_shard_key_fkey
      FOREIGN KEY (shard_key)
      REFERENCES tracking_shards(shard_key)
      ON DELETE CASCADE
    `).catch(async (error) => {
      if ((error as { code?: string }).code !== "42710") {
        throw error;
      }
    });

    await pool.query(`
      ALTER TABLE IF EXISTS tracked_addresses
      DROP CONSTRAINT IF EXISTS tracked_addresses_normalized_address_fkey
    `);

    await pool.query(`
      ALTER TABLE IF EXISTS tracked_addresses
      ADD CONSTRAINT tracked_addresses_normalized_address_fkey
      FOREIGN KEY (normalized_address)
      REFERENCES user_wallet_mappings(normalized_address)
      ON DELETE CASCADE
    `).catch(async (error) => {
      if ((error as { code?: string }).code !== "42710") {
        throw error;
      }
    });

    await pool.query(`
      DROP INDEX IF EXISTS idx_tracked_addresses_chain_type
    `);

    await pool.query(`
      DROP TABLE IF EXISTS user_mappings
    `);

    await pool.query("COMMIT");

    console.log("legacy postgres state cleanup complete", {
      dropped_columns: [
        "tracked_addresses.address",
        "tracked_addresses.user_id",
        "tracked_addresses.chain_type",
        "tracked_addresses.wallet_id",
        "tracked_addresses.webhook_id",
      ],
      dropped_table: "user_mappings",
    });
  } catch (error) {
    await pool.query("ROLLBACK");
    throw error;
  } finally {
    await pool.end();
  }
}

main().catch((error) => {
  console.error(
    "legacy postgres state cleanup failed",
    error instanceof Error ? error.message : String(error)
  );
  process.exit(1);
});
