/**
 * @license
 * Copyright 2023 Google Inc.
 * SPDX-License-Identifier: Apache-2.0
 */

import {ok} from 'node:assert';
import {execSync} from 'node:child_process';
import {parseArgs} from 'node:util';

import {AngularProjectMulti, AngularProjectSingle} from './projects.mjs';

const {values: args} = parseArgs({
  options: {
    testRunner: {
      type: 'string',
      short: 't',
      default: undefined,
    },
    name: {
      type: 'string',
      short: 'n',
      default: undefined,
    },
  },
});

if (process.env.CI) {
  // Need to install in CI
  execSync('npm install -g @angular/cli@latest @angular-devkit/schematics-cli');
  const runners = ['node', 'jest', 'jasmine', 'mocha'];
  const groups = [];

  for (const runner of runners) {
    groups.push([
      new AngularProjectSingle(runner),
      new AngularProjectMulti(runner),
    ]);
  }

  const angularProjects = await Promise.allSettled(
    groups.flat().map(async project => {
      return await project.create();
    })
  );
  ok(
    angularProjects.every(project => {
      return project.status === 'fulfilled';
    }),
    'Building of 1 or more projects failed!'
  );

  for await (const runnerGroup of groups) {
    const smokeResults = await Promise.allSettled(
      runnerGroup.map(async project => {
        return await project.runSmoke();
      })
    );
    ok(
      smokeResults.every(project => {
        return project.status === 'fulfilled';
      }),
      `Smoke test for ${runnerGroup[0].runner} failed!`
    );
  }
} else {
  const single = new AngularProjectSingle(args.testRunner, args.name);
  const multi = new AngularProjectMulti(args.testRunner, args.name);

  await Promise.all([single.create(), multi.create()]);
  await Promise.all([single.runSmoke(), multi.runSmoke()]);
}