import { PlayerAPI, PlayerEvent, PlayerEventBase, PlayerEventCallback } from 'bitmovin-player';
import { WrappedPlayer } from '../UIManager';
import type { PlayerEventMap } from 'bitmovin-player/types/core/Events';

export enum MobileV3PlayerEvent {
  SourceError = 'sourceerror',
  PlayerError = 'playererror',
  PlaylistTransition = 'playlisttransition',
}

export interface MobileV3PlayerErrorEvent extends PlayerEventBase {
  code: number;
  message: string;
}

export interface MobileV3SourceErrorEvent extends PlayerEventBase {
  code: number;
  message: string;
}

export type MobileV3PlayerEventType = PlayerEvent | MobileV3PlayerEvent;

export interface MobileV3PlayerAPI extends PlayerAPI {
  on<T extends PlayerEvent>(eventType: T, callback: PlayerEventCallback<T>): void;
  on<T extends MobileV3PlayerEvent>(eventType: T, callback: (event: PlayerEventBase) => void): void;
  exports: PlayerAPI['exports'] & { PlayerEvent: MobileV3PlayerEventType };
}

export function isMobileV3PlayerAPI(
  player: WrappedPlayer | PlayerAPI | MobileV3PlayerAPI,
): player is MobileV3PlayerAPI {
  for (const key in MobileV3PlayerEvent) {
    if (MobileV3PlayerEvent.hasOwnProperty(key) && !player.exports.PlayerEvent.hasOwnProperty(key)) {
      return false;
    }
  }

  return true;
}
