package com.castlabs.reactnative.arch_new;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.castlabs.reactnative.network.RequestCompleter;
import com.castlabs.reactnative.network.ResponseCompleter;
import com.castlabs.reactnative.player.Player;
import com.castlabs.reactnative.player.PlayerEventEmitter;
import com.castlabs.reactnative.player.PlayerModule;
import com.castlabs.reactnative.playerview.PlayerView;
import com.castlabs.reactnative.sdk.Plugin;
import com.castlabs.reactnative.specs.NativePlayerModuleSpec;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;

import java.util.List;
import java.util.Map;

public class NativePlayerModule extends NativePlayerModuleSpec {

    public static final String NAME = "NativePlayerModule";
    private final PlayerModule _playerModule;

    public NativePlayerModule(
        ReactApplicationContext reactContext,
        @NonNull Map<String, Player> playerInstanceManager,
        @NonNull Map<String, PlayerView> playerViewInstanceManager,
        @NonNull List<Plugin> pluginInstanceManager,
        @NonNull Map<String, RequestCompleter> requestCompleterCache,
        @NonNull Map<String, ResponseCompleter> responseCompleterCache)
    {
        super(reactContext);
        PlayerEventEmitter eventEmitter = new PlayerEventEmitter(this::emitOnPrestoPlayEvent);

        _playerModule = new PlayerModule(
            reactContext,
            playerInstanceManager,
            playerViewInstanceManager,
            pluginInstanceManager,
            requestCompleterCache,
            responseCompleterCache,
            eventEmitter
        );
    }

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

    @Override
    public void create(String instanceId, Promise promise) {
        _playerModule.create(instanceId, promise);
    }

    @Override
    public void createApplePlayer(String instanceId, Promise promise) {
        promise.reject("UNSUPPORTED_PLATFORM", "createApplePlayer not supported on Android");
    }

    @Override
    public void destroy(String instanceId, Promise promise) {
        _playerModule.destroy(instanceId, promise);
    }

    @Override
    public void open(String instanceId, ReadableMap playerConfiguration, Promise promise) {
        _playerModule.open(instanceId, playerConfiguration, promise);
    }

    @Override
    public void play(String instanceId, Promise promise) {
        _playerModule.play(instanceId, promise);
    }

    @Override
    public void replay(String instanceId, Promise promise) {
        _playerModule.replay(instanceId, promise);
    }

    @Override
    public void pause(String instanceId, Promise promise) {
        _playerModule.pause(instanceId, promise);
    }

    @Override
    public void stop(String instanceId, Promise promise) {
        _playerModule.stop(instanceId, promise);
    }

    @Override
    public void setPosition(String instanceId, double newPosition, Promise promise) {
        _playerModule.setPosition(instanceId, newPosition, promise);
    }

    @Override
    public void setPlaybackRate(String id, double newPlaybackRate, Promise promise) {
        _playerModule.setPlaybackRate(id, newPlaybackRate, promise);
    }

    @Override
    public void setAudioTrack(String id, String trackId, Promise promise) {
        _playerModule.setAudioTrack(id, trackId, promise);
    }

    @Override
    public void setVideoTrack(String id, String trackId, Promise promise) {
        _playerModule.setVideoTrack(id, trackId, promise);
    }

    @Override
    public void setVideoRendition(String id, String renditionId, Promise promise) {
        _playerModule.setVideoRendition(id, renditionId, promise);
    }

    @Override
    public void setTextTrack(String id, @Nullable String trackId, Promise promise) {
        _playerModule.setTextTrack(id, trackId, promise);
    }

    @Override
    public void enableAdaptiveVideo(String instanceId, Promise promise) {
        _playerModule.enableAdaptiveVideo(instanceId, promise);
    }

    @Override
    public void setVolume(String id, double newVolume, Promise promise) {
        _playerModule.setVolume(id, newVolume, promise);
    }

    @Override
    public void setMuted(String id, boolean newMuted, Promise promise) {
        _playerModule.setMuted(id, newMuted, promise);
    }

    @Override
    public void supportsPictureInPicture(String id, Promise promise) {
        _playerModule.supportsPictureInPicture(id, promise);
    }

    @Override
    public void isInPictureInPictureMode(String id, Promise promise) {
        _playerModule.isInPictureInPictureMode(id, promise);
    }

    @Override
    public void enterPictureInPictureMode(String id, Promise promise) {
        _playerModule.enterPictureInPictureMode(id, promise);
    }

    @Override
    public void exitPictureInPictureMode(String id, Promise promise) {
        _playerModule.exitPictureInPictureMode(id, promise);
    }

    @Override
    public void setVideoFilterConfiguration(String id, ReadableMap videoFilterConfiguration, Promise promise) {
        _playerModule.setVideoFilterConfiguration(id, videoFilterConfiguration, promise);
    }
}
