package com.yidianling.user.ui;

import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.ydl.webview.RefreshWebEvent;
import com.ydl.ydlcommon.base.BaseActivity;
import com.ydl.ydlcommon.bean.StatusBarOptions;
import com.ydl.ydlcommon.data.http.EncryptUtils;
import com.ydl.ydlcommon.data.http.RxUtils;
import com.ydl.ydlcommon.data.http.ThrowableConsumer;
import com.ydl.ydlcommon.utils.ActivityManager;
import com.ydl.ydlcommon.utils.log.LogHelper;
import com.ydl.ydlcommon.utils.remind.ToastHelper;
import com.ydl.ydlcommon.view.RoundCornerButton;
import com.ydl.ydlcommon.view.TitleBar;
import com.yidianling.im.api.bean.IMLoginInfo;
import com.yidianling.im.api.bean.IMRequestCallback;
import com.yidianling.user.LoginHelper;
import com.yidianling.user.R;
import com.yidianling.user.UserConstants;
import com.yidianling.user.UserHelper;
import com.yidianling.user.api.bean.UserResponseBean;
import com.yidianling.user.api.event.UserBindPhoneEvent;
import com.yidianling.user.event.UpdateBindStatusEvent;
import com.yidianling.user.http.UserHttp;
import com.yidianling.user.http.UserHttpImpl;
import com.yidianling.user.http.request.BindPhoneParam;
import com.yidianling.user.http.request.CodeParam;
import com.yidianling.user.http.request.ForgetParam;
import com.yidianling.user.http.request.LoginParam;
import com.yidianling.user.http.request.RegisterParam;
import com.yidianling.user.route.UserIn;

import org.jetbrains.annotations.NotNull;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

import de.greenrobot.event.EventBus;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;

import static com.yidianling.user.UserConstants.FORGET_ACTION;
import static com.yidianling.user.UserConstants.REGISTER_ACTION;


/**
 * 绑定手机 验证码和登录密码
 */
public class GetIdentifyingCodeActivity extends BaseActivity implements View.OnClickListener {

    String phoneNum;
    String code;
    String action;

    //最后获取验证码的时间
    int lastGetCodeTime = 0;


    //手机号是否已经注册过
    boolean isRegisted = false;

    private TitleBar tb_title;
    private TextView tv_phone;
    private EditText et_code;
    private TextView tv_get_code;
    private LinearLayout lin_login_pass;
    private TextView text_pass_tip;
    private EditText et_password;
    private RoundCornerButton rcb_submit;
    Context context = this;
    //计时器
    private Timer timer;

    //按钮是否可点击
    private boolean isDisable = false;
    private boolean isFromSplash;
    private boolean isRegisterFromRedPacket;

    @Override
    protected int layoutResId() {
        return R.layout.user_activity_get_identifying_code;
    }

    @NotNull
    @Override
    public StatusBarOptions getStatusViewOptions() {
        return new StatusBarOptions(true,true);
    }

    @Override
    protected void initDataAndEvent() {
        tb_title = findViewById(R.id.tb_title);
        tv_phone = findViewById(R.id.tv_phone);
        et_code = findViewById(R.id.et_code);
        tv_get_code = findViewById(R.id.tv_get_code);
        lin_login_pass = findViewById(R.id.lin_login_pass);
        text_pass_tip = findViewById(R.id.text_pass_tip);
        et_password = findViewById(R.id.et_password);
        rcb_submit = findViewById(R.id.rcb_submit);

        rcb_submit.setOnClickListener(this);
        tv_get_code.setOnClickListener(this);


        phoneNum = getIntent().getStringExtra("phoneNum");
        code = getIntent().getStringExtra("code");
        action = getIntent().getStringExtra("action");
        //最后获取验证码的时间
        lastGetCodeTime = getIntent().getIntExtra("lastGetCodeTime", 0);
        isRegisted = getIntent().getBooleanExtra("isRegisted", false);
        isFromSplash = getIntent().getBooleanExtra("isFromSplash", false);
        isRegisterFromRedPacket = getIntent().getBooleanExtra(UserConstants.IS_REGISTER_FROM_PACKET, false);
        init();
        timer = new Timer(true);
        timer.schedule(new UpdateUITimer(), 0, 1000);

        Observable.timer(300, TimeUnit.MILLISECONDS)
                .subscribe(aLong -> {
                    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(et_code, 0);
                });
    }


    private class UpdateUITimer extends TimerTask {
        @Override
        public void run() {
            updateUI();
        }
    }

