package com.volcengine.velive.rn.pull;

import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.facebook.react.bridge.ReadableArray;
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.volcengine.VolcApiEngine.view.*;

import java.util.Map;

public class VeLivePullViewManager extends SimpleViewManager<VeLivePullView> implements VolcViewManagerInterface<VeLivePullView> {
  public static final String NAME = "VeLivePullView";

  private ThemedReactContext context;

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

  @NonNull
  @Override
  public VeLivePullView createViewInstance(@NonNull ThemedReactContext themedReactContext) {
    context = themedReactContext;
    return new VeLivePullView(themedReactContext);
  }

  @ReactProp(name = "viewId")
  public void setViewId(VeLivePullView view, String viewId) {
    view.setViewId(viewId);
    com.volcengine.VolcApiEngine.view.VolcViewManager.putViewById(viewId, view);
  }

  @ReactProp(name = "kind")
  public void setKind(VeLivePullView view, String kind) {
    var themedReactContext = this.context;

    switch (kind) {
      case "SurfaceView" -> {
        SurfaceView subView = new SurfaceView(themedReactContext.getReactApplicationContext());
        //增加callback
        subView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
            view.emitOnLoad();
            view.loaded();
          }

          @Override
          public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {}

          @Override
          public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {}
        });
        view.addView(subView);
      }
    }
  }

  public void setVisible(VeLivePullView view, Boolean visible) {
    if(visible) {
      view.setVisibility(View.INVISIBLE);
    } else {
      view.setVisibility(View.VISIBLE);
    }
  }

  /**
   * Handle "create" command (called from JS) and call createFragment method
   */
  public void receiveCommand(
          @NonNull VeLivePullView root,
          String command,
          @Nullable ReadableArray args
  ) {
    super.receiveCommand(root, command, args);

    if (command.equals("setVisible")) {
      assert args != null;
      setVisible(root, args.getBoolean(0));
    }
  }

  public Map getExportedCustomBubblingEventTypeConstants() {
    return MapBuilder.builder().put(
            "load",
            MapBuilder.of(
                    "phasedRegistrationNames",
                    MapBuilder.of("bubbled", "onViewLoad")
            )
    ).build();
  }
}
