package com.example.hy.wanandroid.view.hierarchy;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;

import com.example.hy.wanandroid.R;
import com.example.hy.wanandroid.adapter.ArticlesAdapter;
import com.example.hy.wanandroid.base.fragment.BaseLoadFragment;
import com.example.hy.wanandroid.entity.ArticleBean;
import com.example.hy.wanandroid.config.Constant;
import com.example.hy.wanandroid.config.User;
import com.example.hy.wanandroid.contract.hierarchy.HierarchySecondContract;
import com.example.hy.wanandroid.di.module.fragment.HierarchySecondFragmentModule;
import com.example.hy.wanandroid.entity.Article;
import com.example.hy.wanandroid.presenter.hierarchy.HierarchySecondPresenter;
import com.example.commonlib.utils.AnimUtil;
import com.example.commonlib.utils.CommonUtil;
import com.example.hy.wanandroid.view.homepager.ArticleActivity;
import com.example.hy.wanandroid.view.mine.LoginActivity;
import com.example.hy.wanandroid.widget.popup.PressPopup;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;

import java.util.List;

import javax.inject.Inject;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import dagger.Lazy;

import static android.app.Activity.RESULT_OK;

/**
 * Created by 陈健宇 at 2018/10/28
 */
public class HierarchySecondFragment extends BaseLoadFragment<HierarchySecondPresenter> implements HierarchySecondContract.View {

    @BindView(R.id.rv_hierarchy)
    RecyclerView rvHierarchySecondList;
    @BindView(R.id.srl_hierarchy_second)
    SmartRefreshLayout srlHierarchyList;

    @Inject
    HierarchySecondPresenter mPresenter;
    @Inject
    ArticlesAdapter mArticlesAdapter;
    @Inject
    LinearLayoutManager mLinearLayoutManager;
    @Inject
    List<Article> mArticleList;
    @Inject
    Lazy<PressPopup> mPopupWindow;

