package com.anren.omplayer;

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.yqritc.scalablevideoview.ScalableType;

import javax.annotation.Nullable;
import java.util.Map;

/**
 * Created by lcg on 2017/6/15.
 */
public class OMVideoViewManager extends SimpleViewManager<OMVideoView> {
    private OMVideoView mFullScreenView = null;

    public static final String REACT_CLASS = "RCTOMVideoView";
    public static final String PROP_TOKEN = "cookie";
    public static final String PROP_DISPLAY_TEXT = "displayText";
    public static final String PROP_DISPLAY_TEXT_SIZE = "displayTextSize";
    public static final String PROP_DISPLAY_DELAY = "displayDelay";
    public static final String PROP_SRC = "src";
    public static final String PROP_SRC_URI = "uri";
    public static final String PROP_SRC_TYPE = "type";
    public static final String PROP_SRC_IS_NETWORK = "isNetwork";
    public static final String PROP_SRC_MAINVER = "mainVer";
    public static final String PROP_SRC_PATCHVER = "patchVer";
    public static final String PROP_SRC_IS_ASSET = "isAsset";
    public static final String PROP_RESIZE_MODE = "resizeMode";
    public static final String PROP_REPEAT = "repeat";
    public static final String PROP_PAUSED = "paused";
    public static final String PROP_MUTED = "muted";
    public static final String PROP_VOLUME = "volume";
    public static final String PROP_SEEK = "currentTime";
    public static final String PROP_RATE = "rate";
    public static final String PROP_PLAY_IN_BACKGROUND = "playInBackground";
    public static final String PROP_CONTROLS = "controls";
    public static final String PROP_FULLSCREEN = "fullscreen";

    private static OMVideoViewManager _sInstance = null;

    OMVideoViewManager() {
        OMVideoViewManager._sInstance = this;
    }

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

    @Override
    protected OMVideoView createViewInstance(ThemedReactContext themedReactContext) {
        return new OMVideoView(themedReactContext, this);
    }

    @Override
    public void onDropViewInstance(OMVideoView view) {
        super.onDropViewInstance(view);
        view.getPlayer().cleanupMediaPlayerResources();
    }

    @Override
    @Nullable
    public Map getExportedCustomDirectEventTypeConstants() {
        MapBuilder.Builder builder = MapBuilder.builder();
        for (OMVideoPlayer.Events event : OMVideoPlayer.Events.values()) {
            builder.put(event.toString(), MapBuilder.of("registrationName", event.toString()));
        }
        return builder.build();
    }

    @Override
    @Nullable
    public Map getExportedViewConstants() {
        return MapBuilder.of(
                "ScaleNone", Integer.toString(ScalableType.LEFT_TOP.ordinal()),
                "ScaleToFill", Integer.toString(ScalableType.FIT_XY.ordinal()),
                "ScaleAspectFit", Integer.toString(ScalableType.FIT_CENTER.ordinal()),
                "ScaleAspectFill", Integer.toString(ScalableType.CENTER_CROP.ordinal())
        );
    }
    @ReactProp(name = PROP_TOKEN)
    public void setToken(final OMVideoView videoView, @Nullable String token) {
        videoView.getPlayer().setToken(token);
    }

    @ReactProp(name = PROP_DISPLAY_TEXT)
    public void setDisplayText(final OMVideoView videoView, @Nullable String displayText) {
        videoView.getPlayer().setDisplayText(displayText);
    }

    @ReactProp(name = PROP_DISPLAY_TEXT_SIZE)
    public void setDisplayText(final OMVideoView videoView, @Nullable float displayTextSize) {
        videoView.getPlayer().setDisplayTextSize(displayTextSize);
    }

    @ReactProp(name = PROP_DISPLAY_DELAY)
    public void setDisplayDelay(final OMVideoView videoView, @Nullable float displayDelay) {
        videoView.getPlayer().setDisplayDelay((long) displayDelay);
    }

    @ReactProp(name = PROP_SRC)
    public void setSrc(final OMVideoView videoView, @Nullable String src) {
        videoView.getPlayer().setSrc(src);
    }

    @ReactProp(name = PROP_RESIZE_MODE)
    public void setResizeMode(final OMVideoView videoView, final String resizeModeOrdinalString) {
        videoView.getPlayer().setResizeModeModifier(ScalableType.values()[Integer.parseInt(resizeModeOrdinalString)]);
    }

    @ReactProp(name = PROP_REPEAT, defaultBoolean = false)
    public void setRepeat(final OMVideoView videoView, final boolean repeat) {
        videoView.getPlayer().setRepeatModifier(repeat);
    }

    @ReactProp(name = PROP_PAUSED, defaultBoolean = true)
    public void setPaused(final OMVideoView videoView, final boolean paused) {
        videoView.getPlayer().setPausedModifier(paused);
    }

    @ReactProp(name = PROP_MUTED, defaultBoolean = false)
    public void setMuted(final OMVideoView videoView, final boolean muted) {
        videoView.getPlayer().setMutedModifier(muted);
    }

    @ReactProp(name = PROP_VOLUME, defaultFloat = 1.0f)
    public void setVolume(final OMVideoView videoView, final float volume) {
        videoView.getPlayer().setVolumeModifier(volume);
    }

    @ReactProp(name = PROP_SEEK)
    public void setSeek(final OMVideoView videoView, final float seek) {
        videoView.getPlayer().seekTo(Math.round(seek * 1000.0f));
    }

    @ReactProp(name = PROP_RATE)
    public void setRate(final OMVideoView videoView, final float rate) {
        videoView.getPlayer().setRateModifier(rate);
    }

    @ReactProp(name = PROP_PLAY_IN_BACKGROUND, defaultBoolean = false)
    public void setPlayInBackground(final OMVideoView videoView, final boolean playInBackground) {
        videoView.getPlayer().setPlayInBackground(playInBackground);
    }

    @ReactProp(name = PROP_CONTROLS, defaultBoolean = false)
    public void setControls(final OMVideoView videoView, final boolean controls) {
        videoView.getPlayer().setControls(controls);
    }

    @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false)
    public void setFullscreen(final OMVideoView videoView, final boolean fullscreen) {
        videoView.setFullscreen(fullscreen);
        OMVideoPlayerModule.setFullScreenManager(videoView.getFullScreenManager());
    }

    public void setFullScreenView(OMVideoView videoView) {
        this.mFullScreenView = videoView;
    }

    public boolean internalCancelFullscreen() {
        if (this.mFullScreenView != null) {
            this.mFullScreenView.setFullscreen(false);
            this.mFullScreenView = null;

            return true;
        }

        return false;
    }

    static public boolean cancelFullscreen() {
        return OMVideoViewManager._sInstance.internalCancelFullscreen();
    }
}
