package ezviz.ezopensdkcommon.configwifi;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.callback.NavCallback;
import com.alibaba.android.arouter.launcher.ARouter;
import com.ezviz.sdk.configwifi.EZConfigWifiErrorEnum;

import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.IntentConstants;
import ezviz.ezopensdkcommon.common.LogUtil;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.RouteNavigator;

public class ConfigWifiExecutingActivity extends RootActivity implements ConfigWifiExecutingActivityPresenter.Callback{

    private final static String TAG = ConfigWifiExecutingActivity.class.getSimpleName();

    private ConfigWifiExecutingActivityPresenter mPresenter;
    private View mConfigResultView;
    private View mConfigSuccessView;
    private View mConfigFailView;
    private TextView mConfigErrorInfoTv;
    private String mAllErrorInfo;

    public static void launch(Context context, Intent intent){
        Intent newIntent = new Intent(context, ConfigWifiExecutingActivity.class);
        newIntent.putExtras(intent);
        newIntent.putExtra(IntentConstants.USE_MANUAL_AP_CONFIG, true);
        context.startActivity(newIntent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_config_wifi_executing);

        mPresenter = ConfigWifiExecutingActivityPresenter.getPresenter(getIntent()
                .getStringExtra(IntentConstants.SELECTED_PRESENTER_TYPE));
        if (mPresenter == null){
            LogUtil.e(TAG, "failed to init!");
            return;
        }
        initUI();
        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                showExecutingUi();
                startConfig();
            }
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        showToast(getString(R.string.app_common_stop_config_wifi_while_switched_to_background));
        exitPage();
    }

    /**
     * 重试
     */
    public void onClickRetryConfigWifi(View view) {
        showExecutingUi();
        startConfig();
    }

    /**
     * 配网成功，根据使用sdk不同，跳转到对应页面
     */
    public void onClickToConfigAnother(View view) {
        // 如果是在使用配网sdk，则跳转到配网开始页
        if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
            ARouter.getInstance().build(RouteNavigator.CONFIG_WIFI_MAIN_PAGE)
                    .navigation(this, new NavCallback() {
                        @Override
                        public void onArrival(Postcard postcard) {
                            exitPage();
                        }

                        @Override
                        public void onLost(Postcard postcard) {
                            // do nothing
                        }
                    });
        }
    }

    @Override
    public void onBackPressed() {
        exitPage();
    }

    public void onClickExit(View view) {
        exitPage();
    }

    private void exitPage(){
        stopConfig();
        finish();
    }

    @Override
    public void onConnectedToWifi() {
        LogUtil.i(TAG, "onConnectedToWifi");
        // 仅使用配网sdk时，才展示配网成功的ui
        if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
            showConfigSuccessUi();
        }
    }

    @Override
    public void onConnectedToPlatform() {
        LogUtil.i(TAG, "onConnectedToPlatform");
        ARouter.getInstance().build(RouteNavigator.ADD_DEVICE_PAGE)
                .withString(IntentConstants.DEVICE_SERIAL, getIntent().getStringExtra(IntentConstants.DEVICE_SERIAL))
                .withString(IntentConstants.DEVICE_VERIFY_CODE, getIntent().getStringExtra(IntentConstants.DEVICE_VERIFY_CODE))
                .withFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
                .navigation(this, new NavCallback() {
                    @Override
                    public void onArrival(Postcard postcard) {
                        exitPage();
                    }

                    @Override
                    public void onLost(Postcard postcard) {
                        // do nothing
                    }
                });
    }

    @Override
    public void onConfigInfo(int info) {

    }

    @Override
    public void onConfigError(int code, String msg) {
        String errorInfo = "***"  + "error code is: " + code +  ", error msg is: " + msg + "\n";
        LogUtil.e(TAG, errorInfo);
        // 仅展示新定义的错误码
        for (EZConfigWifiErrorEnum error : EZConfigWifiErrorEnum.values()){
            if (code == error.code){
                if (mAllErrorInfo == null){
                    mAllErrorInfo = "" + errorInfo;
                }else{
                    mAllErrorInfo += errorInfo;
                }
                break;
            }
        }
        // 用户拒绝连接设备热点则认为配网失败
        if (code == EZConfigWifiErrorEnum.USER_REFUSED_CONNECTION_REQUEST.code){
            failedToConfig();
        }
    }

    @Override
    public void onTimeout() {
        failedToConfig();
    }

    private void failedToConfig(){
        stopConfig();
        switch (mPresenter.getType()){
            case ConfigWifiTypeConstants.CONFIG_WIFI_SDK_AP:
            case ConfigWifiTypeConstants.FULL_SDK_AP:
                ManualConnectDeviceHotspotActivity.Companion.launch(this, getIntent());
                break;
            default:
                showConfigFailUi();
                break;
        }
    }

    private void startConfig(){
        if (mPresenter != null){
            mPresenter.setCallback(this);
            mPresenter.startConfigWifi(getApplication(), getIntent());
        }
    }

    private void stopConfig(){
        if (mPresenter != null){
            mPresenter.setCallback(null);
            mPresenter.stopConfigWifi();
        }
    }

    private void initUI() {
        mConfigResultView = findViewById(R.id.app_common_vg_config_result);
        mConfigSuccessView = findViewById(R.id.app_common_config_result_success);
        mConfigFailView = findViewById(R.id.app_common_config_result_fail);
        mConfigErrorInfoTv = findViewById(R.id.app_common_all_config_error_info);
    }

    private void showExecutingUi(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mConfigResultView.setVisibility(View.GONE);
                mConfigSuccessView.setVisibility(View.GONE);
                mConfigFailView.setVisibility(View.GONE);
                mAllErrorInfo = null;
            }
        });
    }

    private void showConfigSuccessUi(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mConfigResultView.setVisibility(View.VISIBLE);
                mConfigSuccessView.setVisibility(View.VISIBLE);
                mConfigFailView.setVisibility(View.GONE);
                mAllErrorInfo = null;
            }
        });
    }

    private void showConfigFailUi(){
       runOnUiThread(new Runnable() {
           @Override
           public void run() {
               mConfigErrorInfoTv.setText(mAllErrorInfo);
               mConfigResultView.setVisibility(View.VISIBLE);
               mConfigSuccessView.setVisibility(View.GONE);
               mConfigFailView.setVisibility(View.VISIBLE);
               mAllErrorInfo = null;
           }
       });
    }

}
