/**
 * @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 {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;
  handleInstanceDetached(instance: HTMLElement): void;
  handleInstanceAttached(instance: HTMLElement): void;
}

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;
  popup(): Promise<GrPopupInterface>;
  popup(moduleName: string): Promise<GrPopupInterface>;
  popup(moduleName?: string): Promise<GrPopupInterface | null>;
  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;
  registerDynamicCustomComponent(
    endpointName: string,
    moduleName?: string,
    options?: RegisterOptions
  ): HookApi;
}
