/**
 * @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 {UrlEncodedCommentId} from '../types/common';
import {FetchRequest} from '../types/types';
import {
  DialogChangeEventDetail,
  EventType,
  IronAnnounceEventDetail,
  NetworkErrorEventDetail,
  PageErrorEventDetail,
  ServerErrorEventDetail,
  ShowAlertEventDetail,
  SwitchTabEventDetail,
  TabState,
  ThreadListModifiedDetail,
  TitleChangeEventDetail,
} from '../types/events';

export function fireEvent(target: EventTarget, type: string) {
  target.dispatchEvent(
    new CustomEvent(type, {
      composed: true,
      bubbles: true,
    })
  );
}

export function fire<T>(target: EventTarget, type: string, detail: T) {
  target.dispatchEvent(
    new CustomEvent<T>(type, {
      detail,
      composed: true,
      bubbles: true,
    })
  );
}

export function fireAlert(target: EventTarget, message: string) {
  fire<ShowAlertEventDetail>(target, EventType.SHOW_ALERT, {message});
}

export function firePageError(response?: Response | null) {
  if (response === null) response = undefined;
  fire<PageErrorEventDetail>(document, EventType.PAGE_ERROR, {response});
}

export function fireServerError(response: Response, request?: FetchRequest) {
  fire<ServerErrorEventDetail>(document, EventType.SERVER_ERROR, {
    response,
    request,
  });
}

export function fireNetworkError(error: Error) {
  fire<NetworkErrorEventDetail>(document, EventType.NETWORK_ERROR, {error});
}

export function fireTitleChange(target: EventTarget, title: string) {
  fire<TitleChangeEventDetail>(target, EventType.TITLE_CHANGE, {title});
}

// TODO(milutin) - remove once new gr-dialog will do it out of the box
// This informs gr-app-element to remove footer, header from a11y tree
export function fireDialogChange(
  target: EventTarget,
  detail: DialogChangeEventDetail
) {
  fire<DialogChangeEventDetail>(target, EventType.DIALOG_CHANGE, detail);
}

export function fireIronAnnounce(target: EventTarget, text: string) {
  fire<IronAnnounceEventDetail>(target, EventType.IRON_ANNOUNCE, {text});
}

export function fireThreadListModifiedEvent(
  target: EventTarget,
  rootId: UrlEncodedCommentId,
  path: string
) {
  fire<ThreadListModifiedDetail>(target, EventType.THREAD_LIST_MODIFIED, {
    rootId,
    path,
  });
}

export function fireShowPrimaryTab(
  target: EventTarget,
  tab: string,
  scrollIntoView?: boolean,
  tabState?: TabState
) {
  const detail: SwitchTabEventDetail = {tab, scrollIntoView, tabState};
  fire<SwitchTabEventDetail>(target, EventType.SHOW_PRIMARY_TAB, detail);
}

export function waitForEventOnce<K extends keyof HTMLElementEventMap>(
  el: EventTarget,
  eventName: K
): Promise<HTMLElementEventMap[K]> {
  return new Promise<HTMLElementEventMap[K]>(resolve => {
    const callback = (event: HTMLElementEventMap[K]) => {
      resolve(event);
    };
    el.addEventListener(eventName, callback as EventListener, {once: true});
  });
}
