package cn.ycbjie.ycaudioplayer.ui.detail.view.activity;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.blankj.utilcode.util.BarUtils;
import com.blankj.utilcode.util.FragmentUtils;
import com.blankj.utilcode.util.ScreenUtils;
import com.blankj.utilcode.util.SizeUtils;
import com.pedaily.yc.ycdialoglib.dialogFragment.BottomDialogFragment;
import com.pedaily.yc.ycdialoglib.toast.ToastUtils;

import org.yczbj.ycrefreshviewlib.YCRefreshView;
import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
import org.yczbj.ycvideoplayerlib.ConstantKeys;
import org.yczbj.ycvideoplayerlib.VideoPlayer;
import org.yczbj.ycvideoplayerlib.VideoPlayerController;
import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
import org.yczbj.ycvideoplayerlib.VideoPlayerUtils;
import org.yczbj.ycvideoplayerlib.listener.OnPlayOrPauseListener;
import org.yczbj.ycvideoplayerlib.listener.OnVideoBackListener;
import org.yczbj.ycvideoplayerlib.listener.OnVideoControlListener;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import butterknife.Bind;
import cn.ycbjie.ycaudioplayer.R;
import cn.ycbjie.ycaudioplayer.constant.Constant;
import cn.ycbjie.ycaudioplayer.base.view.BaseActivity;
import cn.ycbjie.ycaudioplayer.base.BaseAppHelper;
import cn.ycbjie.ycaudioplayer.base.app.BaseApplication;
import cn.ycbjie.ycaudioplayer.constant.BaseConfig;
import cn.ycbjie.ycaudioplayer.inter.listener.OnPlayerEventListener;
import cn.ycbjie.ycaudioplayer.model.bean.AudioBean;
import cn.ycbjie.ycaudioplayer.ui.detail.contract.DetailVideoContract;
import cn.ycbjie.ycaudioplayer.ui.detail.model.DialogListBean;
import cn.ycbjie.ycaudioplayer.ui.detail.presenter.DetailVideoPresenter;
import cn.ycbjie.ycaudioplayer.ui.detail.view.adapter.DetailVideoAdapter;
import cn.ycbjie.ycaudioplayer.ui.detail.view.adapter.DialogListAdapter;
import cn.ycbjie.ycaudioplayer.ui.detail.view.adapter.MovieCatalogueAdapter;
import cn.ycbjie.ycaudioplayer.ui.detail.view.fragment.DetailAudioFragment;
import cn.ycbjie.ycaudioplayer.utils.file.SDUtils;
import cn.ycbjie.ycaudioplayer.utils.logger.AppLogUtils;
import cn.ycbjie.ycthreadpoollib.PoolThread;


/**
 * <pre>
 *     @author yangchong
 *     blog  : www.pedaily.cn
 *     time  : 2018/03/22
 *     desc  : 视频播放详情页面
 *     revise:
 * </pre>
 */
public class DetailVideoActivity extends BaseActivity implements DetailVideoContract.View, View.OnClickListener {


    @Bind(R.id.rl_video_detail)
    RelativeLayout rlVideoDetail;
    @Bind(R.id.video_player)
    VideoPlayer videoPlayer;
    @Bind(R.id.recyclerView)
    YCRefreshView recyclerView;
    @Bind(R.id.tv_title_left)
    TextView tvTitleLeft;
    @Bind(R.id.view_left)
    View viewLeft;
    @Bind(R.id.tv_title_right)
    TextView tvTitleRight;
    @Bind(R.id.view_right)
    View viewRight;
    @Bind(R.id.ll_left)
    LinearLayout llLeft;
    @Bind(R.id.ll_right)
    LinearLayout llRight;

    private boolean isPlayFragmentShow = false;
    private DetailAudioFragment mDetailAudioFragment;
    private DetailVideoAdapter adapter;

    private DetailVideoContract.Presenter presenter = new DetailVideoPresenter(this);
    private LinearLayoutManager linearLayoutManager;

    @Override
    protected void onStop() {
        super.onStop();
        VideoPlayerManager.instance().releaseVideoPlayer();
    }

    @Override
    protected void onResume() {
        super.onResume();
        initPlayServiceListener();
    }


