package com.xg.navigation;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.KeyEvent;

import com.facebook.infer.annotation.Assertions;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.devsupport.DoubleTapReloadRecognizer;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.xg.navigation.activities.ProxyActivity;
import com.xg.navigation.constants.NavigationConstants;
import com.xg.navigation.delegates.BaseDelegate;
import com.xg.navigation.delegates.NavigationDelegate;
import com.xg.navigation.util.NavigationUtil;
import com.xg.navigation.fragment.NavigationBottomDelegate;
import com.xg.navigation.fragment.ReactFragment;

import java.lang.ref.WeakReference;

import static com.xg.navigation.constants.NavigationConstants.SP_OUTLINK_NAME;
import static com.xg.navigation.constants.NavigationConstants.TARGET_PAGE_TYPE;
import static com.xg.navigation.constants.NavigationConstants.TARGET_PATH;

public abstract class NavigationActivity extends ProxyActivity implements DefaultHardwareBackBtnHandler {


    @javax.annotation.Nullable
    private DoubleTapReloadRecognizer mDoubleTapReloadRecognizer;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    public BaseDelegate setRootDelegate(Intent intent) {
        Bundle bundle = intent.getBundleExtra("ACTIVITY_PARAMS_BUNDLE");
        if(null == bundle){
            return null;
        }
        String pageType = bundle.getString("pageType");
        String pagePath = bundle.getString("pagePath");

        if (TextUtils.isEmpty(pageType)) {
            return null;
        }

        switch (pageType) {
            case NavigationConstants.JS_PAGE: {
                return ReactFragment.newInstance(bundle);
            }
            case NavigationConstants.NATIVE_PAGE: {
                NavigationDelegate targetDelegate = null;
                try {
                    Class targetClass = Class.forName(pagePath);
                    targetDelegate = (NavigationDelegate) targetClass.newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (targetDelegate == null) {
                    break;
                }

                targetDelegate.setArguments(bundle);
                return targetDelegate;
            }
            case NavigationConstants.NATIVE_TAB_PAGE: {
                return NavigationBottomDelegate.newInstance(bundle);
            }
            default:
                break;
        }

        return null;
    }

    @Override
    public String setRootTag(Intent intent) {
        Bundle bundle = intent.getBundleExtra("ACTIVITY_PARAMS_BUNDLE");
        String pagePath = bundle.getString("pagePath");
        if (pagePath == null) {
            pagePath = "";
        }
        return pagePath;
    }

    @Override
    public void init() {
        CurrentActivityManager.getInstance().setActivity(new WeakReference<>(this));
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDoubleTapReloadRecognizer = new DoubleTapReloadRecognizer();
        mReactInstanceManager = ((NavigationApplication) getApplication()).getReactNativeHost().getReactInstanceManager();

        SharedPreferences sp = getSharedPreferences(SP_OUTLINK_NAME, MODE_PRIVATE);
        String path = sp.getString(TARGET_PATH, "");
        String pageType = sp.getString(TARGET_PAGE_TYPE, "");
        if(TextUtils.isEmpty(path) || TextUtils.isEmpty(pageType)){
            return;
        }
        try{
            Bundle params = new Bundle();
            for(String key: sp.getAll().keySet()){
                params.putString(key, (String) sp.getAll().get(key));
            }
            NavigationUtil.push(pageType, path, NavigationConstants.FROM_RIGHT, true, params);
            // sp消费
            sp.edit().clear().apply();
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void invokeDefaultOnBackPressed() {
        super.onBackPressed();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy(this);
        }
    }

    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        ReactNativeHost reactNativeHost = NavigationApplication.instance.getReactNativeHost();
        if (mReactInstanceManager != null && reactNativeHost.getUseDeveloperSupport()) {
            if (keyCode == KeyEvent.KEYCODE_MENU) {
                mReactInstanceManager.showDevOptionsDialog();
                return true;
            }
            boolean didDoubleTabR = Assertions.assertNotNull(mDoubleTapReloadRecognizer)
                    .didDoubleTapR(keyCode, this.getCurrentFocus());
            if (didDoubleTabR) {
                mReactInstanceManager.getDevSupportManager().handleReloadJS();
                return true;
            }
        }
        return super.onKeyUp(keyCode, event);
    }
}
