/**
 * @license
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import './gr-checkers-list';
import {computeDuration} from './util';
import {PluginApi} from '@gerritcodereview/typescript-api/plugin';
import {PopupPluginApi} from '@gerritcodereview/typescript-api/popup';
import {RestPluginApi} from '@gerritcodereview/typescript-api/rest';
import {
  Category,
  ChangeData,
  CheckRun,
  ChecksProvider,
  LinkIcon,
  ResponseCode,
  RunStatus,
} from '@gerritcodereview/typescript-api/checks';
import {Check} from './types';

function convertStatus(check: Check): RunStatus {
  if (check.state === 'RUNNING' || check.state === 'SCHEDULED') {
    return RunStatus.RUNNING;
  }
  if (check.state === 'FAILED' || check.state === 'SUCCESSFUL') {
    return RunStatus.COMPLETED;
  }
  return RunStatus.RUNNABLE;
}

export class ChecksFetcher implements ChecksProvider {
  private restApi: RestPluginApi;

  private changeNumber?: number;

  private patchsetNumber?: number;

  // This is used to trigger .close() in an event.
  private popup?: PopupPluginApi;

  constructor(private readonly plugin: PluginApi) {
    this.restApi = plugin.restApi();
  }

  async fetch(changeData: ChangeData) {
    const {changeNumber, patchsetNumber} = changeData;
    this.changeNumber = changeNumber;
    this.patchsetNumber = patchsetNumber;
    const checks = await this.apiGet('?o=CHECKER');
    return {
      responseCode: ResponseCode.OK,
      actions: [
        {
          name: 'Configure Checkers',
          primary: true,
          callback: () => {
            this.plugin.popup('gr-checkers-list').then(popup => {
              this.popup = popup;

              const handler = () => {
                this.popup?.close();
                document.removeEventListener('close-popup', handler);
              };

              document.addEventListener('close-popup', handler);
            });
            return undefined;
          },
        },
      ],
      runs: checks.map(check => this.convert(check)),
    };
  }

  async apiGet(suffix: string) {
    return await this.restApi.get<Check[]>(
      `/changes/${this.changeNumber}/revisions/${this.patchsetNumber}/checks${suffix}`
    );
  }

  async apiPost(suffix: string) {
    return await this.restApi.post(
      `/changes/${this.changeNumber}/revisions/${this.patchsetNumber}/checks${suffix}`
    );
  }

  convertToLabelName(checkerName: string) {
    if (checkerName === 'Code Style') {
      return 'Code-Style';
    }
    if (
      checkerName === 'PolyGerrit UI Tests' ||
      checkerName === 'Build/Tests' ||
      checkerName === 'RBE Build/Tests'
    ) {
      return 'Verified';
    }
    return checkerName;
  }

  /**
   * Converts a Checks Plugin CheckInfo object into a Checks API Run object.
   */
  convert(check: Check): CheckRun {
    const status = convertStatus(check);
    const run: CheckRun = {
      checkName: check.checker_name,
      checkDescription: check.checker_description,
      externalId: check.checker_uuid,
      status,
      labelName: this.convertToLabelName(check.checker_name),
    };
    if (check.started) run.startedTimestamp = new Date(check.started);
    if (check.finished) run.finishedTimestamp = new Date(check.finished);
    if (check.url) run.statusLink = check.url;
    if (status === 'RUNNING') {
      if (check.message) {
        run.statusDescription = check.message;
      } else if (check.state === 'SCHEDULED') {
        run.statusDescription = 'scheduled only, not yet running';
      }
    } else if (check.state === 'SUCCESSFUL') {
      run.statusDescription =
        check.message || `Passed (${computeDuration(check)})`;
    } else if (check.state === 'FAILED') {
      run.results = [
        {
          category: Category.ERROR,
          summary: check.message || `Failed (${computeDuration(check)})`,
        },
      ];
      if (check.url) {
        run.results[0].links = [
          {
            url: check.url,
            primary: true,
            icon: LinkIcon.EXTERNAL,
          },
        ];
      }
    }
    // We also provide the "run" action for running checks, because the "/rerun"
    // endpoint just updates the state to NOT_STARTED, which for running checks
    // means that they are stopped and rerun.
    let actionName = 'Run';
    if (status === 'RUNNING') actionName = 'Stop and Rerun';
    if (status === 'COMPLETED') actionName = 'Rerun';
    run.actions = [
      {
        name: actionName,
        primary: true,
        callback: () => this.run(check.checker_uuid),
      },
    ];
    return run;
  }

  run(uuid: string) {
    return this.apiPost(`/${uuid}/rerun`)
      .then(_ => {
        return {message: 'Run triggered.', shouldReload: true};
      })
      .catch(e => {
        return {message: `Triggering the run failed: ${e.message}`};
      });
  }
}