    @Override
    public void onBackPressed() {
        if (mDetailAudioFragment != null && isPlayFragmentShow) {
            hidePlayingFragment();
            return;
        }
        if (VideoPlayerManager.instance().onBackPressed()) {
            return;
        }
        getPlayService().setOnPlayEventListener(null);
        super.onBackPressed();
    }


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter.subscribe();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.unSubscribe();
    }

    @Override
    public int getContentView() {
        return R.layout.activity_detail;
    }

    @Override
    public void initView() {
        if (!checkServiceAlive()) {
            return;
        }
        initVideoPlayerSize();
        initVideoPlayer();
        initIndicator();
        initYCRefreshView();
    }

    @Override
    public void initListener() {
        llLeft.setOnClickListener(this);
        llRight.setOnClickListener(this);
        initPlayServiceListener();
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch(newState) {
                    case RecyclerView.SCROLL_STATE_IDLE:
                        AppLogUtils.e("滑动距离"+"recyclerView已经停止滚动");
                        break;
                    case RecyclerView.SCROLL_STATE_DRAGGING:
                        AppLogUtils.e("滑动距离"+"recyclerView正在被拖拽");
                        break;
                    case RecyclerView.SCROLL_STATE_SETTLING:
                        AppLogUtils.e("滑动距离"+"recyclerView正在依靠惯性滚动");
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                float y = recyclerView.getY();
                int scrollY = recyclerView.getScrollY();
                AppLogUtils.e("滑动距离"+dy+"----"+y+"-------"+scrollY);
                //获取第一个可见的位置
                int position = linearLayoutManager.findFirstVisibleItemPosition();
                //int scrollYDistance = getScrollYDistance(position);
                //LogUtils.e("滑动距离111----"+position+"====="+scrollYDistance);
                //判断是否滑到了顶部
                boolean isTopScroll = recyclerView.canScrollVertically(-1);
                AppLogUtils.e("滑动距离、、、"+isTopScroll);

                if(position<1){
                    setViewIndicator(true);
                }else {
                    setViewIndicator(false);
                }
            }
        });
    }


    public int getScrollYDistance(int position) {
        //获取第一个可见view,并且获取高度
        View firstChildView = linearLayoutManager.findViewByPosition(position);
        int itemHeight = firstChildView.getHeight();
        return (position) * itemHeight - firstChildView.getTop();
    }


    @Override
    public void initData() {
        presenter.getData();
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ll_left:
                setViewIndicator(true);
                break;
            case R.id.ll_right:
                setViewIndicator(false);
                break;
            default:
                break;
        }
    }


    /**
     * 设置视频宽高比是16:9
     */
    private void initVideoPlayerSize() {
        int screenWidth = ScreenUtils.getScreenWidth();
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.height = (int) (9 * screenWidth / 16.0f);
        videoPlayer.setLayoutParams(params);
    }


    private void initVideoPlayer() {
        videoPlayer.release();
        //设置播放类型
        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
        //是否从上一次的位置继续播放
        videoPlayer.continueFromLastPosition(true);
        //设置播放速度
        videoPlayer.setSpeed(1.0f);
        //网络视频地址
        videoPlayer.setUp(Constant.DEVIE_URL, null);
        //设置视频地址和请求头部
        //创建视频控制器
        VideoPlayerController controller = new VideoPlayerController(this);
        controller.setTopVisibility(true);
        controller.setOnVideoBackListener(new OnVideoBackListener() {
            @Override
            public void onBackClick() {
                onBackPressed();
            }
        });
        controller.setOnPlayOrPauseListener(new OnPlayOrPauseListener() {
            @Override
            public void onPlayOrPauseClick(boolean isPlaying) {
                if (isPlaying) {
                    ToastUtils.showRoundRectToast( "暂停视频");
                } else {
                    ToastUtils.showRoundRectToast("开始播放");
                    if (getPlayService().isPlaying() || getPlayService().isPreparing()) {
                        getPlayService().pause();
                        videoPlayer.seekTo(BaseConfig.INSTANCE.getPosition());
                    }
                }
            }
        });
        controller.setOnVideoControlListener(new OnVideoControlListener() {
            @Override
            public void onVideoControlClick(int type) {
                switch (type) {
                    case ConstantKeys.VideoControl.DOWNLOAD:
                        showDownloadDialog();
                        break;
                    case ConstantKeys.VideoControl.AUDIO:
                        showPlayingFragment();
                        break;
                    case ConstantKeys.VideoControl.SHARE:
                        ToastUtils.showRoundRectToast("分享内容");
                        break;
                    default:
                        break;
                }
            }
        });
        //设置视频控制器
        videoPlayer.setController(controller);
    }


    /**
     * 初始化指示器
     */
    private void initIndicator() {
        tvTitleLeft.setText("课程简介");
        tvTitleRight.setText("课程目录课程目录");
        int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        tvTitleLeft.measure(spec,spec);
        tvTitleRight.measure(spec,spec);
        int widthLeft = tvTitleLeft.getMeasuredWidth();
        int widthRight = tvTitleRight.getMeasuredWidth();
        AppLogUtils.e("width"+tvTitleLeft.getWidth() + "---"+tvTitleRight.getWidth()
                + "---"+tvTitleLeft.getMeasuredWidth());
        AppLogUtils.e("width"+"----------"+widthLeft+"-----"+widthRight);
        LinearLayout.LayoutParams paramsLeft = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, SizeUtils.dp2px(2));
        paramsLeft.width = widthLeft;
        viewLeft.setLayoutParams(paramsLeft);
        LinearLayout.LayoutParams paramsRight = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, SizeUtils.dp2px(2));
        paramsRight.width = widthRight;
        viewRight.setLayoutParams(paramsRight);
        setViewIndicator(true);
    }


    private void setViewIndicator(boolean view){
        if(view){
            viewLeft.setVisibility(View.VISIBLE);
            viewRight.setVisibility(View.INVISIBLE);
            tvTitleLeft.setTextColor(getResources().getColor(R.color.color_3));
            tvTitleRight.setTextColor(getResources().getColor(R.color.blackText));
        }else {
            viewLeft.setVisibility(View.INVISIBLE);
            viewRight.setVisibility(View.VISIBLE);
            tvTitleLeft.setTextColor(getResources().getColor(R.color.blackText));
            tvTitleRight.setTextColor(getResources().getColor(R.color.color_3));
        }
    }


    private void initYCRefreshView() {
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
                SizeUtils.dp2px(1), Color.parseColor("#f5f5f7"));
        recyclerView.addItemDecoration(line);
        adapter = new DetailVideoAdapter(this);
        recyclerView.setAdapter(adapter);
        recyclerView.setRefreshing(false);
        recyclerView.scrollTo(0,0);
        recyclerView.scrollBy(0,0);
        addHeader();
    }


    private void addHeader() {
        adapter.removeAllHeader();
        initContentTitleHeader();
        initCourseCatalogueTitle();
        initCatalogueListView();
        initCommentTitleView();
        PoolThread executor = BaseApplication.getInstance().getExecutor();
        executor.setDelay(1, TimeUnit.SECONDS);
        executor.execute(new Runnable() {
            @Override
            public void run() {

            }
        });
    }


    private void initContentTitleHeader() {
        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
            @Override
            public View onCreateView(ViewGroup parent) {
                View viewHeader = LayoutInflater.from(DetailVideoActivity.this).inflate(R.layout.head_audio_title, parent, false);
                return viewHeader;
            }

            @Override
            public void onBindView(View headerView) {

            }
        });
    }


    private void initCourseCatalogueTitle() {
        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
            @Override
            public View onCreateView(ViewGroup parent) {
                return LayoutInflater.from(DetailVideoActivity.this)
                        .inflate(R.layout.header_video_header_catalogue, parent, false);
            }

            @Override
            public void onBindView(View headerView) {

            }
        });
    }


    private void initCatalogueListView() {
        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
            @Override
            public View onCreateView(ViewGroup parent) {
                RecyclerView recyclerView = new RecyclerView(parent.getContext()) {
                    /**
                     * 为了不打扰RecyclerView的滑动操作,可以这样处理
                     */
                    @SuppressLint("ClickableViewAccessibility")
                    @Override
                    public boolean onTouchEvent(MotionEvent event) {
                        super.onTouchEvent(event);
                        return true;
                    }
                };
                RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                layoutParams.setMargins(0, 0, 0, 0);
                recyclerView.setLayoutParams(layoutParams);
                final MovieCatalogueAdapter narrowAdapter;
                recyclerView.setAdapter(narrowAdapter = new MovieCatalogueAdapter(parent.getContext()));
                recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(), LinearLayoutManager.VERTICAL, false));
                recyclerView.addItemDecoration(new RecycleViewItemLine(parent.getContext(), SizeUtils.px2dp(1)));
                List<String> data = new ArrayList<>();
                for (int a = 0; a < 3; a++) {
                    data.add("假数据" + a);
                }
                narrowAdapter.addAll(data);
                return recyclerView;
            }

            @Override
            public void onBindView(View headerView) {
                //这里的处理别忘了
                ((ViewGroup) headerView).requestDisallowInterceptTouchEvent(true);
            }
        });
    }


    private void initCommentTitleView() {
        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
            @Override
            public View onCreateView(ViewGroup parent) {
                return LayoutInflater.from(DetailVideoActivity.this)
                        .inflate(R.layout.head_audio_title, parent, false);
            }

            @Override
            public void onBindView(View headerView) {

            }
        });
    }


    /**
     * 展示页面
     */
    private void showPlayingFragment() {
        if (isPlayFragmentShow) {
            return;
        }

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.anim.fragment_slide_up, 0);
        if (mDetailAudioFragment == null) {
            mDetailAudioFragment = DetailAudioFragment.newInstance("Video");
            ft.add(android.R.id.content, mDetailAudioFragment);
        } else {
            ft.show(mDetailAudioFragment);
        }
        ft.commitAllowingStateLoss();
        isPlayFragmentShow = true;
        AppLogUtils.e("fragment数量+DetailVideoActivity" + FragmentUtils.getAllFragments(getSupportFragmentManager()).size());

        if (videoPlayer.isPlaying() || videoPlayer.isBufferingPlaying()) {
            videoPlayer.pause();
        }

        //当视频正在播放,准备播放时,点击音视频切换按钮,先暂停视频,然后记录视频播放位置,show音频播放页面
        //当视频已经暂停,播放错误,播放停止时,点击音视频切换按钮,直接记录视频播放位置,show音频播放页面
        BaseConfig.INSTANCE.setPosition(videoPlayer.getCurrentPosition());
        AppLogUtils.e("播放位置----视频页开始显示音频--" + videoPlayer.getCurrentPosition());

        if (mDetailAudioFragment != null) {
            mDetailAudioFragment.setViewData(BaseAppHelper.get().getMusicList().get(0));
            if (getPlayService().isDefault() || getPlayService().isPausing()) {
                getPlayService().seekTo((int) BaseConfig.INSTANCE.getPosition());
                getPlayService().playPause();
            }
        }
    }


    /**
     * 隐藏页面
     */
    private void hidePlayingFragment() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(0, R.anim.fragment_slide_down);
        ft.hide(mDetailAudioFragment);
        ft.commitAllowingStateLoss();
        isPlayFragmentShow = false;
    }


    /**
     * 弹出下载弹窗
     */
    private void showDownloadDialog() {
        final List<DialogListBean> list = new ArrayList<>();
        for (int a = 0; a < Constant.VideoPlayerList.length; a++) {
            DialogListBean dialogListBean = new DialogListBean();
            dialogListBean.setVideo(Constant.VideoPlayerList[a]);
            dialogListBean.setTitle("下载的内容");
            list.add(dialogListBean);
        }
        final BottomDialogFragment dialog = new BottomDialogFragment();
        dialog.setFragmentManager(getSupportFragmentManager());
        dialog.setViewListener(new BottomDialogFragment.ViewListener() {
            @Override
            public void bindView(View v) {
                RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
                ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
                ImageView ivDownload = (ImageView) v.findViewById(R.id.iv_download);
                TextView tvDataSize = (TextView) v.findViewById(R.id.tv_data_size);
                tvDataSize.setText(getDataText(list));

                recyclerView.setLayoutManager(new LinearLayoutManager(DetailVideoActivity.this));
                DialogListAdapter mAdapter = new DialogListAdapter(DetailVideoActivity.this, list);
                recyclerView.setAdapter(mAdapter);
                final RecycleViewItemLine line = new RecycleViewItemLine(
                        DetailVideoActivity.this, LinearLayout.HORIZONTAL,
                        SizeUtils.dp2px(1),
                        DetailVideoActivity.this.getResources().getColor(R.color.grayLine));
                recyclerView.addItemDecoration(line);
                mAdapter.setOnItemClickListener(new DialogListAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        ToastUtils.showRoundRectToast("被点击呢" + position);
                    }
                });
                View.OnClickListener listener = new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        switch (v.getId()) {
                            case R.id.iv_cancel:
                                if (VideoPlayerUtils.isActivityLiving(DetailVideoActivity.this)) {
                                    dialog.dismissDialogFragment();
                                }
                                break;
                            case R.id.iv_download:

                                break;
                            default:
                                break;
                        }
                    }
                };
                ivCancel.setOnClickListener(listener);
                ivDownload.setOnClickListener(listener);
            }
        });
        dialog.setLayoutRes(R.layout.dialog_download_video);
        dialog.setDimAmount(0.5f);
        dialog.setTag("BottomDialog");
        dialog.setCancelOutside(true);
        //这个高度可以自己设置,十分灵活
        dialog.setHeight(ScreenUtils.getScreenHeight()-videoPlayer.getHeight()- BarUtils.getStatusBarHeight());
        dialog.show();
    }

    private String getDataText(List<DialogListBean> list) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(list.size());
        stringBuffer.append("个/");
        String size = Formatter.formatShortFileSize(this, 10003200);
        stringBuffer.append(size);
        stringBuffer.append("   ");
        stringBuffer.append("可用空间");
        stringBuffer.append(Formatter.formatFileSize(this, SDUtils.getAvailableSize()));
        return stringBuffer.toString();
    }

    @Override
    public void setDataView(List<String> data) {
        adapter.addAll(data);
        adapter.notifyDataSetChanged();
    }

    /**
     * 初始化服务播放音频播放进度监听器
     * 这个是要是通过监听即时更新主页面的底部控制器视图
     * 同时还要同步播放详情页面mPlayFragment的视图
     */
    public void initPlayServiceListener() {
        if (getPlayService() == null) {
            return;
        }
        getPlayService().setOnPlayEventListener(new OnPlayerEventListener() {
            /**
             * 切换歌曲
             * 主要是切换歌曲的时候需要及时刷新界面信息
             */
            @Override
            public void onChange(AudioBean music) {
                if (mDetailAudioFragment != null && mDetailAudioFragment.isAdded()) {
                    mDetailAudioFragment.onChange(music);
                }
            }

            /**
             * 继续播放
             * 主要是切换歌曲的时候需要及时刷新界面信息,比如播放暂停按钮
             */
            @Override
            public void onPlayerStart() {
                if (mDetailAudioFragment != null && mDetailAudioFragment.isAdded()) {
                    mDetailAudioFragment.onPlayerStart();
                }
            }

            /**
             * 暂停播放
             * 主要是切换歌曲的时候需要及时刷新界面信息,比如播放暂停按钮
             */
            @Override
            public void onPlayerPause() {
                if (mDetailAudioFragment != null && mDetailAudioFragment.isAdded()) {
                    mDetailAudioFragment.onPlayerPause();
                }
            }

            /**
             * 更新进度
             * 主要是播放音乐或者拖动进度条时,需要更新进度
             */
            @Override
            public void onUpdateProgress(int progress) {
                if (mDetailAudioFragment != null && mDetailAudioFragment.isAdded()) {
                    mDetailAudioFragment.onUpdateProgress(progress);
                    BaseConfig.INSTANCE.setPosition(progress);
                }
            }

            @Override
            public void onBufferingUpdate(int percent) {
                if (mDetailAudioFragment != null && mDetailAudioFragment.isAdded()) {
                    mDetailAudioFragment.onBufferingUpdate(percent);
                }
            }

            @Override
            public void onTimer(long remain) {

            }
        });
    }


}