package tv.baokan.baokanandroid.ui.activity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.kaopiz.kprogresshud.KProgressHUD;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.PlatformDb;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import okhttp3.Call;
import tv.baokan.baokanandroid.R;
import tv.baokan.baokanandroid.model.UserBean;
import tv.baokan.baokanandroid.utils.APIs;
import tv.baokan.baokanandroid.utils.LogUtils;
import tv.baokan.baokanandroid.utils.NetworkUtils;
import tv.baokan.baokanandroid.utils.ProgressHUD;
import tv.baokan.baokanandroid.widget.NavigationViewRed;

public class LoginActivity extends BaseActivity implements View.OnClickListener, TextWatcher {

    private static final String TAG = "LoginActivity";

    // 注册的启动请求码
    public static final int REQUEST_CODE_REGISTER = 0;
    public static final int REQUEST_CODE_FORGOT = 1;

    private NavigationViewRed mNavigationViewRed;    // 导航栏
    private EditText mUsernameEditText;               // 账号
    private EditText mPasswordEditText;               // 密码
    private ImageView mShowPassword;                  // 显示密码
    private Button mLoginButton;                      // 登录
    private View mSinaView;                           // 新浪
    private View mQqView;                             // QQ
    private View mRegisterView;                       // 注册
    private View mForgotPasswordView;                 // 忘记密码
    private TextView mAgreementTextView;              // 注册条款

    /**
     * 便捷启动当前activity
     *
     * @param activity 启动当前activity的activity
     */
    public static void start(Activity activity) {
        Intent intent = new Intent(activity, LoginActivity.class);
        activity.startActivity(intent);
        activity.overridePendingTransition(R.anim.push_enter, R.anim.push_exit);
    }

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

        mNavigationViewRed = (NavigationViewRed) findViewById(R.id.nav_login);
        mUsernameEditText = (EditText) findViewById(R.id.et_login_username);
        mPasswordEditText = (EditText) findViewById(R.id.et_login_password);
        mShowPassword = (ImageView) findViewById(R.id.iv_login_showpassword);
        mLoginButton = (Button) findViewById(R.id.btn_login_login);
        mSinaView = findViewById(R.id.ll_login_sina);
        mQqView = findViewById(R.id.ll_login_qq);
        mRegisterView = findViewById(R.id.rl_login_register);
        mForgotPasswordView = findViewById(R.id.rl_login_forgotpassword);
        mAgreementTextView = (TextView) findViewById(R.id.tv_login_agreement);

        // 配置导航栏
        mNavigationViewRed.setupNavigationView(true, false, "登录", new NavigationViewRed.OnClickListener() {
            @Override
            public void onBackClick(View v) {
                finish();
            }
        });

        // 监听点击事件
        mShowPassword.setOnClickListener(this);
        mLoginButton.setOnClickListener(this);
        mSinaView.setOnClickListener(this);
        mQqView.setOnClickListener(this);
        mRegisterView.setOnClickListener(this);
        mForgotPasswordView.setOnClickListener(this);
        mAgreementTextView.setOnClickListener(this);

        // 改变登录按钮的状态
        loginButtonStateChange();

        // 文本框改变监听
        mUsernameEditText.addTextChangedListener(this);
        mPasswordEditText.addTextChangedListener(this);

