package com.ys.yoosir.zzshow.mvp.ui.fragments;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.ys.yoosir.zzshow.R;
import com.ys.yoosir.zzshow.common.LoadDataType;
import com.ys.yoosir.zzshow.di.component.AppComponent;
import com.ys.yoosir.zzshow.di.component.DaggerVideoListComponent;
import com.ys.yoosir.zzshow.di.module.VideoListModule;
import com.ys.yoosir.zzshow.mvp.model.entity.videos.VideoData;
import com.ys.yoosir.zzshow.mvp.presenter.VideoListPresenterImpl;
import com.ys.yoosir.zzshow.mvp.presenter.interfaces.VideoListPresenter;
import com.ys.yoosir.zzshow.mvp.ui.adapters.VideoListAdapter;
import com.ys.yoosir.zzshow.mvp.ui.adapters.listener.MyRecyclerListener;
import com.ys.yoosir.zzshow.mvp.ui.fragments.base.BaseFragment;
import com.ys.yoosir.zzshow.mvp.view.VideoListView;
import com.ys.yoosir.zzshow.utils.mediavideo.IjkVideoView;
import com.ys.yoosir.zzshow.widget.video.VideoPlayView;

import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link VideoListFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class VideoListFragment extends BaseFragment<VideoListPresenterImpl> implements VideoListView,MyRecyclerListener  {

    private static final String TAG = VideoListFragment.class.getSimpleName();

    private static final String VIDEO_CHANNEL_TYPE = "VIDEO_CHANNEL_TYPE";

    // TODO: Rename and change types of parameters
    private String mVideoType;

    @BindView(R.id.progress_bar)
    ProgressBar mProgressBar;

    @BindView(R.id.video_list)
    RecyclerView mVideoListView;

    @BindView(R.id.swipe_refresh_layout)
    SwipeRefreshLayout mSwipeRefreshLayout;

    @BindView(R.id.empty_view)
    TextView mEmptyView;

    @OnClick(R.id.empty_view)
    public void onClick(View v){
        switch (v.getId()){
            case R.id.empty_view:
                mPresenter.loadData();
                break;
            default:
                break;
        }
    }

    private boolean isLoading = false;
    private boolean hasMore = false;

    public VideoListFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     */
    public static VideoListFragment newInstance(String videoChannelType) {
        Log.d(TAG,"newInstance - videoChannelType = "+ videoChannelType);
        VideoListFragment fragment = new VideoListFragment();
        Bundle args = new Bundle();
        args.putString(VIDEO_CHANNEL_TYPE, videoChannelType);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Log.d(TAG,"setUserVisibleHint mVideoType="+mVideoType + "-- isVisibleToUser ="+isVisibleToUser);
        if(isVisibleToUser && mPresenter != null){
            mPresenter.onCreate();
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mVideoType = getArguments().getString(VIDEO_CHANNEL_TYPE);
        }
        Log.d(TAG,"onCreate mVideoType="+mVideoType);
    }

    @Override
    protected void setupFragmentComponent(AppComponent appComponent) {
        DaggerVideoListComponent.builder()
                .appComponent(appComponent)
                .videoListModule(new VideoListModule(this))
                .build()
                .inject(this);
    }

    @Override
    public int getLayoutId() {
        Log.d(TAG,"getLayoutId mVideoType="+mVideoType);
        return R.layout.fragment_video_list;
    }

    @Override
    public void initViews(View view) {
        Log.d(TAG,"initViews mVideoType="+mVideoType);
        initSwipeRefreshLayout();
        initRecyclerView();
    }

    @Override
    protected void initData() {
        mPresenter.setVideoType(mVideoType);
        if(getUserVisibleHint()) {
            mPresenter.onCreate();
        }
    }

    private void initSwipeRefreshLayout() {
        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light,android.R.color.holo_orange_light,android.R.color.holo_green_light,android.R.color.holo_blue_light);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //TODO Stop Video
                //有视频在播放 或 暂停中
                if(mLastPosition != -1){
                    if(mVideoPlayView.getVideoStatus() == IjkVideoView.STATE_PLAYING
                            || mVideoPlayView.getVideoStatus() == IjkVideoView.STATE_PAUSED){
                        //停止
                        mVideoPlayView.stop();
                        mVideoPlayView.release();
                    }

                    //并从Item View 中移除 video view
                    ViewGroup lastParent = (ViewGroup) mVideoPlayView.getParent();
                    if(lastParent != null){
                        lastParent.removeAllViews();
                        //找到 RecyclerView Item View
                        ViewGroup lastGrandParent = (ViewGroup) lastParent.getParent();
                        lastGrandParent.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
                    }
                    mLastPosition = -1;
                }
                //TODO refresh data
                mPresenter.refreshData();
            }
        });
    }

    private VideoPlayView       mVideoPlayView;
    private LinearLayoutManager mLayoutManager;
    private VideoListAdapter    mVideoListAdapter;
    private int mLastPosition = -1;

    private void initRecyclerView() {
        mLayoutManager = new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);
        mVideoListView.setLayoutManager(mLayoutManager);
        mVideoListView.setHasFixedSize(true);
        mVideoListAdapter = new VideoListAdapter(null);
        mVideoListView.setAdapter(mVideoListAdapter);
        initActions();
    }

    private void initActions() {
        mVideoListView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

                int lastVisibleItemPosition = ((LinearLayoutManager)layoutManager)
                        .findLastVisibleItemPosition();
                int visibleItemCount = layoutManager.getChildCount();
                int totalItemCount = layoutManager.getItemCount();

                if(!isLoading && visibleItemCount > 0 && newState == RecyclerView.SCROLL_STATE_IDLE
                        && lastVisibleItemPosition >= totalItemCount - 1){
                    //TODO load more % show footer
                    isLoading = true;
                    if(mVideoListAdapter != null) {
                        mVideoListAdapter.showFooter();
                    }
                    mPresenter.loadMoreData();
//                    mVideoListView.scrollToPosition(mVideoListAdapter.getItemCount() - 1);
                }
            }
        });

        mVideoListAdapter.setOnItemClickListener(new MyRecyclerListener() {
            @Override
            public void OnItemClickListener(View view, int position) {
                if(mVideoPlayView == null) return;

                //有视频在播放 或 暂停中
                if(position != mLastPosition && mLastPosition != -1){
                    if(mVideoPlayView.getVideoStatus() == IjkVideoView.STATE_PLAYING
                            || mVideoPlayView.getVideoStatus() == IjkVideoView.STATE_PAUSED){
                        //停止
                        mVideoPlayView.stop();
                        mVideoPlayView.release();
                    }

                    //并从Item View 中移除 video view
                    ViewGroup lastParent = (ViewGroup) mVideoPlayView.getParent();
                    if(lastParent != null){
                        lastParent.removeAllViews();
                        //找到 RecyclerView Item View
                        ViewGroup lastGrandParent = (ViewGroup) lastParent.getParent();
                        lastGrandParent.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
                    }
                }

                //设置 当前要播放视频 的View
                view.findViewById(R.id.video_cover_layout).setVisibility(View.GONE);
                //add VideoPlayView
                FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.item_layout_video);
                frameLayout.removeAllViews();
                frameLayout.addView(mVideoPlayView);
                //播放视频
                List<VideoData> videoList = mVideoListAdapter.getList();
                String videoUrl = videoList.get(position).getMp4_url();
                mVideoPlayView.start(videoUrl);
                mLastPosition = position;
            }
        });

        mVideoListView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
            @Override
            public void onChildViewAttachedToWindow(View view) {
                if(mVideoPlayView == null) return;

                //当前被添加的 childView 的位置下标
                int position = mVideoListView.getChildAdapterPosition(view);
                //显示视频的封面View
//                view.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
                //判断此 childView 是否是当前正在操作的Item
                if(position == mLastPosition){
                    //是,添加 VideoView播放
                    FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.item_layout_video);
                    frameLayout.removeAllViews();
                    if(mVideoPlayView != null &&
                            (mVideoPlayView.isPlay() || mVideoPlayView.VideoStatus() == IjkVideoView.STATE_PAUSED)){
                        // VideoView 正在播放或暂停, 隐藏视频封面图
                        view.findViewById(R.id.video_cover_layout).setVisibility(View.GONE);
                    }

                    if(mVideoPlayView.getParent() != null){
                        ((ViewGroup)mVideoPlayView.getParent()).removeAllViews();
                    }

                    if(mVideoPlayView.VideoStatus() == IjkVideoView.STATE_PAUSED){
                        mVideoPlayView.setShowController(true);
                    }else if(mVideoPlayView.VideoStatus() == IjkVideoView.STATE_PLAYING){
                        mVideoPlayView.setShowController(true);
                    }
                    frameLayout.addView(mVideoPlayView);
                }
            }

            @Override
            public void onChildViewDetachedFromWindow(View view) {
                if(mVideoPlayView == null) return;
                int position = mVideoListView.getChildAdapterPosition(view);
                if(position == mLastPosition){
                    FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.item_layout_video);
                    frameLayout.removeAllViews();
                    mLastPosition = -1;
                    mVideoPlayView.stop();
                    mVideoPlayView.release();
                    view.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
                }
            }
        });
    }

    public void setVideoPlayView(VideoPlayView videoPlayView){
        mVideoPlayView = videoPlayView;
    }

    public void updateOrientation(){
        if (mLastPosition <= mLayoutManager.findLastVisibleItemPosition()
                && mLastPosition >= mLayoutManager.findFirstVisibleItemPosition()) {
            View view = mVideoListView.findViewHolderForAdapterPosition(mLastPosition).itemView;
            FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.item_layout_video);
            frameLayout.removeAllViews();
            if(mVideoPlayView.getVideoStatus() == IjkVideoView.STATE_IDLE){
                view.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
            }else {
                frameLayout.addView(mVideoPlayView);
                mVideoPlayView.setShowController(true);
                mVideoPlayView.setControllerVisible();
            }
        }
    }

    public void scrollToTop(){
        mVideoListView.getLayoutManager().scrollToPosition(0);
    }

    /**
     *  改变 List item view
     * @param parent 此 item view
     */
    public void onCompletionListener(ViewGroup parent){
        //显示封面
        parent.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
        //重置标识
        mLastPosition = -1;
    }

    /**
     * 离开此Fragment 或 不可见 时
     */
    public void onDetachFromWindow(){
        if(mVideoPlayView != null){
            ViewGroup parent = (ViewGroup) mVideoPlayView.getParent();
            if(parent != null){
                parent.removeAllViews();
                if (mLastPosition <= mLayoutManager.findLastVisibleItemPosition()
                        && mLastPosition >= mLayoutManager.findFirstVisibleItemPosition()) {
                    View view = mVideoListView.findViewHolderForAdapterPosition(mLastPosition).itemView;
                    FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.item_layout_video);
                    frameLayout.removeAllViews();
                    view.findViewById(R.id.video_cover_layout).setVisibility(View.VISIBLE);
                }
            }
            mVideoPlayView.stop();
            mVideoPlayView.release();
        }
        mLastPosition = -1;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void setVideoList(List<VideoData> videoDataList, int loadType) {
        switch (loadType){
            case LoadDataType.TYPE_FIRST_LOAD:
                mEmptyView.setVisibility(View.GONE);
                mSwipeRefreshLayout.setVisibility(View.VISIBLE);
                mVideoListAdapter.setList(videoDataList);
                mVideoListAdapter.notifyDataSetChanged();
                break;
            case LoadDataType.TYPE_REFRESH:
                mSwipeRefreshLayout.setRefreshing(false);
                mVideoListAdapter.setList(videoDataList);
                mVideoListAdapter.notifyDataSetChanged();
                break;
            case LoadDataType.TYPE_LOAD_MORE:
                isLoading = false;
                mVideoListAdapter.hideFooter();
                mVideoListAdapter.addMore(videoDataList);
                break;
            default:
                break;
        }
    }

    @Override
    public void updateErrorView(int loadType) {
        switch (loadType){
            case LoadDataType.TYPE_FIRST_LOAD:
                mSwipeRefreshLayout.setVisibility(View.GONE);
                mEmptyView.setVisibility(View.VISIBLE);
                break;
            case LoadDataType.TYPE_REFRESH:
                mSwipeRefreshLayout.setRefreshing(false);
                mSwipeRefreshLayout.setVisibility(View.GONE);
                mEmptyView.setVisibility(View.VISIBLE);
                break;
            case LoadDataType.TYPE_LOAD_MORE:
                isLoading = false;
                mVideoListAdapter.hideFooter();
                mVideoListAdapter.notifyDataSetChanged();
                break;
            default:
                break;
        }
    }

    @Override
    public void showProgress() {
        mProgressBar.setVisibility(View.VISIBLE);
        isLoading = true;
    }

    @Override
    public void hideProgress() {
        mProgressBar.setVisibility(View.GONE);
        isLoading = false;
    }

    @Override
    public void showMsg(String message) {
        Toast.makeText(getContext(),message,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void OnItemClickListener(View view, int position) {

    }

}