package chen.testchat.ui;

import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import org.pointstone.cugappplat.util.ToastUtils;

import java.util.ArrayList;
import java.util.List;

import chen.testchat.CustomApplication;
import chen.testchat.R;
import chen.testchat.base.Constant;
import chen.testchat.bean.GroupTableMessage;
import chen.testchat.bean.User;
import chen.testchat.db.ChatDB;
import chen.testchat.manager.LocationManager;
import chen.testchat.manager.MessageCacheManager;
import chen.testchat.manager.MsgManager;
import chen.testchat.manager.UserCacheManager;
import chen.testchat.manager.UserManager;
import chen.testchat.util.BmobUtils;
import chen.testchat.util.CommonUtils;
import chen.testchat.util.LogUtil;
import chen.testchat.view.AutoEditText;
import cn.bmob.v3.datatype.BmobGeoPoint;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;

/**
 * 项目名称:    HappyChat
 * 创建人:        陈锦军
 * 创建时间:    2016/9/11      17:49
 * QQ:             1981367757
 */
public class LoginActivity extends org.pointstone.cugappplat.base.basemvp.BaseActivity implements View.OnClickListener {
        private AutoEditText userName;
        private AutoEditText passWord;
        private Button login;
        private TextView register;
        private TextView forget;
        private ImageView bg;
        private boolean isFirstLogin = false;
        private List<GroupTableMessage> newData;


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

        }

        @Override
        protected boolean isNeedHeadLayout() {
                return false;
        }

        @Override
        protected boolean isNeedEmptyLayout() {
                return false;
        }

        @Override
        protected int getContentLayout() {
                return R.layout.activity_login;
        }

        @Override
        public void initView() {
                bg = (ImageView) findViewById(R.id.iv_login_bg);
                userName = (AutoEditText) findViewById(R.id.aet_login_name);
                passWord = (AutoEditText) findViewById(R.id.aet_login_password);
                login = (Button) findViewById(R.id.btn_login_confirm);
                register = (TextView) findViewById(R.id.tv_login_register);
                forget = (TextView) findViewById(R.id.tv_login_forget);
                login.setOnClickListener(this);
                register.setOnClickListener(this);
                forget.setOnClickListener(this);
        }




        @Override
        public void initData() {
                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                        @Override

                        public void run() {
                                Animation animation = AnimationUtils.loadAnimation(LoginActivity.this, R.anim.translate_anim);
                                bg.startAnimation(animation);
                        }
                }, 200);
        }

        @Override
        public void onClick(View view) {
                switch (view.getId()) {
                        case R.id.btn_login_confirm:
                                boolean isNetConnected = CommonUtils.isNetWorkAvailable(this);
                                if (!isNetConnected) {
                                        ToastUtils.showShortToast(getString(R.string.network_tip));
                                } else {
                                        login();
                                }
                                break;
                        case R.id.tv_login_register:
                                Intent intent = new Intent(this, RegisterActivity.class);
                                startActivityForResult(intent, Constant.REQUEST_CODE_REGISTER);
                                break;
                        case R.id.tv_login_forget:
                                LogUtil.e("忘记密码");
                                break;
                }
        }

        private void login() {
                if (TextUtils.isEmpty(userName.getText())) {
                        userName.startShakeAnimation();
                        ToastUtils.showShortToast(getString(R.string.account_null));
                        return;
                }
                if (TextUtils.isEmpty(passWord.getText())) {
                        passWord.startShakeAnimation();
                        ToastUtils.showShortToast(getString(R.string.password_null));
                        return;
                }
                if (!CommonUtils.isNetWorkAvailable(this)) {
                        ToastUtils.showShortToast(getString(R.string.network_tip));
                        return;
                }
                showLoadDialog("正在登录.........");
                final User user = new User();
                user.setUsername(userName.getText().toString().trim());
                user.setPassword(passWord.getText().toString().trim());
                if (LocationManager.getInstance().getLatitude() != 0 || LocationManager.getInstance().getLongitude() != 0) {
                        user.setLocation(new BmobGeoPoint(LocationManager.getInstance().getLongitude(), LocationManager.getInstance()
                                .getLatitude()));
                }
                if (newData != null) {
                        newData.clear();
                }
                user.login(CustomApplication.getInstance(), new SaveListener() {
                                @Override
                                public void onSuccess() {
                                        dismissLoadDialog();
                                        ToastUtils.showShortToast("登录成功");
                                        LogUtil.e("登录成功");
//                                        登录成功之后,
//                                        检查其他设备绑定的用户,强迫其下线
                                        LogUtil.e("检查该用户绑定的其他设备.....");
                                        UserManager.getInstance().checkInstallation(new UpdateListener() {
                                                @Override
                                                public void onSuccess() {
                                                        ToastUtils.showShortToast("登录成功1");
                                                        LogUtil.e("登录成功");
                                                        showLoadDialog("正在获取好友资料.........");
                                                        updateUserInfo();
                                                }

                                                @Override
                                                public void onFailure(int i, String s) {
                                                        ToastUtils.showShortToast("登录失败,请重新登录" + s + i);
                                                        LogUtil.e("登录失败" + s + i);
                                                }
                                        });
                                }

                                @Override
                                public void onFailure(int i, String s) {
                                        dismissLoadDialog();
                                        ToastUtils.showShortToast("登录失败" + s + i);
                                }
                        }
                );
        }

        /**
         * 更新用户资料
         */
        private void updateUserInfo() {
                LogUtil.e("更新好友信息中...........");
                UserManager.getInstance().queryAndSaveCurrentContactsList(new FindListener<User>() {
                                                                                  @Override
                                                                                  public void onSuccess(final List<User> contacts) {
                                                                                          //                               返回的是去除了黑名单的好友列表
//                                       否则保存到内存中,方便取用
                                                                                          LogUtil.e("查询好友成功");
                                                                                          LogUtil.e("用户USER");
//                                                                                          User user = UserManager.getInstance().getCurrentUser();
//                                                                                          if (user != null) {
//                                                                                                  .getInstance().setUser(user);
//                                                                                          } else {
//                                                                                                  LogUtil.e("用户USER为空");
//                                                                                          }
                                                                                          LogUtil.e("已保存好友资料到内存中11");
                                                                                          String uid = UserManager.getInstance().getCurrentUserObjectId();
                                                                                          MsgManager.getInstance().queryGroupTableMessage(uid, new FindListener<GroupTableMessage>() {
                                                                                                          @Override
                                                                                                          public void onSuccess(final List<GroupTableMessage> list) {
                                                                                                                  if (list != null && list.size() > 0) {
                                                                                                                           newData=new ArrayList<>();
                                                                                                                          for (GroupTableMessage message :
                                                                                                                                  list) {
//                                                                                                                                  这里进行判断出现是因为有可能建群失败的时候,未能把groupId上传上去
                                                                                                                                  if (message.getGroupId()!=null) {
                                                                                                                                          newData.add(message);
                                                                                                                                  }
                                                                                                                          }
                                                                                                                          LogUtil.e("在服务器上查询到该用户所有的群,数目:" + newData.size());
                                                                                                                          if (ChatDB.create().saveGroupTableMessage(newData)) {
                                                                                                                                  LogUtil.e("保存用户所拥有的群结构消息到数据库中成功");
//                                                                                                                                  MessageCacheManager.getInstance().addGroupTableMessage(list);
                                                                                                                          } else {
                                                                                                                                  LogUtil.e("保存用户所拥有的群结构消息到数据库中失败");
                                                                                                                          }
                                                                                                                  } else {
                                                                                                                          LogUtil.e("服务器上没有查到该用户所拥有的群");
                                                                                                                  }
                                                                                                                  runOnUiThread(new Runnable() {
                                                                                                                          @Override
                                                                                                                          public void run() {
                                                                                                                                  MsgManager.getInstance().updateUserInstallationId(new UpdateListener() {
                                                                                                                                          @Override
                                                                                                                                          public void onSuccess() {
                                                                                                                                                  dismissLoadDialog();
                                                                                                                                                  UserCacheManager.getInstance().setLogin(true);
                                                                                                                                                  MessageCacheManager.getInstance().setLogin(true);
                                                                                                                                                  CustomApplication.getInstance().getSharedPreferencesUtil().setLogin(true);
                                                                                                                                                  MessageCacheManager.getInstance().addGroupTableMessage(newData);
                                                                                                                                                  if (contacts != null && contacts.size() > 0) {
                                                                                                                                                          UserCacheManager.getInstance().setContactsList(BmobUtils.list2map(contacts));
                                                                                                                                                  }
                                                                                                                                                  Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                                                                                                                                  intent.putExtra("isFirstLogin", isFirstLogin);
                                                                                                                                                  startActivity(intent);
                                                                                                                                                  finish();
                                                                                                                                          }

                                                                                                                                          @Override
                                                                                                                                          public void onFailure(int i, String s) {
                                                                                                                                                  dismissLoadDialog();
                                                                                                                                                  ToastUtils.showShortToast("登录失败,请重新登录" + s + i);
                                                                                                                                                  LogUtil.e("登录失败" + s + i);
                                                                                                                                          }
                                                                                                                                  });
                                                                                                                          }
                                                                                                                  });
                                                                                                          }

                                                                                                          @Override
                                                                                                          public void onError(int i, String s) {
                                                                                                                  dismissLoadDialog();
                                                                                                                  LogUtil.e("在服务器上查询所有群结构消息失败" + s + i);
                                                                                                                  if (i!=101) {
                                                                                                                          ToastUtils.showShortToast("登录失败,请重新登录");
                                                                                                                  }else {
//                                                                                                                          这是群结构消息未创建的错误
                                                                                                                          runOnUiThread(new Runnable() {
                                                                                                                                  @Override
                                                                                                                                  public void run() {
                                                                                                                                          MsgManager.getInstance().updateUserInstallationId(new UpdateListener() {
                                                                                                                                                  @Override
                                                                                                                                                  public void onSuccess() {
                                                                                                                                                          dismissLoadDialog();
                                                                                                                                                          UserCacheManager.getInstance().setLogin(true);
                                                                                                                                                          MessageCacheManager.getInstance().setLogin(true);
                                                                                                                                                          CustomApplication.getInstance().getSharedPreferencesUtil().setLogin(true);
//                                                                                                                                                          MessageCacheManager.getInstance().addGroupTableMessage(list);
                                                                                                                                                          if (contacts != null && contacts.size() > 0) {
                                                                                                                                                                  UserCacheManager.getInstance().setContactsList(BmobUtils.list2map(contacts));
                                                                                                                                                          }
                                                                                                                                                          Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                                                                                                                                          intent.putExtra("isFirstLogin", isFirstLogin);
                                                                                                                                                          startActivity(intent);
                                                                                                                                                          finish();
                                                                                                                                                  }

                                                                                                                                                  @Override
                                                                                                                                                  public void onFailure(int i, String s) {
                                                                                                                                                          dismissLoadDialog();
                                                                                                                                                          ToastUtils.showShortToast("登录失败,请重新登录" + s + i);
                                                                                                                                                          LogUtil.e("登录失败" + s + i);
                                                                                                                                                  }
                                                                                                                                          });
                                                                                                                                  }
                                                                                                                          });
                                                                                                                  }
                                                                                                          }
                                                                                                  }
                                                                                          );

                                                                                  }

                                                                                  @Override
                                                                                  public void onError(int i, String s) {
                                                                                          dismissLoadDialog();
                                                                                          ToastUtils.showShortToast("登录失败,请重新登录");
                                                                                          LogUtil.e("在服务器上面查询好友失败" + s + i);
                                                                                  }
                                                                          }
                );
        }


        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == Activity.RESULT_OK) {
                        switch (requestCode) {
                                case Constant.REQUEST_CODE_REGISTER:
                                        String name = data.getStringExtra("username");
                                        String password = data.getStringExtra("password");
                                        if (name != null && password != null) {
                                                passWord.setText(password);
                                                userName.setText(name);
                                        }
                                        isFirstLogin = true;
                                        break;
                        }
                }
        }

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