        // 自动弹出键盘
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            public void run() {
                InputMethodManager inputManager = (InputMethodManager) mUsernameEditText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                inputManager.showSoftInput(mUsernameEditText, 0);
            }

        }, 500);
    }

    // 下面3个方法是监听文本框改变
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        loginButtonStateChange();
    }

    /**
     * 改变登录按钮的状态
     */
    private void loginButtonStateChange() {
        // 账号和密码都不为空才能点击
        if (!TextUtils.isEmpty(mUsernameEditText.getText().toString())
                && !TextUtils.isEmpty(mPasswordEditText.getText().toString())) {
            mLoginButton.setEnabled(true);
        } else {
            mLoginButton.setEnabled(false);
        }
    }

    /**
     * 处理各种点击事件
     *
     * @param v 被点击的view
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_login_showpassword:
                showOrHidePassword();
                break;
            case R.id.btn_login_login:
                login();
                break;
            case R.id.ll_login_sina:
                sinaLogin();
                break;
            case R.id.ll_login_qq:
                qqLogin();
                break;
            case R.id.rl_login_register:
                register();
                break;
            case R.id.rl_login_forgotpassword:
                forgotPassword();
                break;
            case R.id.tv_login_agreement:
                readUserAgreement();
                break;
        }
    }

    /**
     * 阅读用户条款
     */
    private void readUserAgreement() {
        AgreementActivity.start(this);
    }

    /**
     * 明文密文切换
     */
    private void showOrHidePassword() {
        if (mShowPassword.getTag() == null) {
            mShowPassword.setTag("show");
            mShowPassword.setImageResource(R.drawable.login_icon_viewcode_selected);
            mPasswordEditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
        } else {
            mShowPassword.setTag(null);
            mShowPassword.setImageResource(R.drawable.login_icon_viewcode_normal);
            mPasswordEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        }
        // 移动光标到最后
        mPasswordEditText.setSelection(mPasswordEditText.length());
    }

    /**
     * 登录
     */
    private void login() {
        String username = mUsernameEditText.getText().toString();
        String password = mPasswordEditText.getText().toString();
        if (TextUtils.isEmpty(username)) {
            ProgressHUD.showInfo(LoginActivity.this, "账号不能为空");
            return;
        }
        if (TextUtils.isEmpty(password)) {
            ProgressHUD.showInfo(LoginActivity.this, "密码不能为空");
            return;
        }

        // 登录进度条
        final KProgressHUD hud = ProgressHUD.show(this, "登录中...");

        HashMap<String, String> parameters = new HashMap<>();
        parameters.put("username", username);
        parameters.put("password", password);

        NetworkUtils.shared.post(APIs.LOGIN, parameters, new NetworkUtils.StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                hud.dismiss();
                ProgressHUD.showInfo(LoginActivity.this, "您的网络不给力哦");
            }

            @Override
            public void onResponse(String response, int id) {
                LogUtils.d(TAG, response);
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    if (jsonObject.getString("err_msg").equals("success")) {

                        // 编码登录信息
                        UserBean userBean = new UserBean(jsonObject.getJSONObject("data"));
                        userBean.updateUserInfoFromLocal();

                        // 延迟1秒退出activity
                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                hud.dismiss();
                                ProgressHUD.showInfo(LoginActivity.this, "登录成功");

                                finish();
                            }
                        }, 1000);

                    } else {
                        hud.dismiss();
                        String info = jsonObject.getJSONObject("data").getString("info");
                        Toast.makeText(LoginActivity.this, info, Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    hud.dismiss();
                    ProgressHUD.showInfo(LoginActivity.this, "数据解析异常");
                }
            }
        });

    }

    /**
     * 新浪登录
     */
    private void sinaLogin() {
        showShareSDKLogin(SinaWeibo.NAME);
    }

    /**
     * qq登录
     */
    private void qqLogin() {
        showShareSDKLogin(QQ.NAME);
    }

    /**
     * 根据平台名称弹出对应的授权界面
     *
     * @param platformString 平台名称
     */
    private void showShareSDKLogin(String platformString) {
        final Platform platform = ShareSDK.getPlatform(platformString);
        // SSO可以登录,客户端回调有问题
        platform.SSOSetting(true);
        // 回调信息,可以在这里获取基本的授权返回的信息,但是注意如果做提示和UI操作要传到主线程handler里去执行
        platform.setPlatformActionListener(new PlatformActionListener() {

            @Override
            public void onError(Platform arg0, int arg1, Throwable arg2) {
                arg2.printStackTrace();
                LogUtils.d(TAG, "授权异常" + "线程 = " + Thread.currentThread().getName());
            }

            @Override
            public void onComplete(final Platform arg0, int arg1, HashMap<String, Object> arg2) {
                LogUtils.d(TAG, "授权成功");
                PlatformDb db = arg0.getDb();
                String platformName = db.getPlatformNname();
                String uid = db.getUserId();
                String nickname = db.getUserName();
                String avatar = db.getUserIcon();

                if (platformName.equals(QQ.NAME)) {
                    String figureurl_qq_2 = arg2.get("figureurl_qq_2").toString();
                    if (!TextUtils.isEmpty(figureurl_qq_2)) {
                        avatar = arg2.get("figureurl_qq_2").toString();
                    }
                } else if (platformName.equals(SinaWeibo.NAME)) {
                    String avatar_hd = arg2.get("avatar_hd").toString();
                    if (!TextUtils.isEmpty(avatar_hd)) {
                        avatar = arg2.get("avatar_hd").toString();
                    }
                }

                // 处理授权结果
                shareSDKLoginhandler(nickname, avatar, uid, platformName);

                LogUtils.d(TAG, "uid = " + uid + " avatar = " + avatar + " nickname = " + nickname);

                for (Map.Entry<String, Object> entry : arg2.entrySet()) {
                    LogUtils.d(TAG, entry.getKey() + " = " + entry.getValue());
                }

            }

            @Override
            public void onCancel(Platform arg0, int arg1) {
                LogUtils.d(TAG, "授权取消" + "线程 = " + Thread.currentThread().getName());
            }
        });

        // 授权并获取用户信息
        platform.showUser(null);
    }

    /**
     * shareSDK登录后续处理 - 先去判断是否已经注册,没有注册则先注册,然后登录。已经注册就直接登录
     *
     * @param nickname     昵称
     * @param avatar       头像
     * @param uid          唯一标识
     * @param platformName 平台名称
     */
    private void shareSDKLoginhandler(String nickname, String avatar, String uid, final String platformName) {

        String password = uid.length() >= 12 ? uid.substring(0, 12) : uid;
        String username = platformName.equals(SinaWeibo.NAME) ? "wb_" + password : "qq_" + password;
        username = username.toLowerCase();

        HashMap<String, String> parameters = new HashMap<>();
        parameters.put("username", username);
        parameters.put("password", password);
        parameters.put("email", username + "@baokan.name");
        parameters.put("userpic", avatar);
        parameters.put("nickname", nickname);

        final String finalUsername = username;
        final String finalPassword = password;
        NetworkUtils.shared.post(APIs.REGISTER, parameters, new NetworkUtils.StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                ProgressHUD.showInfo(mContext, "您的网络不给力哦");
            }

            @Override
            public void onResponse(String response, int id) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String info = jsonObject.getString("info");
                    if (jsonObject.getString("err_msg").equals("success") || info.equals("此用户名已被注册")) {
                        mUsernameEditText.setText(finalUsername);
                        mPasswordEditText.setText(finalPassword);
                        login();
                    } else {
                        ProgressHUD.showInfo(mContext, info);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    ProgressHUD.showInfo(mContext, "数据解析异常");
                }
            }
        });

    }

    /**
     * 注册
     */
    private void register() {
        RegisterActivity.start(this);
    }

    /**
     * 找回密码
     */
    private void forgotPassword() {
        ForgotActivity.start(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CODE_REGISTER:
                if (resultCode == RESULT_OK) {
                    String username = data.getStringExtra("username");
                    String password = data.getStringExtra("password");
                    mUsernameEditText.setText(username);
                    mPasswordEditText.setText(password);
                    login();
                }
                break;
            case REQUEST_CODE_FORGOT:
                if (resultCode == RESULT_OK) {
                    finish();
                }
                break;
        }
    }
}