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.events.RCTEventEmitter;

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

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

public class RemoteViewManager extends ViewGroupManager<RemoteView> {
    public static final String REACT_CLASS = "CallRemoteView";

    //EVENT
    public static final String  onPublishedVideoTrack = "onPublishedVideoTrack";
    public static final String  onUnPublishedVideoTrack = "onUnPublishedVideoTrack";
    public static final String  onPublishedAudioTrack = "onPublishedAudioTrack";
    public static final String  onUnPublishedAudioTrack = "onUnPublishedAudioTrack";
    public static final String  onSubcribeVideoTrack = "onSubcribeVideoTrack";
    public static final String  onUnSubcribeVideoTrack = "onUnSubcribeVideoTrack";
    public static final String  onSubcribeAudioTrack = "onSubcribeAudioTrack";
    public static final String  onUnSubcribeAudioTrack = "onUnSubcribeAudioTrack";

    public static final String  onEnabledVideoTrack = "onEnabledVideoTrack";
    public static final String  onDisabledVideoTrack = "onDisabledVideoTrack";
    public static final String  onEnabledAudioTrack = "onEnabledAudioTrack";
    public static final String  onDisabledAudioTrack = "onDisabledAudioTrack";

    public static final String  onFailedToSubscribeVideoTrack = "onFailedToSubscribeVideoTrack";
    public static final String  onFailedToSubscribeAudioTrack = "onFailedToSubscribeAudioTrack";


    //METHOD
    public static final int COMMAND_ADD_REMDERER = 1;

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

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

    @Nullable
    @Override
    public Map<String, Integer> getCommandsMap() {
       Map<String, Integer> maps = MapBuilder.of(
               "addRenderer",
               COMMAND_ADD_REMDERER
       );
       return  maps;
    }
    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(
                onPublishedVideoTrack,
                onUnPublishedVideoTrack,
                onPublishedAudioTrack,
                onUnPublishedAudioTrack,
                onSubcribeVideoTrack,
                onUnSubcribeVideoTrack,
                onSubcribeAudioTrack,
                onUnSubcribeAudioTrack,

                onEnabledVideoTrack,
                onDisabledVideoTrack,
                onEnabledAudioTrack,
                onDisabledAudioTrack,

                onFailedToSubscribeVideoTrack,
                onFailedToSubscribeAudioTrack
        );
    }

    @Override
    public void receiveCommand(@Nonnull RemoteView root, int commandId, @Nullable ReadableArray args) {
        switch (commandId){
            case COMMAND_ADD_REMDERER:
                addRenderer(root, args.getString(0));

        }
    }

    private void addRenderer(RemoteView remoteView, String identity){
        TwilioRoomView roomView = (TwilioRoomView) remoteView.getParent();

        remoteView.confifureWithParticipant(identity, roomView);
    }
    void pushEvent(ThemedReactContext context, View view, String name, WritableMap data) {
        context.getJSModule(RCTEventEmitter.class)
                .receiveEvent(view.getId(), name, data);
    }
}
