/* eslint-env node */

/**
 * List of workflows to dispatch to `getsentry`
 *
 * `pathFilterName` refers to the path filters in `.github/file-filters.yml` (`getsentry/paths-filter` action)
 *
 * TODO(billy): Refactor workflow files to be an enum so that we can integration test them. Otherwise if they are
 *              deleted/renamed in `getsentry`, this will fail
 */
const DISPATCHES = [
  {
    workflow: 'js-build-and-lint.yml',
    pathFilterName: 'frontend',
  },
  {
    workflow: 'backend.yml',
    pathFilterName: 'backend_src',
  },
];

module.exports = {
  dispatch: async ({github, context, core, fileChanges, mergeCommitSha}) => {
    core.startGroup('Dispatching request to getsentry.');

    const shouldSkip = {
      frontend: fileChanges.frontend_all !== 'true',
      backend_dependencies: fileChanges.backend_dependencies !== 'true',
    };

    await Promise.all(
      DISPATCHES.map(({workflow, pathFilterName}) => {
        const inputs = {
          pull_request_number: `${context.payload.pull_request.number}`, // needs to be string
          skip: `${shouldSkip[pathFilterName]}`, // even though this is a boolean, it must be cast to a string

          // sentrySHA is the sha getsentry should run against.
          'sentry-sha': mergeCommitSha,
          // prSHA is the sha actions should post commit statuses too.
          'sentry-pr-sha': context.payload.pull_request.head.sha,
        };

        core.info(
          `Sending dispatch for '${workflow}':\n${JSON.stringify(inputs, null, 2)}`
        );

        return github.rest.actions.createWorkflowDispatch({
          owner: 'getsentry',
          repo: 'getsentry',
          workflow_id: workflow,
          ref: 'master',
          inputs,
        });
      })
    );

    core.endGroup();
  },
};
