package com.castlabs.reactnative.player;

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

/**
 * Patches reporting the videoSizeChanged event.
 */
public class VideoSizeChangedExtension extends AbstractPlayerListener {

  /**
   * Video Size Changed Listener.
   */
  public interface VideoSizeListener {
    void onVideoSizeChanged();
  }

  private final @NonNull PlayerController playerController;
  private final @NonNull List<VideoSizeListener> listeners;

  /**
   * Initializes the extension.
   *
   * @param playerController the player controller
   */
  public VideoSizeChangedExtension(@NonNull PlayerController playerController) {
    this.playerController = playerController;
    this.listeners = new ArrayList<VideoSizeListener>();

    playerController.addPlayerListener(this);
  }

  public void addListener(VideoSizeListener listener) {
    listeners.add(listener);
  }

  public void removeListener(VideoSizeListener listener) {
    listeners.remove(listener);
  }

  @Override
  public void onStateChanged(@NonNull PlayerController.State state) {
    super.onStateChanged(state);
    if (state == PlayerController.State.Preparing) {
      notifyListeners();
    }
  }

  @Override
  public void onVideoSizeChanged(int width, int height, float pixelWidthHeightRatio) {
    super.onVideoSizeChanged(width, height, pixelWidthHeightRatio);
    notifyListeners();
  }

  private void notifyListeners() {
    for (VideoSizeListener listener : listeners) {
      listener.onVideoSizeChanged();
    }
  }

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