#!/usr/bin/env ts-node-esm
import { resolve } from 'node:path';

import * as p from '@clack/prompts';
import { spawn } from 'child_process';
import { readdir } from 'fs/promises';
import * as process from 'process';
import { fileURLToPath } from 'url';

import pkg from '../package.json' assert { type: 'json' };
const root = fileURLToPath(new URL('..', import.meta.url));
const testDir = resolve(root, 'src', 'tests');
const files = await readdir(testDir);

const watchMode = process.argv.includes('--watch');

const sharedArgs = [
  ...pkg.nodemonConfig.nodeArgs,
  '--test',
  watchMode ? '--watch' : '',
];

const env = {
  PATH: process.env.PATH,
  NODE_ENV: 'test',
  DATABASE_URL: process.env.DATABASE_URL,
};

if (process.argv[2] === 'all') {
  const cp = spawn('node', [...sharedArgs, resolve(testDir, '*')], {
    cwd: root,
    env,
    stdio: 'inherit',
    shell: true,
  });
  cp.on('exit', code => {
    process.exit(code ?? 0);
  });
} else {
  const result = await p.group({
    file: () =>
      p.select({
        message: 'Select a file to run',
        options: files.map(file => ({
          label: file,
          value: file as any,
        })),
      }),
  });

  const target = resolve(testDir, result.file);

  const cp = spawn(
    'node',
    [
      ...sharedArgs,
      '--test-reporter=spec',
      '--test-reporter-destination=stdout',
      target,
    ],
    {
      cwd: root,
      env,
      stdio: 'inherit',
      shell: true,
    }
  );
  cp.on('exit', code => {
    process.exit(code ?? 0);
  });
}
