package com.castlabs.reactnative.arch_new;

import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.castlabs.reactnative.player.Player;
import com.castlabs.reactnative.playerview.PlayerView;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.ViewManagerDelegate;
import com.facebook.react.viewmanagers.PlayerViewManagerInterface;
import com.facebook.react.viewmanagers.PlayerViewManagerDelegate;

import com.facebook.react.uimanager.annotations.ReactProp;
import java.util.Map;

/**
 * The view manager for {@link PlayerView}.
 */
@RequiresApi(api = Build.VERSION_CODES.N)
@ReactModule(name = PlayerViewManager.REACT_CLASS)
public class PlayerViewManager extends ViewGroupManager<PlayerView> implements PlayerViewManagerInterface<PlayerView> {

  private final PlayerViewManagerDelegate<PlayerView, PlayerViewManager> delegate = new PlayerViewManagerDelegate<>(this);

  public static final String REACT_CLASS = "PlayerView";

  private final Map<String, Player> playerInstanceManager;
  private final Map<String, PlayerView> playerViewInstanceManager;

  public PlayerViewManager(
      @NonNull ReactApplicationContext context,
      @NonNull Map<String, Player> playerInstanceManager,
      @NonNull Map<String, PlayerView> playerViewInstanceManager
  ) {
    this.playerInstanceManager = playerInstanceManager;
    this.playerViewInstanceManager = playerViewInstanceManager;
  }

  @Override
  @NonNull
  public String getName() {
    return REACT_CLASS;
  }

  @NonNull
  @Override
  protected PlayerView createViewInstance(@NonNull ThemedReactContext context) {
    final PlayerView playerView = new PlayerView(
        context,
        null,
        playerInstanceManager
    );

    playerViewInstanceManager.put(playerView.id, playerView);

    return playerView;
  }

  @Override
  public void onDropViewInstance(@NonNull PlayerView playerView) {
    super.onDropViewInstance(playerView);
    playerView.release();
    playerViewInstanceManager.remove(playerView.id);
  }

  @ReactProp(name = "playerId")
  public void setPlayerId(PlayerView view, String newPlayerId) {
    view.setPlayerId(newPlayerId);
  }

  // Bridgeless
  @Override
  public ViewManagerDelegate<PlayerView> getDelegate() {
    return delegate;
  }
}
