package com.anren.omplayer;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.uimanager.ThemedReactContext;

/**
 * Created by lcg on 2017/6/23.
 */

public class OMVideoView extends RelativeLayout {
    private OMVideoViewManager mVideoViewManager = null;
    private ThemedReactContext mThemedReactContext = null;
    private OMFullScreenManager mFullScreenManager = null;
    private boolean mFullScreen = false;

    private OMVideoPlayer mPlayer = null;

    private boolean mPauseBecauseCall = false;

    private final Runnable measureAndLayout = new Runnable() {
        @Override
        public void run() {
            measure(
                    MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
            layout(getLeft(), getTop(), getRight(), getBottom());
        }
    };

    public OMVideoView(ThemedReactContext themedReactContext, OMVideoViewManager videoViewManager){
        super(themedReactContext);

        mVideoViewManager = videoViewManager;
        mThemedReactContext = themedReactContext;
        mFullScreenManager = new OMFullScreenManager(themedReactContext);

        initView();
//        initTelephonyListener();
    }

    private void initView(){
        mPlayer = new OMVideoPlayer(mThemedReactContext, this);
        mPlayer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        addView(mPlayer);
    }

    private void initTelephonyListener() {
        TelephonyManager telephonyManager = (TelephonyManager)mThemedReactContext.getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                if (state == TelephonyManager.CALL_STATE_RINGING || state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    if (mPlayer != null && mPlayer.isPlaying()) {
                        mPauseBecauseCall = true;
                        mPlayer.setPausedModifier(true);
                    }
                }
                else if (state == TelephonyManager.CALL_STATE_IDLE) {
                    if (mPlayer != null && mPauseBecauseCall) {
                        mPauseBecauseCall = false;
                        mPlayer.setPausedModifier(false);
                    }
                }

                super.onCallStateChanged(state, incomingNumber);
            }
        }, PhoneStateListener.LISTEN_CALL_STATE);
    }

    public OMVideoPlayer getPlayer(){
        return mPlayer;
    }

    public boolean isFullscreen() {
        return mFullScreen;
    }

//    public void toggleFullscreen(){
//        if (mFullScreen){
//
//            mFullScreenManager.removeView(mPlayer);
//            addView(mPlayer);
//            mFullScreenManager.hide();
//        }
//        else {
//            removeView(mPlayer);
//            mFullScreenManager.addView(mPlayer);
//            mFullScreenManager.show();
//        }
//
//        mFullScreen = !mFullScreen;
//
//        mPlayer.setFullScreen(mFullScreen);
//
//        requestLayout();
//    }

    public void setFullscreen(boolean fullscreen) {
        if (fullscreen) {
            mPlayer.sendEvent(OMVideoPlayer.Events.EVENT_FULLSCREEN_WILL_PRESENT.toString(), Arguments.createMap());

            removeView(mPlayer);
            mFullScreenManager.addView(mPlayer);
            mFullScreenManager.show();

            mPlayer.sendEvent(OMVideoPlayer.Events.EVENT_FULLSCREEN_DID_PRESENT.toString(), Arguments.createMap());

            mVideoViewManager.setFullScreenView(this);
        }
        else {
            if (mPlayer.getParent().equals(this)) {
                return ;
            }

            mPlayer.sendEvent(OMVideoPlayer.Events.EVENT_FULLSCREEN_WILL_DISMISS.toString(), Arguments.createMap());

            mFullScreenManager.removeView(mPlayer);

            ViewGroup parent = (ViewGroup)mPlayer.getParent();
            if (parent != null) {
                parent.removeView(mPlayer);
            }

            addView(mPlayer);
            mFullScreenManager.hide();

            mPlayer.sendEvent(OMVideoPlayer.Events.EVENT_FULLSCREEN_DID_DISMISS.toString(), Arguments.createMap());

            mVideoViewManager.setFullScreenView(null);
        }

        mFullScreen = fullscreen;

        mPlayer.setFullScreen(mFullScreen);
    }

    public boolean isFullScreen() {
        return mFullScreen;
    }

    @Override
    public void requestLayout() {
        super.requestLayout();

        post(measureAndLayout);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int specModeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int specSizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int specModeHeight = MeasureSpec.getMode(heightMeasureSpec);
        int specSizeHeight = MeasureSpec.getSize(heightMeasureSpec);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
    }

    public OMFullScreenManager getFullScreenManager() {
        return mFullScreenManager;
    }
}
