package com.phongnguyen93.rn;

import android.text.TextUtils;
import android.util.Log;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.vtvcab.ui.VtvDRMView;
import java.util.Map;
import javax.annotation.Nullable;


public class RNVtvcabDrmPlayerViewManager extends SimpleViewManager<DrmPlayerWrapper> {

  public static final String PROP_SRC = "src";
  public static final String PROP_SRC_URL = "url";
  public static final String PROP_SRC_TOKEN = "token";
  private static final String PROP_RESIZE_MODE = "resizeMode";
  private static final String PROP_PAUSED = "paused";
  private static final String PROP_MUTED = "muted";
  private static final String PROP_VOLUME = "volume";
   private static final String PROP_PROGRESS_UPDATE_INTERVAL = "progressUpdateInterval";
  private static final String PROP_SEEK = "seek";

  public static final String CMD_REFRESH_TOKEN = "refreshToken";
  public static final String CMD_TOGGLE_PLAY_PAUSE = "togglePlayPause";
  public static final String CMD_SEEK = "seekTo";

  private ThemedReactContext reactContext;

  @Override public String getName() {
    return "RNDrmPlayer";
  }

  @Override protected DrmPlayerWrapper createViewInstance(ThemedReactContext reactContext) {
    this.reactContext = reactContext;
    return new DrmPlayerWrapper(reactContext);
  }

  @Override public void onDropViewInstance(DrmPlayerWrapper view) {
    super.onDropViewInstance(view);
    view.cleanUpResources();
  }

  @Override
  public @Nullable Map<String, Object> getExportedCustomDirectEventTypeConstants() {
    MapBuilder.Builder<String, Object> builder = MapBuilder.builder();
    for (String event : VideoEventEmitter.Events) {
      builder.put(event, MapBuilder.of("registrationName", event));
    }
    return builder.build();
  }

  @Override
  public @Nullable Map<String, Object> getExportedViewConstants() {
    return MapBuilder.<String, Object>of(
        "ScaleNone", Integer.toString(ResizeMode.RESIZE_MODE_FIT),
        "ScaleAspectFit", Integer.toString(ResizeMode.RESIZE_MODE_FIT),
        "ScaleToFill", Integer.toString(ResizeMode.RESIZE_MODE_FILL),
        "ScaleAspectFill", Integer.toString(ResizeMode.RESIZE_MODE_CENTER_CROP)
    );
  }

  @ReactProp(name = PROP_SRC)
  public void setSrc(final DrmPlayerWrapper drmPlayerWrapper, @Nullable ReadableMap src) {
    // Context context = vtvDRMView.getContext().getApplicationContext();
    String urlString = src.hasKey(PROP_SRC_URL) ? src.getString(PROP_SRC_URL) : null;
    String tokenString = src.hasKey(PROP_SRC_TOKEN) ? src.getString(PROP_SRC_TOKEN) : null;
    if (TextUtils.isEmpty(urlString) || TextUtils.isEmpty(tokenString)) {
      return;
    }
    drmPlayerWrapper.setToken(tokenString);
    drmPlayerWrapper.setSrc(urlString);
  }

  @ReactProp(name = PROP_RESIZE_MODE)
  public void setResizeMode(final DrmPlayerWrapper videoView, final String resizeModeOrdinalString) {
    videoView.setResizeModeModifier(convertToIntDef(resizeModeOrdinalString));
  }


  @ReactProp(name = PROP_PAUSED, defaultBoolean = false)
  public void setPaused(final DrmPlayerWrapper videoView, final boolean paused) {
    videoView.setPausedModifier(paused);
  }

  @ReactProp(name = PROP_MUTED, defaultBoolean = false)
  public void setMuted(final DrmPlayerWrapper videoView, final boolean muted) {
    videoView.setMutedModifier(muted);
  }

  @ReactProp(name = PROP_VOLUME, defaultFloat = 1.0f)
  public void setVolume(final DrmPlayerWrapper videoView, final float volume) {
    videoView.setVolumeModifier(volume);
  }

  @ReactProp(name = PROP_PROGRESS_UPDATE_INTERVAL, defaultFloat = 250.0f)
  public void setProgressUpdateInterval(final DrmPlayerWrapper videoView, final float progressUpdateInterval) {
    videoView.setProgressUpdateInterval(progressUpdateInterval);
  }

  @ReactProp(name = PROP_SEEK)
  public void setSeek(final DrmPlayerWrapper videoView, final float seek) {
    videoView.seekTo(Math.round(seek * 1000f));
  }

  @Override public Map<String, Integer> getCommandsMap() {
    return MapBuilder.of("refreshToken",1);
  }

  @Override
  public void receiveCommand(DrmPlayerWrapper view, int commandId, @Nullable ReadableArray args) {
    if (commandId == 1 && args != null && args.size() > 0) {
      String token = args.getString(0);
      if (!TextUtils.isEmpty(token)) {
        view.setToken(token);
      }
    }
  }

  private @ResizeMode.Mode int convertToIntDef(String resizeModeOrdinalString) {
    if (!TextUtils.isEmpty(resizeModeOrdinalString)) {
      int resizeModeOrdinal = Integer.parseInt(resizeModeOrdinalString);
      return ResizeMode.toResizeMode(resizeModeOrdinal);
    }
    return ResizeMode.RESIZE_MODE_FIT;
  }
}