package com.edufound.reader.presenter;

import android.content.Context;
import android.content.Intent;
import android.graphics.Outline;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.widget.Toast;

import com.edufound.reader.R;
import com.edufound.reader.adapter.SlideVideoAdapter;
import com.edufound.reader.base.BaseActivity;
import com.edufound.reader.base.BasePresenter;
import com.edufound.reader.bean.FavoritesBean;
import com.edufound.reader.bean.HttpResultBean;
import com.edufound.reader.bean.HttpResultDataListBean;
import com.edufound.reader.bean.UserRecordBean;
import com.edufound.reader.contract.RecommendFragmentContract;
import com.edufound.reader.cusview.CusToast;
import com.edufound.reader.cusview.RvListJzvdStd;
import com.edufound.reader.model.RecommendFragmentModel;
import com.edufound.reader.receiver.BackPageReceiver;
import com.edufound.reader.util.Consts;
import com.edufound.reader.util.EfunboxUtil;
import com.edufound.reader.util.MMKVEncodeKey;
import com.edufound.reader.util.MMKVUtil;
import com.edufound.reader.util.SizeUtils;
import com.edufound.reader.videoutil.OnViewPagerListener;
import com.edufound.reader.videoutil.ViewPagerLayoutManager;
import com.google.gson.reflect.TypeToken;
import com.okhttplib.HttpInfo;
import com.okhttplib.callback.Callback;
import com.orhanobut.logger.Logger;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import cn.jzvd.Jzvd;
import cn.jzvd.JzvdStd;

