package com.castlabs.reactnative.player;

import androidx.annotation.NonNull;
import com.castlabs.android.player.AbstractPlayerListener;
import com.castlabs.android.player.PlayerController;
import com.google.android.exoplayer2.Player;
import java.util.ArrayList;
import java.util.List;

/**
 * Simplifies access to an Exo player which is not initialized immediately
 * on player controller creation.
 */
public class ExoPlayerProxy extends AbstractPlayerListener {
  private final @NonNull PlayerController playerController;
  private final @NonNull List<Player.EventListener> addQueue;

  /**
   * Initializes the proxy.
   *
   * @param playerController player controller
   */
  public ExoPlayerProxy(@NonNull PlayerController playerController) {
    this.playerController = playerController;
    this.addQueue = new ArrayList<Player.EventListener>();

    playerController.addPlayerListener(this);
  }

  /**
   * Adds the event listener to the Exo player.
   *
   * @param listener event listener
   */
  public void addListener(Player.EventListener listener) {
    if (playerController.getPlayer() != null) {
      playerController.getPlayer().addListener(listener);
    } else {
      addQueue.add(listener);
    }
  }

  /**
   * Removes the event listener from the Exo player.
   *
   * @param listener event listener
   */
  public void removeListener(Player.EventListener listener) {
    if (playerController.getPlayer() != null) {
      playerController.getPlayer().removeListener(listener);
    }

    addQueue.remove(listener);
  }

  @Override
  public void onStateChanged(@NonNull PlayerController.State state) {
    super.onStateChanged(state);
    if (state == PlayerController.State.Preparing && playerController.getPlayer() != null) {
      while (addQueue.size() > 0) {
        Player.EventListener listener = addQueue.remove(0);
        playerController.getPlayer().addListener(listener);
      }
    }
  }

  public void dispose() {
    playerController.removePlayerListener(this);
  }
}
