/**
 * @license
 * Copyright (C) 2016 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 {GrPluginRestApi} from './gr-plugin-rest-api';
import {GrEventHelper} from '../../plugins/gr-event-helper/gr-event-helper';
import {RevisionInfo, ChangeInfo, RequestPayload} from '../../../types/common';
import {HttpMethod} from '../../../constants/constants';

interface PluginApi {
  restApi(): GrPluginRestApi;
  deprecated: PluginDeprecatedApi;
  eventHelper(element: Node): GrEventHelper;
}
interface PluginDeprecatedApi {
  popup(element: Node): GrPopupInterface;
}

interface GrPopupInterface {
  close(): void;
}

interface ButtonCallBacks {
  onclick: (event: Event) => boolean;
}

interface ActionInterface {
  method: HttpMethod;
  __url: string;
  __key: string;
}

export class GrPluginActionContext {
  private _popups: GrPopupInterface[] = [];

  constructor(
    public readonly plugin: PluginApi,
    public readonly action: ActionInterface,
    public readonly change: ChangeInfo,
    public readonly revision: RevisionInfo
  ) {}

  popup(element: Node) {
    this._popups.push(this.plugin.deprecated.popup(element));
  }

  hide() {
    for (const popupApi of this._popups) {
      popupApi.close();
    }
    this._popups.splice(0);
  }

  refresh() {
    window.location.reload();
  }

  textfield() {
    return document.createElement('paper-input');
  }

  br() {
    return document.createElement('br');
  }

  msg(text: string) {
    const label = document.createElement('gr-label');
    label.appendChild(document.createTextNode(text));
    return label;
  }

  div(...els: Node[]) {
    const div = document.createElement('div');
    for (const el of els) {
      div.appendChild(el);
    }
    return div;
  }

  button(label: string, callbacks: ButtonCallBacks | undefined) {
    const onClick = callbacks && callbacks.onclick;
    const button = document.createElement('gr-button');
    button.appendChild(document.createTextNode(label));
    if (onClick) {
      this.plugin.eventHelper(button).onTap(onClick);
    }
    return button;
  }

  checkbox() {
    const checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    return checkbox;
  }

  label(checkbox: Node, title: string) {
    return this.div(checkbox, this.msg(title));
  }

  prependLabel(title: string, checkbox: Node) {
    return this.label(checkbox, title);
  }

  call(payload: RequestPayload, onSuccess: (result: unknown) => void) {
    if (!this.action.__url) {
      console.warn(`Unable to ${this.action.method} to ${this.action.__key}!`);
      return;
    }
    this.plugin
      .restApi()
      .send(this.action.method, this.action.__url, payload)
      .then(onSuccess)
      .catch((error: unknown) => {
        document.dispatchEvent(
          new CustomEvent('show-alert', {
            detail: {
              message: `Plugin network error: ${error}`,
            },
          })
        );
      });
  }
}
