package cc.bitky.bitkyshop.fragment.homefragment;

import com.google.gson.Gson;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;

import com.cjj.MaterialRefreshLayout;
import com.cjj.MaterialRefreshListener;
import com.daimajia.slider.library.Animations.DescriptionAnimation;
import com.daimajia.slider.library.Indicators.PagerIndicator;
import com.daimajia.slider.library.SliderLayout;
import com.daimajia.slider.library.SliderTypes.BaseSliderView;
import com.daimajia.slider.library.SliderTypes.TextSliderView;
import com.socks.library.KLog;

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

import cc.bitky.bitkyshop.CommodityDetailActivity;
import cc.bitky.bitkyshop.MainActivity;
import cc.bitky.bitkyshop.R;
import cc.bitky.bitkyshop.bean.Commodity;
import cc.bitky.bitkyshop.fragment.homefragment.HomeFragmentPresenter.RefreshType;
import cc.bitky.bitkyshop.fragment.userfragment.searchActivity.SearchActivity;
import cc.bitky.bitkyshop.globalDeploy.GreenDaoKyHelper;
import cc.bitky.bitkyshop.utils.KyLog;
import cc.bitky.bitkyshop.utils.ToastUtil;
import cc.bitky.bitkyshop.utils.recyclerview.KyBaseRecyclerAdapter;
import cc.bitky.bitkyshop.utils.recyclerview.KyBaseViewHolder;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;

