package com.tytv.twiliovideo;

import android.view.View;

import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.RCTEventEmitter;

import java.util.Arrays;
import java.util.Map;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class TwilioRoomViewManager extends ViewGroupManager<TwilioRoomView> {

    public static final String REACT_CLASS = "CallView";

    // METHOD
    public static final int COMMAND_CONNECT_WITH_OPTIOPS = 1;
    public static final int COMMAND_DISCONNECT = 2;
    public static final int COMMAND_FLIP_CAMERA = 3;

    //EVENT
    public static final String  onDidConnect = "onDidConnect";
    public static final String  onFailedToConnect = "onFailedToConnect";
    public static final String  onDisConnected = "onDisConnected";
    public static final String  onReConnecting = "onReConnecting";
    public static final String  onFailedReConnect = "onFailedReConnect";
    public static final String  onDidReConnect = "onDidReConnect";
    public static final String  onParticipantDisConnected = "onParticipantDisConnected";
    public static final String  onParticipantConnected = "onParticipantConnected";

    @Nonnull
    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Nonnull
    @Override
    protected TwilioRoomView createViewInstance(@Nonnull ThemedReactContext reactContext) {
        TwilioRoomView view = new TwilioRoomView(reactContext, this);
        return view;
    }



    /**
     * React props
     * @param shareVideo
     */
    @ReactProp(name = "shareVideo")
    public void setShareVideo(TwilioRoomView view, @Nonnull boolean shareVideo) {
        view.setShareVideo(shareVideo);

    }
    /**
     * React props
     * @param shareAudio
     */
    @ReactProp(name = "shareAudio")
    public void setShareAudio(TwilioRoomView view, @Nonnull boolean shareAudio) {
        view.setShareAudio(shareAudio);
    }

    @Nullable
    @Override
    public Map<String, Integer> getCommandsMap() {
        return MapBuilder.of(
                "connectWithOptions", COMMAND_CONNECT_WITH_OPTIOPS,
                "disconnect", COMMAND_DISCONNECT,
                "flipCamera", COMMAND_FLIP_CAMERA
        );
    }

    @Override
    public void receiveCommand(@Nonnull TwilioRoomView root, int commandId, @Nullable ReadableArray args) {
        switch (commandId){
            case  COMMAND_CONNECT_WITH_OPTIOPS:
                String token = args.getString(0);
                String room = args.getString(1);
                connectWithOptions(root, token, room);
                break;
            case COMMAND_DISCONNECT:
                root.disconnect();
                break;
            case COMMAND_FLIP_CAMERA:
                root.flipCamera();
                break;
        }
    }
    private Map<String, Object> createEventMapItem(String ...names){
        MapBuilder.Builder<String, Object> builder = MapBuilder.builder();
        Arrays.stream(names).forEach(name -> {
            builder.put(name, MapBuilder.of(
                    "phasedRegistrationNames",
                    MapBuilder.of("bubbled", name)));

        });

        return  builder.build();
    }
    @Nullable
    @Override
    public Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
     return createEventMapItem(
             onDidConnect,
             onFailedToConnect,
             onFailedReConnect,
             onDisConnected,
             onReConnecting,
             onFailedReConnect,
             onDidReConnect,
             onParticipantConnected,
             onParticipantDisConnected
             );
    }


    private void connectWithOptions(TwilioRoomView view, String token, String room){
        view.connectToRoom(token, room);
    }
    void pushEvent(ThemedReactContext context, View view, String name, WritableMap data) {
        context.getJSModule(RCTEventEmitter.class)
                .receiveEvent(view.getId(), name, data);
    }
}
