import { appStore } from "@applicaster/zapp-react-native-redux/AppStore";
import { findPluginByIdentifier } from "@applicaster/zapp-react-native-utils/pluginUtils";
import { Player } from "./player";
import { PlayerRole } from "./conts";

type PlayerFactoryItem = {
  Component: any;
  controller: Player;
};

type PlayerFactoryProps = {
  player: any;
  playerId: string;
  autoplay: boolean;
  entry: ZappEntry;
  muted: boolean;
  playerPluginId: string;
  screenConfig: Record<string, any>;
  playerRole: PlayerRole;
};

interface PlayerConstructor {
  new (params: any): Player;
}

export const playerFactory = (
  config: PlayerFactoryProps
): PlayerFactoryItem | null => {
  const IDENTIFIER = config?.playerPluginId;

  if (!IDENTIFIER) {
    return null;
  }

  const plugins = appStore.get("plugins");

  if (!plugins) {
    return null;
  }

  const playerPlugin = findPluginByIdentifier(IDENTIFIER, plugins);

  if (!playerPlugin?.module?.playerProtocol) {
    return null;
  }

  const playerProtocol: PlayerConstructor = playerPlugin.module.playerProtocol(
    config?.screenConfig,
    config?.entry
  );

  const playerView = (playerProtocol as any)?.Component || null;

  if (!playerView) {
    return null;
  }

  const Controller = (playerProtocol as any)?.controllerClass || null;

  if (Controller === null) {
    return null;
  }

  const controller = new Controller(config);

  return {
    controller,
    Component: playerView,
  };
};