public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentContract.View> implements RecommendFragmentContract.Presenter {

    Context mContext;
    RecommendFragmentModel mModel;
    private ViewPagerLayoutManager mViewPagerLayoutManager;
    private int mCurrentPosition = 0;
    List<UserRecordBean> mDataList;
    SlideVideoAdapter mAdapter;
    int loadType = 0;
    int mTotalSize = 20;
    int mPageIndex = 1;
    boolean loadOver = false;


    public RecommendFragmentPresenter(Context context) {
        mModel = new RecommendFragmentModel();
        mContext = context;
        if (mDataList == null) {
            mDataList = new ArrayList<>();
        }
    }


    @Override
    public void initVideoList(RecyclerView rv, int type, int startPosition) {
        rv.setOutlineProvider(new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                outline.setRoundRect(SizeUtils.dp2px(mContext, 5),
                        0,
                        view.getWidth() - SizeUtils.dp2px(mContext, 5),
                        view.getHeight(),
                        SizeUtils.dp2px(mContext, 40));
            }
        });
        rv.setClipToOutline(true);

        loadType = type;
        if (type == 0) {
            //推荐的接口
            initVideoDate(rv, startPosition);
            getRecommendDataList();
        } else if (type == 1) {
            //关注的所有人的所有视频
            initVideoDate(rv, startPosition);
            getMyFollowAllVideo();
        } else if (type == 2) {
            //上级页面传的json
            mDataList = ((BaseActivity) mView.getActivity()).getGson().fromJson(mView.getDataJson(), new TypeToken<List<UserRecordBean>>() {
            }.getType());
            initVideoDate(rv, startPosition);
            mTotalSize = mDataList.size();
            mView.getRootView().setVisibility(View.VISIBLE);
            mView.showFirstIntoView();
            mView.getRootView().post(new Runnable() {
                @Override
                public void run() {
                    mAdapter.notifyDataSetChanged();
                }
            });
        }


    }


    public void initVideoDate(RecyclerView rv, int startPosition) {

        rv.setLayoutManager(new LinearLayoutManager(mView.getActivity()));
        rv.setNestedScrollingEnabled(false);
        mViewPagerLayoutManager = new ViewPagerLayoutManager(mView.getActivity(), OrientationHelper.VERTICAL);
        rv.setLayoutManager(mViewPagerLayoutManager);
        mAdapter = new SlideVideoAdapter(mView.getActivity(), mDataList);
        rv.setAdapter(mAdapter);
        mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
            @Override
            public void onInitComplete() {
                //自动播放第一条
                autoPlayVideo(rv);
            }

            @Override
            public void onPageRelease(boolean isNext, int position) {
                if (mCurrentPosition == position) {
                    Jzvd.releaseAllVideos();
                }
            }

            @Override
            public void onPageSelected(int position, boolean isBottom) {
//                if (mCurrentPosition == position) {
//                    Logger.e("mCurrentPosition == position..return了");
//                    return;
//                }
                ((BaseActivity) mView.getActivity()).removeFirstTipView();
                autoPlayVideo(rv);
                mCurrentPosition = position;
                if (mCurrentPosition == 0) {
                    Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show();
                } else if (mCurrentPosition == (mTotalSize - 1)) {
                    Toast.makeText(mContext, "已经是最后一个了", Toast.LENGTH_SHORT).show();
                }
//                Logger.e("mCurrentPosition:" + mCurrentPosition);
//                Logger.e("mDataList:" + mDataList.size());
                scrollToNextFunction(rv, false);
            }

            @Override
            public void onChildViewDetachedFromWindow(View view) {
                Jzvd jzvd = view.findViewById(R.id.slidevideo_video);
                if (jzvd != null && Jzvd.CURRENT_JZVD != null && jzvd.jzDataSource != null &&
                        jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.getCurrentUrl())) {
                    if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) {
                        Jzvd.releaseAllVideos();
                    }
                }
            }
        });
        if (startPosition > 0) {
            rv.scrollToPosition(startPosition);
            mCurrentPosition = startPosition;
        }
    }

    @Override
    public int getCurPlayVideoIndex() {
        return mCurrentPosition;
    }

    @Override
    public Object getCurVideoExampleId() {
        if (mDataList != null && mDataList.size() > 0) {

            return mDataList.get(mCurrentPosition).getUserRead().getExampleId();
        }
        return -1;
    }

    @Override
    public void fragmentPause(RecyclerView rv) {
        Jzvd.releaseAllVideos();
        JzvdStd.goOnPlayOnPause();
    }

    @Override
    public void fragmentResume(RecyclerView rv) {

        mView.getRootView().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (rv.getChildCount() > 0) {
                    RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video);
                    if (player == null) {
                        Logger.e("竟然是空的");
                    }
                    player.startVideoAfterPreloading();
                }
            }
        }, 800);
    }

    @Override
    public void getRecommendDataList() {
        if (mDataList != null && mDataList.size() >= mTotalSize) {
            loadOver = true;
//            Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show();
            return;
        }
        if (TextUtils.isEmpty(MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE))) {
            //如果是空的,就是没选择过年纪。然后给个默认的一年级
            //PRESCHOOL,FIRST_GRADE,SECOND_GRADE,THIRD_GRADE,FOURTH_GRADE
//            MMKVUtil.getInstance().encode(MMKVEncodeKey.USER_GRADE, "FIRST_GRADE");
        }
        String grade = MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE);
        if (TextUtils.isEmpty(grade)) {
            grade = EfunboxUtil.getEnumByCNGrade("一年级");
        }
        if (Consts.getmConstsUserBean() == null) {
            grade = EfunboxUtil.getEnumByCNGrade("一年级");
        }
        mModel.getRecommendList(mView.getActivity(), grade, mPageIndex, new Callback() {
            @Override
            public void onSuccess(HttpInfo info) throws IOException {
                HttpResultBean<HttpResultDataListBean<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<UserRecordBean>>>() {
                }.getType());
                mAdapter.addMored(bean.getData().getList());
//                    mDataList.addAll(bean.getData().getList());
                mTotalSize = Integer.valueOf(bean.getData().getTotalSize());
                mView.getRootView().post(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                        mPageIndex++;
                        mView.getRootView().setVisibility(View.VISIBLE);
                        mView.showFirstIntoView();
                    }


                });
            }

            @Override
            public void onFailure(HttpInfo info) throws IOException {
                CusToast.getInstance(mView.getActivity()).show(info.getRetDetail(), 3000);
            }
        });
    }

    @Override
    public void doFavorites(UserRecordBean.UserRead userRead) {
        Map<String, String> map = new HashMap<>();
        map.put("targetCode", userRead.getId());
        String json = ((BaseActivity) mView.getActivity()).getGson().toJson(map);
        mModel.doFavorites(mView.getActivity(), json, new Callback() {
            @Override
            public void onSuccess(HttpInfo info) throws IOException {
                HttpResultBean<FavoritesBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<FavoritesBean>>() {
                }.getType());
                Intent intent = new Intent();
                if (bean.getData().getStatus().equals("DEL")) {
                    mDataList.get(mCurrentPosition).setFavorites(false);
                    mDataList.get(mCurrentPosition).setFavoritesBean(null);
                    mView.setFavorites(false);
                    intent.setAction(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM);
                } else if (bean.getData().getStatus().equals("NORMAL")) {
                    mDataList.get(mCurrentPosition).setFavorites(true);
                    mDataList.get(mCurrentPosition).setFavoritesBean(null);
                    mView.setFavorites(true);
                    intent.setAction(BackPageReceiver.BACK_HOME_ADD_VIDEO_ITEM);
                }
                intent.putExtra("position", String.valueOf(mCurrentPosition));
                mContext.sendBroadcast(intent);
            }

            @Override
            public void onFailure(HttpInfo info) throws IOException {
                Logger.e("收藏/取消收藏接口失败:" + info.getRetDetail());
            }
        });
    }

    @Override
    public void doLike(UserRecordBean.UserRead userRead) {
        mModel.doLick(mView.getActivity(), userRead.getId(), new Callback() {
            @Override
            public void onSuccess(HttpInfo info) throws IOException {
                HttpResultBean<String> bean = info.getRetDetail(new TypeToken<HttpResultBean<String>>() {
                }.getType());
                mView.setLikes(bean.getData());
            }

            @Override
            public void onFailure(HttpInfo info) throws IOException {
                Logger.e("failure---info.getRetDetail:" + info.getRetDetail());
            }
        });
    }

    @Override
    public void activityDestory() {

        mDataList = null;
        mAdapter = null;
        Jzvd.releaseAllVideos();
        Jzvd.backPress();
    }

    @Override
    public void getRecordInfoById(String id) {

        if (mView == null) {
            return;
        }
        mModel.getRecordInfoById(mView.getActivity(), id, new Callback() {
            @Override
            public void onSuccess(HttpInfo info) throws IOException {
                HttpResultBean<UserRecordBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserRecordBean>>() {
                }.getType());
                Logger.e("mCurrentPosition:" + mCurrentPosition);
                mDataList.set(mCurrentPosition, bean.getData());
                mView.getRootView().post(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }

            @Override
            public void onFailure(HttpInfo info) throws IOException {
                Logger.e("获取单独的失敗了:" + info.getRetDetail());
            }
        });

    }

    @Override
    public void getMyFollowAllVideo() {
        if (mDataList != null && mDataList.size() >= mTotalSize) {
            loadOver = true;
//            Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show();
            return;
        }
        mModel.getMyFollowAllVideo(mView.getActivity(), mPageIndex, new Callback() {
            @Override
            public void onSuccess(HttpInfo info) throws IOException {
                HttpResultBean<HttpResultDataListBean<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<UserRecordBean>>>() {
                }.getType());
                mAdapter.addMored(bean.getData().getList());
//                    mDataList.addAll(bean.getData().getList());
                mTotalSize = Integer.valueOf(bean.getData().getTotalSize());
                mView.getRootView().post(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                        mPageIndex++;
                        mView.getRootView().setVisibility(View.VISIBLE);
                        mView.showFirstIntoView();
                    }


                });
            }

            @Override
            public void onFailure(HttpInfo info) throws IOException {

            }
        });
    }

    private void autoPlayVideo(RecyclerView rv) {
        if (rv == null || rv.getChildAt(0) == null) {
            return;
        }
        //获取当前显示的View 的数据
        int childCount = rv.getChildCount();
        //获取最后一具 Item 对应的View
        View childAt = rv.getChildAt(childCount - 1);
        //获取当前军舰中显示的最后一个 Item 的位置  Postion
        int childLayoutPosition = rv.getChildLayoutPosition(childAt);
        mView.setTopStatus(mDataList.get(childLayoutPosition));
        RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video);
        if (player != null) {
            if (player.state == Jzvd.STATE_PLAYING) {
                //正在播放

            } else {
                player.startVideoAfterPreloading();
                player.setVideoCallBack(new RvListJzvdStd.VideoCallBack() {
                    @Override
                    public void onComplete() {
                        if (mCurrentPosition >= mTotalSize - 1) {
                            Toast.makeText(mView.getActivity(), "全部播放完成", Toast.LENGTH_SHORT).show();
//                            mView.getActivity().finish();
                            return;
                        }
                        scrollToNextFunction(rv, true);
                    }

                    @Override
                    public void onError(int what, int extra) {

                    }

                    @Override
                    public void onInfo(int what, int extra) {

                    }
                });
            }

        }
    }


    public void scrollToNextFunction(RecyclerView rv, boolean needScroll) {
        //获取当前显示的View 的数据
        int childCount = rv.getChildCount();
        //获取最后一具 Item 对应的View
        View childAt = rv.getChildAt(childCount - 1);
        //获取当前军舰中显示的最后一个 Item 的位置  Postion
        int childLayoutPosition = rv.getChildLayoutPosition(childAt);
        //如果不是最后一个就向下滑动
        if (childLayoutPosition < rv.getAdapter().getItemCount() - 1) {
            if (needScroll) {
                rv.smoothScrollToPosition(childLayoutPosition + 1);
            }
        } else {
//            Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
//            CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show();

            Logger.e("loadOver:" + loadOver);
            if (loadOver) {
                return;
            }

            switch (loadType) {
                case 0:
                    getRecommendDataList();
                    break;
                case 1:
                    getMyFollowAllVideo();
                    break;
                case 2:
                    break;
            }
        }
    }

    public void scrollToUpFunction(RecyclerView rv) {
        //获取当前显示的View 的数据
        Logger.e("mCurrentPosition:" + mCurrentPosition);
        if (mCurrentPosition > 0) {
            rv.smoothScrollToPosition(mCurrentPosition - 1);
            mCurrentPosition = mCurrentPosition - 1;
        } else if (mCurrentPosition == 0) {
            Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show();
        }


    }


}