    void updateUI() {
        runOnUiThread(() -> {
            if (tv_get_code != null) {
                int currentTimeInSecond = (int) (System.currentTimeMillis() / 1000);
                int leftTime = currentTimeInSecond - lastGetCodeTime;
                if (leftTime > UserConstants.MIN_GET_CODE_TIME) {
                    if (isDisable) {
                        tv_get_code.setTextColor(0xFF49D281);
                        tv_get_code.setText("重新获取");
                        isDisable = false;
                    }
                } else {
                    tv_get_code.setTextColor(0xFFADADAD);
                    isDisable = true;
                    tv_get_code.setText(
                            String.format("重发(%d)", UserConstants.MIN_GET_CODE_TIME - leftTime)
                    );
                }
            }
        });

    }

    void init() {

        if (action.equals(UserConstants.BIND_PHONE_ACTION) && isRegisted) {

            //隐藏登录密码栏
            lin_login_pass.setVisibility(View.GONE);
            text_pass_tip.setVisibility(View.GONE);
        } else if (action.equals(FORGET_ACTION)) {
            tb_title.setTitle("找回密码");
        } else if (action.equals(UserConstants.CHANGE_ACTION)) {
            tb_title.setTitle("修改密码");
        } else if (action.equals(REGISTER_ACTION)) {
            tb_title.setTitle("注册");
            rcb_submit.setText("注册");
        }
        if (phoneNum.length() >= 11) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 11; i++) {
                if (i == 2 || i == 5)
                    sb.append(phoneNum.charAt(i) + " ");
                else
                    sb.append(phoneNum.charAt(i));
            }
            tv_phone.setText(sb.toString());
        } else {
            tv_phone.setText(phoneNum);
        }


    }


    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.rcb_submit) {
            if (!judge()) {
                return;
            }
            switch (action) {
                case UserConstants.CHANGE_ACTION:
                case FORGET_ACTION:
                    forget();
                    break;
                case REGISTER_ACTION:
                    register();
                    break;
                case UserConstants.BIND_PHONE_ACTION:
                    bindPhone();
                    break;

            }

        } else if (i == R.id.tv_get_code) {
            if (!isDisable) {
                getCode();
            }
        }
    }

    private UserHttp userHttp = UserHttpImpl.Companion.getInstance();

    /**
     * 绑定手机
     */
    private void bindPhone() {

        userHttp.bindPhone(new BindPhoneParam(code, phoneNum,
                et_code.getText().toString(), et_password.getText().toString()))
                .compose(RxUtils.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable -> showProgressDialog(""))
                .doAfterTerminate(this::dismissProgressDialog)
                .subscribe(loginResponse -> {
                    if (loginResponse != null && !TextUtils.isEmpty(loginResponse.getAccessToken())) {
                        UserIn.INSTANCE.getImService().logout();
//                        RouterManager.INSTANCE.getImRouter().clear();

                        //绑定成功,重新登录IM
                        UserHelper.INSTANCE.setUserinfo(loginResponse);
                        UserIn.INSTANCE.getImService().login(
                                new IMLoginInfo(loginResponse.getUid(), loginResponse.getHxpwd()), null);
                        LogHelper.Companion.getInstance().writeLogSync("绑定手机成功");
                    } else {
                        //更新本地信息
                        UserHelper.INSTANCE.getUserInfo().getUserInfo().setPhone(phoneNum);
                        UserHelper.INSTANCE.getUserInfo().getUserInfo().setBind_phone(1);
                    }
                    //手机绑定成功事件
                    EventBus.getDefault().post(new UserBindPhoneEvent());

                    ToastHelper.Companion.show("手机绑定成功");
                    finish();
                    EventBus.getDefault().post(new UpdateBindStatusEvent());
                }, new ThrowableConsumer() {
                    @Override
                    public void accept(@NotNull String msg) {
                        ToastHelper.Companion.show(msg);
                        LogHelper.Companion.getInstance().writeLogSync(String.format("绑定手机失败:%s", msg));
                    }
                });

    }

    private boolean judge() {
        if (TextUtils.isEmpty(et_code.getText().toString())) {
            ToastHelper.Companion.show("请输入验证码");
            return false;
        }

        if (action.equals(UserConstants.BIND_PHONE_ACTION)) {
            return true;
        } else if (et_password.getText().toString().length() < 6 || et_password.getText().toString().length() > 12) {
            ToastHelper.Companion.show("密码长度6-16位");
            return false;
        }
        return true;
    }

    /**
     * 是忘记密码的操作
     */
    private void forget() {

        userHttp.forget(new ForgetParam(code, phoneNum, et_password.getText().toString(), et_code.getText().toString()))
                .compose(RxUtils.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable ->
                        showProgressDialog("")
                )
                .doAfterTerminate(this::dismissProgressDialog)
                .subscribe(o -> {
                    ToastHelper.Companion.show("修改密码成功");
                    LogHelper.Companion.getInstance().writeLogSync("修改密码成功");
                    finish();
                }, new ThrowableConsumer() {
                    @Override
                    public void accept(@NotNull String msg) {
                        ToastHelper.Companion.show(msg);
                        LogHelper.Companion.getInstance().writeLogSync(String.format("修改密码失败:%s", msg));
                    }
                });
    }

    /**
     * 注册的操作
     */
    private void register() {

        userHttp.register(new RegisterParam(code, phoneNum,
                et_password.getText().toString(),
                et_code.getText().toString()))
                .compose(RxUtils.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable -> showProgressDialog(""))
                .doAfterTerminate(this::dismissProgressDialog)
                .subscribe(o -> {
                            LoginHelper.isRegister = true;
                            login(phoneNum, et_password.getText().toString());
                            LogHelper.Companion.getInstance().writeLogSync("注册成功");
                        },
                        new ThrowableConsumer() {
                            @Override
                            public void accept(@NotNull String msg) {
                                ToastHelper.Companion.show(msg);
                                LogHelper.Companion.getInstance().writeLogSync( String.format("注册失败:%s", msg));
                            }
                        });
    }


    /**
     * 登陆
     *
     * @param phoneNum
     * @param password
     */
    private void login(final String phoneNum, final String password) {

        userHttp.login(new LoginParam(code, phoneNum, EncryptUtils.encryptMD5ToString(password), 1, null))
                .compose(RxUtils.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable -> showProgressDialog(""))
                .doAfterTerminate(this::dismissProgressDialog)
                .subscribe(loginResponse -> {

                    LoginHelper.login(loginResponse);
                    LogHelper.Companion.getInstance().writeLogSync("注册后登录成功");
                    IMLoginInfo info = new IMLoginInfo(
                            String.valueOf(loginResponse.getUid()),
                            loginResponse.getHxpwd()
                    ); // config...
                    IMRequestCallback<IMLoginInfo> callback =
                            new IMRequestCallback<IMLoginInfo>() {
                                @Override
                                public void onSuccess(IMLoginInfo loginInfo) {
                                    setHXinfo(loginResponse);
                                }

                                @Override
                                public void onFailed(int i) {//服务器一直无反映.30秒后回调,错误408
                                    ToastHelper.Companion.show("网络超时");
                                }

                                @Override
                                public void onException(Throwable throwable) {
                                    ToastHelper.Companion.show("未知错误02");
                                }

                            };
                    UserIn.INSTANCE.imSetAccount(info.getAccount());
                    UserIn.INSTANCE.imLogin(info, callback);
                }, new ThrowableConsumer() {
                    @Override
                    public void accept(@NotNull String msg) {
                        ToastHelper.Companion.show(msg);
                        LogHelper.Companion.getInstance().writeLogSync("注册后登录失败" + msg);
                    }
                });

    }

    /**
     * 获取验证码
     */
    private void getCode() {
        lastGetCodeTime = (int) (System.currentTimeMillis() / 1000);
        String smsAction = "";
        if (action == REGISTER_ACTION) {
            smsAction = REGISTER_ACTION;
        } else {
            smsAction = FORGET_ACTION;
        }
        userHttp.code(new CodeParam(code, phoneNum, smsAction))
                .compose(RxUtils.resultData())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(disposable -> showProgressDialog(""))
                .doAfterTerminate(this::dismissProgressDialog)
                .subscribe(o -> ToastHelper.Companion.show("验证码已发送"),
                        new ThrowableConsumer() {
                            @Override
                            public void accept(@NotNull String msg) {
                                ToastHelper.Companion.show(msg);
                            }
                        });

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        timer.cancel();
    }

    //用户信息 获取登陆信息
    public void setHXinfo(UserResponseBean userInfo) {

        try {
            if (userInfo != null) {
                UserHelper.INSTANCE.setUserinfo(userInfo);
                UserIn.INSTANCE.imSetAccount(userInfo.getUid() + "");
                //流程改了 不需要跳转 用户完善信息界面了
                EventBus.getDefault().post(new RefreshWebEvent());
                UserIn.INSTANCE.mainIntent(this);
                ActivityManager.Companion.finishActivity(InputPhoneActivity.class);
                ActivityManager.Companion.finishActivity(LoginActivity.class);
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}