public class HomeFragment extends Fragment
    implements IHomeFragment, BaseSliderView.OnSliderClickListener {
    Context mContext;
    RecyclerView recyclerView;
    private MaterialRefreshLayout swipeRefreshLayout;
    private KyBaseRecyclerAdapter recyclerAdapter;
    private SliderLayout mSliderLayout;
    private List<TextSliderView> mTextSliderViews;
    final String TAG = KyLog.getTAG("HomeFragment");
    private HomeFragmentPresenter presenter;
    private View view;
    private ToastUtil toastUtil;
    public static MainActivity _mainActivity;

    public static void setMainActivity(MainActivity mainActivity) {
        _mainActivity = mainActivity;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        toastUtil = new ToastUtil(mContext);
        this.presenter = new HomeFragmentPresenter(mContext, this);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        view = inflater.inflate(R.layout.fragment_home, container, false);

        ImageButton btnSearch = (ImageButton) view.findViewById(R.id.homefragment_btnSearch);
        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, SearchActivity.class);
                startActivity(intent);
            }
        });

        Button buttonToCategoryFragment =
            (Button) view.findViewById(R.id.homefragment_buttonToCategoryFragment);
        Button buttonToHotFragment =
            (Button) view.findViewById(R.id.homefragment_buttonToHotFragment);
        buttonToHotFragment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (_mainActivity != null) _mainActivity.fragmentTabHost.setCurrentTab(1);
            }
        });
        buttonToCategoryFragment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (_mainActivity != null) _mainActivity.fragmentTabHost.setCurrentTab(2);
            }
        });
        initSliderLayout();
        initSlider();
        initSwipeRefreshLayout();
        initRecyclerView();
        return view;
    }

    private void initRecyclerView() {
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_home_fragment);
        if (recyclerAdapter == null) {
            initRecyclerViewData(new ArrayList<Commodity>());
        }
        recyclerView.setAdapter(recyclerAdapter);
        recyclerView.setLayoutManager(
            new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        presenter.refreshRecyclerAdapterData(RefreshType.Refresh);
    }

    /**
     * 初始化SliderLayout
     */
    private void initSliderLayout() {
        mSliderLayout = (SliderLayout) view.findViewById(R.id.slider);
        PagerIndicator indicator = (PagerIndicator) view.findViewById(R.id.custom_indicator);
        mSliderLayout.setCustomIndicator(indicator);
        mSliderLayout.setCustomAnimation(new DescriptionAnimation());
        mSliderLayout.setPresetTransformer(SliderLayout.Transformer.RotateUp);
        mSliderLayout.setDuration(3000);
    }

    /**
     * 初始化slider中的内容
     */
    private void initSlider() {

        if (mTextSliderViews == null) {
            mSliderLayout.addSlider(buildTextSlider(null, "欢迎使用", 0));
            getBmobSliderData();
        } else {
            mSliderLayout.removeAllSliders();
            for (TextSliderView textSliderView : mTextSliderViews) {
                mSliderLayout.addSlider(textSliderView);
            }
        }
    }

    private void initSwipeRefreshLayout() {
        swipeRefreshLayout =
            (MaterialRefreshLayout) view.findViewById(R.id.swiperefreshlayout_home_fragment);
        swipeRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
            @Override
            public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
                presenter.refreshRecyclerAdapterData(RefreshType.Refresh);
            }

            @Override
            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
                super.onRefreshLoadMore(materialRefreshLayout);
                presenter.refreshRecyclerAdapterData(RefreshType.LoadMore);
            }
        });
    }

    /**
     * 广告栏Slider数据初始化
     */
    private void getBmobSliderData() {
        BmobQuery<Commodity> bmobQuery = new BmobQuery<>();
        bmobQuery.addWhereEqualTo("AD", "true").setLimit(5).findObjects(new FindListener<Commodity>() {
            @Override
            public void done(List<Commodity> list, BmobException e) {
                if (e != null) {
                    KLog.d(TAG, "异常内容:" + e.getMessage());
                } else if (list.size() > 0) {
                    KLog.d(TAG, "list.size():" + list.size());
                    mTextSliderViews = new ArrayList<>();
                    for (Commodity commodity : list) {
                        mTextSliderViews.add(
                            buildTextSlider(commodity.getCoverPhotoUrl(), commodity.getName(), 0));
                    }
                    KLog.d(TAG, "mTextSliderViews.size():" + mTextSliderViews.size());

                    if (mSliderLayout != null) initSlider();
                }
            }
        });
    }

    private TextSliderView buildTextSlider(String url, String description, int key) {
        TextSliderView textSliderView = new TextSliderView(mContext);
        if (url == null) {
            textSliderView.image(R.mipmap.sliderlayout_default);
        } else {
            textSliderView.image(url);
        }
        textSliderView.description(description);
        Bundle bundle = new Bundle();
        bundle.putInt("msg", key);
        textSliderView.bundle(bundle);
        textSliderView.setOnSliderClickListener(this);
        return textSliderView;
    }

    @Override
    public void onSliderClick(BaseSliderView slider) {
        switch (slider.getBundle().getInt("msg", -1)) {
            case 0:
                KLog.d(TAG, "case 0");
                break;
            case 1:
                KLog.d(TAG, "case 1");
                break;
            case 2:
                KLog.d(TAG, "case 2");
                break;
        }
    }

    @Override
    public void initRecyclerViewData(List<Commodity> list) {
        recyclerAdapter =
            new KyBaseRecyclerAdapter<Commodity>(list, R.layout.recycler_homefragment_show) {

                @Override
                public void setDataToViewHolder(final Commodity dataItem, KyBaseViewHolder holder) {
                    holder.getSimpleDraweeView(R.id.recycler_homeshow_draweeview)
                        .setImageURI(Uri.parse(dataItem.getCoverPhotoUrl()));
                    holder.getTextView(R.id.recycler_homeshow_text_title).setText(dataItem.getName());
                    holder.getTextView(R.id.recycler_homeshow_text_price)
                        .setText(dataItem.getPrice().toString() + " 元");
                    holder.getButton(R.id.recycler_homeshow_btn_addCart)
                        .setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                GreenDaoKyHelper.insertOrIncrease(dataItem);
                                toastUtil.show("已添加到购物车");
                                KLog.json(new Gson().toJson(GreenDaoKyHelper.queryAll()));
                            }
                        });
                }
            };
        recyclerAdapter.setOnClickListener(
            new KyBaseRecyclerAdapter.KyRecyclerViewItemOnClickListener<Commodity>() {
                @Override
                public void Onclick(View v, int adapterPosition, Commodity data) {
                    Bundle bundle = new Bundle();
                    bundle.putSerializable("commodity", data);
                    Intent intent = new Intent(mContext, CommodityDetailActivity.class);
                    intent.putExtra("bundle", bundle);
                    startActivity(intent);
                }
            });
    }

    @Override
    public void refleshRecyclerViewData(List<Commodity> list, RefreshType type) {
        switch (type) {
            case Refresh:
                swipeRefreshLayout.finishRefresh();
                if (recyclerAdapter != null) recyclerAdapter.reloadData(list);
                recyclerView.scrollToPosition(0);
                break;

            case LoadMore:
                swipeRefreshLayout.finishRefreshLoadMore();
                if (recyclerAdapter != null) recyclerAdapter.loadMoreData(list);
                break;
        }
    }

    @Override
    public void CanNotRefreshData(RefreshType type) {
        toastUtil.show("没有更多的商品了!");
        swipeRefreshLayout.finishRefreshLoadMore();
    }
}