// Copyright © 2022 BytePlusRTC All rights reserved.
// SPDX-License-Identifier: MIT

package com.volcengine.reactnative.vertc;

import android.view.SurfaceView;
import android.view.TextureView;
import android.view.View;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactMethod;
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 VertcViewManager extends SimpleViewManager<VertcView> implements VolcViewManagerInterface<VertcView> {
  public static final String NAME = "VertcView";
  
  private ThemedReactContext context;

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

  @NonNull
  @Override
  public VertcView createViewInstance(@NonNull ThemedReactContext themedReactContext) {
    this.context = themedReactContext;
    return new VertcView(themedReactContext);
  }
  
  @ReactProp(name = "viewId")
  public void setViewId(VertcView view, String viewId) {
    view.setViewId(viewId);
  }

  @ReactProp(name = "kind")
  public void setKind(VertcView view, String kind) {
    var themedReactContext = this.context;
    
    switch (kind) {
      case "SurfaceView" -> {
        SurfaceView subView = new SurfaceView(themedReactContext.getReactApplicationContext());
        view.addView(subView);
      }
      case "TextureView" -> {
        TextureView subView = new TextureView(themedReactContext.getReactApplicationContext());
        view.addView(subView);
      }
      case "View" -> {
        View subView = new View(themedReactContext.getReactApplicationContext());
        view.addView(subView);
      }
    }
  }
  
  @ReactMethod()
  public  void setVisible(VertcView view, Boolean visible) {
    if(visible) {
      view.setVisibility(View.INVISIBLE);
    } else {
      view.setVisibility(View.VISIBLE);
    }
  }

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