import { getDb } from "../db.ts";
import * as fs from "fs";
import * as path from "path";

/**
 * Execute all pending migrations
 * Run with: tsx server/migrations/runMigrations.ts
 */
async function runMigrations() {
  console.log("[Migrations] Starting database migrations...");

  const db = await getDb();
  if (!db) {
    console.error("[Migrations] Failed to connect to database");
    process.exit(1);
  }

  try {
    // Read all migration files
    const migrationsDir = path.join(__dirname, "../../migrations");
    const migrationFiles = [
      "training_tables.sql",
      "admin_tables.sql",
      "add_easter_game.sql",
    ];

    for (const file of migrationFiles) {
      const filePath = path.join(migrationsDir, file);
      console.log(`[Migrations] Reading ${file}...`);

      if (!fs.existsSync(filePath)) {
        console.warn(`[Migrations] File not found: ${filePath}`);
        continue;
      }

      const sql = fs.readFileSync(filePath, "utf-8");

      // Split SQL by semicolons and execute each statement
      const statements = sql
        .split(";")
        .map((stmt) => stmt.trim())
        .filter((stmt) => stmt.length > 0);

      console.log(
        `[Migrations] Executing ${statements.length} statements from ${file}...`
      );

      for (const statement of statements) {
        try {
          // Execute raw SQL
          await db.execute(statement);
          console.log(`[Migrations] ✓ Executed statement`);
        } catch (error: any) {
          // Ignore "table already exists" errors
          if (error.message?.includes("already exists")) {
            console.log(`[Migrations] ℹ Table already exists, skipping`);
          } else {
            console.error(`[Migrations] ✗ Error executing statement:`, error);
            throw error;
          }
        }
      }

      console.log(`[Migrations] ✓ Completed ${file}`);
    }

    console.log("[Migrations] ✓ All migrations completed successfully!");
    process.exit(0);
  } catch (error) {
    console.error("[Migrations] ✗ Migration failed:", error);
    process.exit(1);
  }
}

runMigrations();
