package com.chenantao.playtogether.mvc.view.activity.invitation;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import com.avos.avoscloud.AVFile;
import com.avos.avoscloud.AVUser;
import com.avos.avoscloud.im.v2.AVIMClient;
import com.avos.avoscloud.im.v2.AVIMException;
import com.avos.avoscloud.im.v2.callback.AVIMClientCallback;
import com.chenantao.autolayout.AutoRecyclerView;
import com.chenantao.playtogether.R;
import com.chenantao.playtogether.chat.AVImClientManager;
import com.chenantao.playtogether.chat.mvc.view.activity.ChatHomeActivity;
import com.chenantao.playtogether.faq.FAQChatActivity;
import com.chenantao.playtogether.gallery.MyGalleryActivity;
import com.chenantao.playtogether.mvc.controller.invitation.HomeController;
import com.chenantao.playtogether.mvc.model.bean.Invitation;
import com.chenantao.playtogether.mvc.model.bean.User;
import com.chenantao.playtogether.mvc.model.bean.event.EventRefreshData;
import com.chenantao.playtogether.mvc.model.bean.event.EventSetAvatar;
import com.chenantao.playtogether.mvc.view.activity.user.LoginActivity;
import com.chenantao.playtogether.mvc.view.activity.user.PersonalCenterActivity;
import com.chenantao.playtogether.mvc.view.adapter.HomeInvitationItemAdapter;
import com.chenantao.playtogether.mvc.view.common.BaseActivity;
import com.chenantao.playtogether.mvc.view.widget.SelectListPopupWindow;
import com.chenantao.playtogether.utils.Constant;
import com.chenantao.playtogether.utils.DialogUtils;
import com.chenantao.playtogether.utils.FileUtils;
import com.chenantao.playtogether.utils.PicassoUtils;
import com.chenantao.playtogether.utils.SpUtils;
import com.orhanobut.logger.Logger;
import com.squareup.picasso.Picasso;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.inject.Inject;

import butterknife.Bind;
import de.greenrobot.event.EventBus;

public class HomeActivity extends BaseActivity implements View.OnClickListener {

    private static final int REQUEST_CODE_CAPTURE_CAMERA = 0;

    //第一次打开应用时的引导层
    @Bind(R.id.guideView)
    View mGuideView;
    @Bind(R.id.tvLogout)
    TextView mTvLogout;
    @Bind(R.id.tvExit)
    TextView mTvExit;
    @Bind(R.id.viewDim)
    View viewDim;
    @Bind(R.id.rvInvitation)
    AutoRecyclerView mRvInvitation;
    @Bind(R.id.swipeRefreshLayout)
    SwipeRefreshLayout mSwipeRefreshLayout;
    @Bind(R.id.navigationView)
    NavigationView mNavigationView;
    @Bind(R.id.drawerLayout)
    DrawerLayout mDrawerLayout;
    ImageView mIvAvatar;

    private RecyclerView.Adapter mRvInvitationAdapter;

    private PopupWindow mPopupWindow;

    private File mCameraFile;//拍照上传的图片


    @Inject
    public HomeController mController;

    @Override
    public int getLayoutId() {
        return R.layout.activity_home;
    }

    @Override
    public void injectActivity() {
        mActivityComponent.inject(this);
    }

