/**
 * @license
 * Copyright (C) 2020 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 {GrAttributeHelper} from './gr-attribute-helper/gr-attribute-helper';
import {GrPluginRestApi} from '../shared/gr-js-api-interface/gr-plugin-rest-api';
import {GrEventHelper} from './gr-event-helper/gr-event-helper';
import {GrPopupInterface} from './gr-popup-interface/gr-popup-interface';
import {GrPluginActionContext} from '../shared/gr-js-api-interface/gr-plugin-action-context';
import {ConfigInfo} from '../../types/common';

interface GerritElementExtensions {
  content?: HTMLElement & {hidden?: boolean};
  change?: unknown;
  revision?: unknown;
  token?: string;
  repoName?: string;
  config?: ConfigInfo;
}
export type HookCallback = (el: HTMLElement & GerritElementExtensions) => void;

export interface HookApi {
  onAttached(callback: HookCallback): HookApi;
  onDetached(callback: HookCallback): HookApi;
  getAllAttached(): HTMLElement[];
  getLastAttached(): Promise<HTMLElement>;
  getModuleName(): string;
}

export enum TargetElement {
  CHANGE_ACTIONS = 'changeactions',
  REPLY_DIALOG = 'replydialog',
}

// Note: for new events, naming convention should be: `a-b`
export enum EventType {
  HISTORY = 'history',
  LABEL_CHANGE = 'labelchange',
  SHOW_CHANGE = 'showchange',
  SUBMIT_CHANGE = 'submitchange',
  SHOW_REVISION_ACTIONS = 'show-revision-actions',
  COMMIT_MSG_EDIT = 'commitmsgedit',
  COMMENT = 'comment',
  REVERT = 'revert',
  REVERT_SUBMISSION = 'revert_submission',
  POST_REVERT = 'postrevert',
  ANNOTATE_DIFF = 'annotatediff',
  ADMIN_MENU_LINKS = 'admin-menu-links',
  HIGHLIGHTJS_LOADED = 'highlightjs-loaded',
}

export interface RegisterOptions {
  slot?: string;
  replace: unknown;
}

export interface PanelInfo {
  body: Element;
  p: {[key: string]: any};
  onUnload: () => void;
}

export interface SettingsInfo {
  body: Element;
  token?: string;
  onUnload: () => void;
  setTitle: () => void;
  setWindowTitle: () => void;
  show: () => void;
}

export interface PluginApi {
  _url?: URL;
  deprecated: PluginDeprecatedApi;
  hook(endpointName: string, opt_options?: RegisterOptions): HookApi;
  getPluginName(): string;
  on(eventName: string, target: any): void;
  attributeHelper(element: Element): GrAttributeHelper;
  restApi(): GrPluginRestApi;
  eventHelper(element: Node): GrEventHelper;
}

export interface PluginDeprecatedApi {
  _loadedGwt(): void;
  install: () => void;
  popup(element: Node): GrPopupInterface;
  onAction(
    type: string,
    action: string,
    callback: (ctx: GrPluginActionContext) => void
  ): void;
  panel(extensionpoint: string, callback: (panel: PanelInfo) => void): void;
  screen(pattern: string, callback: (settings: SettingsInfo) => void): void;
  settingsScreen(
    path: string,
    menu: string,
    callback: (settings: SettingsInfo) => void
  ): void;
}
