import os from 'node:os';
import fs from 'node:fs';
import path from 'node:path';
import { SqliteDatabase } from '@/lib/db/sqlite';
import { Migrator } from '@/lib/db/migrator';

let counter = 0;

/**
 * テスト用の一時SQLite DBを作成する。
 * 実DB(一時ファイル)を使用し、テスト終了時に自動削除される。
 */
export function createTestDb(): SqliteDatabase {
  const tmpDir = os.tmpdir();
  const dbPath = path.join(
    tmpDir,
    `test-${process.pid}-${Date.now()}-${counter++}.db`
  );
  const db = new SqliteDatabase(dbPath);

  const originalClose = db.close.bind(db);
  db.close = () => {
    originalClose();
    if (fs.existsSync(dbPath)) {
      fs.unlinkSync(dbPath);
    }
    const walPath = `${dbPath}-wal`;
    const shmPath = `${dbPath}-shm`;
    if (fs.existsSync(walPath)) fs.unlinkSync(walPath);
    if (fs.existsSync(shmPath)) fs.unlinkSync(shmPath);
  };

  return db;
}

/**
 * マイグレーション済みのテスト用DBを作成する
 */
export function createMigratedTestDb(): SqliteDatabase {
  const db = createTestDb();
  const migrationsDir = path.join(process.cwd(), 'lib', 'db', 'migrations');
  const migrator = new Migrator(db, migrationsDir);
  migrator.migrate();
  return db;
}