    @Override
    public void afterCreate() {
        ActionBar toolbar = getSupportActionBar();
        if (toolbar != null) {
            toolbar.setTitle("首页");
        }
        EventBus.getDefault().register(this);
        mSwipeRefreshLayout.setColorSchemeResources(R.color.primary_color);
        mNavigationView.setItemIconTintList(null);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mNavigationView.setElevation(0);
        }
        //设置 headerView 的信息
        View headerView = mNavigationView.getHeaderView(0);
        mIvAvatar = (ImageView) headerView.findViewById(R.id.ivAuthorAvatar);
        TextView tvUsername = (TextView) headerView.findViewById(R.id.tvUsername);
        tvUsername.setText(AVUser.getCurrentUser().getUsername());
        //初始化 recyclerview
        mRvInvitation.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,
                false));
        initEvent();
        //显式调用下拉组件
        mDrawerLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver
                .OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mDrawerLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                mSwipeRefreshLayout.setRefreshing(true);
                loadData();
            }
        });
    }

    private void initEvent() {
        //判断是否为第一次登录,如果是,显示引导层
        if (SpUtils.getIntProperty(this, Constant.SP_KEY_IS_FIRST_LOGIN) == -1) {
            mGuideView.setVisibility(View.VISIBLE);
            SpUtils.setIntProperty(this, Constant.SP_KEY_IS_FIRST_LOGIN, 1);
            mGuideView.setOnClickListener(this);
        }
        mTvExit.setOnClickListener(this);
        mTvLogout.setOnClickListener(this);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                loadData();
            }
        });
        mNavigationView.setNavigationItemSelectedListener(new NavigationView
                .OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
                Intent intent;
                switch (item.getItemId()) {
                    case R.id.home:
                        break;
                    case R.id.personCenter:
                        PersonalCenterActivity.startActivity(HomeActivity.this, AVUser.getCurrentUser().getObjectId());
                        break;
                    case R.id.invite:
                        intent = new Intent(HomeActivity.this, PostInvitationActivity.class);
                        startActivity(intent);
                        break;
                    case R.id.friend:
                        ChatHomeActivity.startActivity(HomeActivity.this, AVUser.getCurrentUser().getUsername
                                ());
                        break;
                    case R.id.faq:
                        intent = new Intent(HomeActivity.this, FAQChatActivity.class);
                        startActivity(intent);
                        break;
                }
                return true;
            }
        });
        mIvAvatar.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ivAuthorAvatar:
                mPopupWindow = getPopupWindow();
                mPopupWindow.showAsDropDown(mIvAvatar, 0, 0);
                toggleLight(true);
                break;
            case R.id.guideView:
                mGuideView.setVisibility(View.GONE);
                break;
            case R.id.tvExit:
                exit(false);
                break;
            case R.id.tvLogout:
                //清空 User信息以及退出 IM
                exit(true);
                break;
        }
    }

    /**
     * 退出应用
     *
     * @param needClearUserInfo 是否需要清空用户信息
     */
    public void exit(final boolean needClearUserInfo) {
        String hint = needClearUserInfo ? "确定要清空信息并退出吗?" : "确定要退出应用吗";
        Snackbar.make(mDrawerLayout, hint, Snackbar.LENGTH_LONG)
                .setAction("拜拜", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (needClearUserInfo) {
                                    AVUser.logOut();
                                    AVIMClient client = AVImClientManager.getInstance().getClient();
                                    if (client != null) {
                                        client.close(new AVIMClientCallback() {
                                            @Override
                                            public void done(AVIMClient avimClient, AVIMException e) {
                                                e.printStackTrace();
                                                toLoginActivity();
                                                return;
                                            }
                                        });
                                    }
                                }
                                toLoginActivity();
                            }
                        }
                )
                .show();

    }

    private void toLoginActivity() {
        Intent intent = new Intent(HomeActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }

    /**
     * 需要刷新数据
     */

    public void onEvent(EventRefreshData event) {
        mDrawerLayout.closeDrawer(Gravity.LEFT);
        loadData();
    }

    /**
     * 设置头像
     */
    public void onEvent(EventSetAvatar event) {
        mPopupWindow.dismiss();
        mController.uploadAvatar(event.path.get(0));
        DialogUtils.showProgressDialog("上传头像中..", this);
    }

    private void loadData() {
        AVFile avatar = AVUser.getCurrentUser(User.class).getAvatar();
        if (avatar != null) {
            avatar.getThumbnailUrl(false, 100, 100);
            String url = avatar.getUrl();
            PicassoUtils.displayFitImage(this, Uri.parse(url), mIvAvatar, null);
        }
        mSwipeRefreshLayout.setRefreshing(true);
        List<Invitation> datas = new ArrayList<>();
        mRvInvitation.setAdapter(mRvInvitationAdapter = new HomeInvitationItemAdapter(this,
                datas));
        mController.getNewlyInvitationDatas();

    }

    public void loadDataSuccess(List<Invitation> datas) {
        mSwipeRefreshLayout.setRefreshing(false);
        mRvInvitation.setAdapter(mRvInvitationAdapter = new HomeInvitationItemAdapter(this,
                datas));

    }

    public void loadDataError(String msg) {
        mSwipeRefreshLayout.setRefreshing(false);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    public void uploadAvatarSuccess(String path) {
        Toast.makeText(this, "上传成功:" + path, Toast.LENGTH_SHORT).show();
        int width = mIvAvatar.getMeasuredWidth();
        int height = mIvAvatar.getMeasuredHeight();
        Picasso.with(this).
                load(new File(path))
                .resize(width, height)
                .placeholder(R.mipmap.pictures_no)
                .into(mIvAvatar);
        DialogUtils.dismissProgressDialog();
    }

    public void uploadAvatarFail(String msg) {
        DialogUtils.dismissProgressDialog();
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    /**
     * popupWindow弹出或隐藏时
     * 使内容区域变亮或变暗
     */
    private void toggleLight(boolean isOpen) {
        if (isOpen) {
            viewDim.setVisibility(View.VISIBLE);
        } else {
            viewDim.setVisibility(View.GONE);
        }
    }

    private PopupWindow getPopupWindow() {
        if (mPopupWindow == null) {
            String[] items = new String[]{"相册", "拍照"};
            mPopupWindow = new SelectListPopupWindow(this, "选择头像", items, viewDim);
            ((SelectListPopupWindow) mPopupWindow).setOnItemClickListener(new SelectListPopupWindow
                    .OnItemClickListener() {
                @Override
                public void onClick(String item) {
                    if (item.equals("相册")) {
                        Intent intent = new Intent(HomeActivity.this, MyGalleryActivity.class);
                        intent.putExtra(MyGalleryActivity.EXTRA_LIMIT_COUNT, 1);
                        intent.putExtra(MyGalleryActivity.EXTRA_SELECT_TYPE, MyGalleryActivity
                                .TYPE_UPLOAD_AVATAR);
                        startActivity(intent);
                    } else if (item.equals("拍照")) {
                        String state = Environment.getExternalStorageState();
                        if (state.equals(Environment.MEDIA_MOUNTED)) {
                            mCameraFile = new File(FileUtils.createImageFile());
                            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mCameraFile));
                            startActivityForResult(intent, REQUEST_CODE_CAPTURE_CAMERA);
                        } else {
                            Toast.makeText(getApplicationContext(), "请确认已经插入SD卡",
                                    Toast.LENGTH_LONG).show();
                        }
                    }
                }
            });

        }
        return mPopupWindow;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mNavigationView != null) mNavigationView.setCheckedItem(R.id.home);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_CAPTURE_CAMERA)//拍照完成
        {
            if (resultCode == RESULT_OK) {
                mPopupWindow.dismiss();
                String path = mCameraFile.getAbsolutePath();
                Logger.e("path:" + mCameraFile.getAbsolutePath());
                DialogUtils.showProgressDialog("上传图片中", this);
                mController.uploadAvatar(path);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onBackPressed() {
        if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
            mDrawerLayout.closeDrawer(Gravity.LEFT);
            return;
        }
        exitBy2Click();
    }

    /**
     *  * 双击退出函数
     *  
     */
    private static Boolean isExit = false;

    private void exitBy2Click() {
        Timer tExit = null;
        if (!isExit) {
            isExit = true; // 准备退出
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            tExit = new Timer();
            tExit.schedule(new TimerTask() {
                @Override
                public void run() {
                    isExit = false; // 取消退出
                }

            }, 2000); // 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务
        } else {
            finish();
        }
    }
}