import { tmpdir } from 'node:os';
import { resolve } from 'node:path';
import fs from 'node:fs';
import { Nymph } from '@nymphjs/nymph';
import {
  EntitiesTest,
  UIDTest,
  ExportImportTest,
} from '@nymphjs/nymph/dist/driver/testArtifacts.js';
import { TilmeldTest } from '@nymphjs/tilmeld/dist/testArtifacts.js';

import SQLite3Driver from './SQLite3Driver.js';

describe('SQLite3Driver In-Memory', () => {
  const sqliteConfig = {
    filename: ':memory:',
    explicitWrite: true,
  };
  const nymph = new Nymph({}, new SQLite3Driver(sqliteConfig));

  if (nymph.driver.isConnected()) {
    nymph.driver.disconnect();
    nymph.driver.connect();
  }
  EntitiesTest(nymph, it);
  UIDTest(nymph, it);
  ExportImportTest(nymph, it);

  const tilmeldNymph = nymph.clone();
  TilmeldTest(tilmeldNymph, it);
});

describe('SQLite3Driver DB File', () => {
  const filename = resolve(tmpdir(), `nymph-test-${Date.now()}.db`);
  const sqliteConfig = {
    filename,
    explicitWrite: true,
  };
  const nymph = new Nymph({}, new SQLite3Driver(sqliteConfig));

  if (nymph.driver.isConnected()) {
    nymph.driver.disconnect();
    nymph.driver.connect();
  }
  EntitiesTest(nymph, it);
  UIDTest(nymph, it);
  ExportImportTest(nymph, it);

  const tilmeldNymph = nymph.clone();
  TilmeldTest(tilmeldNymph, it);

  it('cleans up the db', () => {
    try {
      fs.unlinkSync(filename);
    } catch (e: any) {
      // ignore errors
    }
    try {
      fs.unlinkSync(filename + '-shm');
    } catch (e: any) {
      // ignore errors
    }
    try {
      fs.unlinkSync(filename + '-wal');
    } catch (e: any) {
      // ignore errors
    }
  });
});
