import core from '@actions/core';
import { getMasterData, Schema, getStatusCode } from './utils.js';
import srcData from '../src/data.js';

(async () => {
  // on master branch will be empty array
  const masterDataUrls = (await getMasterData()).map(d => d.url);
  // so here data will be an array with all users
  const data = srcData.filter(d => !masterDataUrls.includes(d.url));

  const errors = data
    .map(person => Schema.validate(person))
    .filter(v => v.error)
    .map(v => v.error);

  errors.forEach(e => {
    core.error(e._original.name || e._original.url);
    e.details.forEach(d => core.error(d.message));
  });

  let failedUrlsCount = 0;
  for await (const { url } of data) {
    try {
      const statusCode = await getStatusCode(url);
      if (statusCode < 200 || statusCode >= 400) {
        core.error(`Ping to "${url}" failed with status: ${statusCode}`);
        failedUrlsCount += 1;
      }
    } catch (e) {
      core.error(`Ping to "${url}" failed with error: ${e}`);
      failedUrlsCount += 1;
    }
  }

  if (failedUrlsCount) {
    core.error(`Action failed with ${failedUrlsCount} URL fetch failures`);
  }

  if (errors.length || failedUrlsCount) {
    core.setFailed('Action failed with errors, see logs');
  }
})();