    private int mPageNum = 0;
    private int mId = -1;
    private boolean isLoadMore = false;
    private int mArticlePosition = 0;//点击的位置
    private Article mArticle;
    private boolean isPress = false;

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_hierarchy_second;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        Bundle bundle = getArguments();
        if(bundle != null){
            mId = bundle.getInt(Constant.KEY_HIERARCHY_PAGENUM, -1);
        }
        super.onCreate(savedInstanceState);
    }

    @Override
    protected HierarchySecondPresenter getPresenter() {
        return mPresenter;
    }

    @Override
    protected void inject() {
        ((HierarchySecondActivity) getActivity()).getComponent().getHierarchySecondFragmentComponent(new HierarchySecondFragmentModule()).inject(this);
    }

    @Override
    protected void initView() {
        super.initView();
        initRecyclerView();
        initRefreshView();
    }

    @SuppressLint("ClickableViewAccessibility")
    private void initRecyclerView() {
        mArticlesAdapter.openLoadAnimation();
        rvHierarchySecondList.setHasFixedSize(true);
        rvHierarchySecondList.setLayoutManager(mLinearLayoutManager);
        rvHierarchySecondList.setAdapter(mArticlesAdapter);
        mArticlesAdapter.setOnItemClickListener((adapter, view, position) -> {//跳转文章
            if(CommonUtil.isEmptyList(mArticleList)) return;
            mArticlePosition = position;
            mArticle = mArticleList.get(position);
            ArticleBean articleBean = new ArticleBean(mArticle);
            ArticleActivity.startActicityForResultByFragment(mActivity, this, articleBean, false, Constant.REQUEST_REFRESH_ARTICLE);
        });
        mArticlesAdapter.setOnItemChildClickListener((adapter, view, position) -> {//收藏
            if(CommonUtil.isEmptyList(mArticleList)) return;
            mArticlePosition = position;
            mArticle = mArticleList.get(position);
            if(!User.getInstance().isLoginStatus()) {
                LoginActivity.startActivityForResultByFragment(mActivity, this, Constant.REQUEST_LOGIN);
                showToast(getString(R.string.first_login));
                return;
            }
            collect();
            AnimUtil.scale(view, -1);
        });
        mArticlesAdapter.setOnItemLongClickListener((adapter, view, position) -> {
            if(CommonUtil.isEmptyList(mArticleList)) return false;
            Article article = mArticleList.get(position);
            mPopupWindow.get().show(srlHierarchyList, view, article);
            return true;
        });
    }

    private void initRefreshView() {
        srlHierarchyList.setOnRefreshListener(refreshLayout -> {
            mPageNum = 0;
            mPresenter.loadMoreArticles(0, mId);
            isLoadMore = false;
        });
        srlHierarchyList.setOnLoadMoreListener(refreshLayout -> {
            mPageNum++;
            mPresenter.loadMoreArticles(mPageNum, mId);
            isLoadMore = true;
        });
    }

    @Override
    protected void loadData() {
        super.loadData();
        mPresenter.loadArticles(0, mId);
    }


    @Override
    public void showArticles(List<Article> articleList) {
        if(!CommonUtil.isEmptyList(mArticleList)) mArticleList.clear();
        mArticleList.addAll(articleList);
        mArticlesAdapter.notifyDataSetChanged();
    }

    @Override
    public void showMoreArticles(List<Article> articleList) {
        if(isLoadMore){
            srlHierarchyList.finishLoadMore();
        }else {
            if(!CommonUtil.isEmptyList(articleList)) mArticleList.clear();
            srlHierarchyList.finishRefresh();
        }
        mArticleList.addAll(articleList);
        mArticlesAdapter.notifyDataSetChanged();
    }

    @Override
    public void topping() {
        if(rvHierarchySecondList != null) rvHierarchySecondList.smoothScrollToPosition(0);
    }

    @Override
    public void collectArticleSuccess() {
        showToast(getString(R.string.toast_collection_success));
        mArticleList.get(mArticlePosition).setCollect(true);
        mArticlesAdapter.notifyItemChanged(mArticlePosition + mArticlesAdapter.getHeaderLayoutCount());
    }

    @Override
    public void unCollectArticleSuccess() {
        showToast(getString(R.string.toast_uncollection_success));
        mArticleList.get(mArticlePosition).setCollect(false);
        mArticlesAdapter.notifyItemChanged(mArticlePosition + mArticlesAdapter.getHeaderLayoutCount());
    }

    @Override
    public void collect() {
        if (mArticle == null) return;
        if(mArticle.isCollect())
            mPresenter.unCollectArticle(mArticle.getId());
        else
            mPresenter.collectArticle(mArticle.getId());
    }

    @Override
    public void refreshCollections(List<Integer> ids) {
        for(int i = 0; i < ids.size(); i++){
            for(int j = 0; j < mArticleList.size(); j++){
                if(mArticleList.get(j).getId() == ids.get(i)){
                    mArticleList.get(j).setCollect(false);
                    mArticlesAdapter.notifyItemChanged(j + mArticlesAdapter.getHeaderLayoutCount());
                    break;
                }
            }
        }
    }

    @Override
    public void reLoad() {
        mPageNum = 0;
        mPresenter.loadArticles(0, mId);
    }

    @Override
    public void unableRefresh() {
        if (isLoadMore) srlHierarchyList.finishLoadMore(); else srlHierarchyList.finishRefresh();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode != RESULT_OK) return;
        Article article = mArticleList.get(mArticlePosition);
        switch (requestCode){
            case Constant.REQUEST_LOGIN:
                if(article.isCollect()) mPresenter.unCollectArticle(article.getId());
                else mPresenter.collectArticle(article.getId());
                break;
            case Constant.REQUEST_REFRESH_ARTICLE:
                boolean isCollect = data.getBooleanExtra(Constant.KEY_DATA_RETURN, false);
                if(article.isCollect() != isCollect){
                    article.setCollect(isCollect);
                    mArticlesAdapter.notifyItemChanged(mArticlePosition + mArticlesAdapter.getHeaderLayoutCount());
                }
                break;
            default:
                break;
        }
    }

    public static Fragment newInstance(int id){
        Bundle bundle = new Bundle();
        bundle.putInt(Constant.KEY_HIERARCHY_PAGENUM, id);
        Fragment fragment = new HierarchySecondFragment();
        fragment.setArguments(bundle);
        return fragment;
    }
}