/**
 * Minimal migration runner.
 * Применяет все db/migrations/*.sql по возрастанию, фиксирует версию в core.schema_version.
 * Идемпотентность обеспечивается самими миграциями (CREATE … IF NOT EXISTS).
 */
import 'dotenv/config';
import { readdir, readFile } from 'node:fs/promises';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import pg from 'pg';
import { config } from '../src/config.js';

const __dirname = dirname(fileURLToPath(import.meta.url));
const MIGRATIONS_DIR = join(__dirname, '..', '..', 'db', 'migrations');

async function main(): Promise<void> {
  const files = (await readdir(MIGRATIONS_DIR))
    .filter(f => /^\d{4}_.*\.sql$/.test(f))
    .sort();

  if (files.length === 0) {
    console.log('no migrations found');
    return;
  }

  const client = new pg.Client({
    host: config.pg.host, port: config.pg.port,
    user: config.pg.user, password: config.pg.password,
    database: config.pg.database,
    application_name: 'mocl-migrate',
  });
  await client.connect();
  try {
    for (const f of files) {
      const sql = await readFile(join(MIGRATIONS_DIR, f), 'utf8');
      console.log(`-> ${f}`);
      await client.query('BEGIN');
      try {
        await client.query(sql);
        await client.query('COMMIT');
      } catch (e) {
        await client.query('ROLLBACK');
        throw e;
      }
    }
    console.log('migrations OK');
  } finally {
    await client.end();
  }
}

main().catch(err => {
  console.error('migration failed', err);
  process.exit(1);
});
