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

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.Toolbar;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;

import com.blankj.utilcode.util.BarUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.SizeUtils;
import com.blankj.utilcode.util.ToastUtils;


import org.yczbj.ycrefreshviewlib.YCRefreshView;
import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
import org.yczbj.ycvideoplayerlib.VideoPlayerUtils;

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

import butterknife.Bind;
import cn.ycbjie.ycaudioplayer.R;
import cn.ycbjie.ycaudioplayer.base.BaseAppHelper;
import cn.ycbjie.ycaudioplayer.constant.BaseConfig;
import cn.ycbjie.ycaudioplayer.base.view.BaseFragment;
import cn.ycbjie.ycaudioplayer.inter.listener.OnPlayerEventListener;
import cn.ycbjie.ycaudioplayer.ui.detail.view.activity.DetailVideoActivity;
import cn.ycbjie.ycaudioplayer.ui.detail.view.adapter.DetailAudioAdapter;
import cn.ycbjie.ycaudioplayer.ui.main.ui.activity.MainActivity;
import cn.ycbjie.ycaudioplayer.model.bean.AudioBean;
import cn.ycbjie.ycaudioplayer.utils.logger.AppLogUtils;


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

    @Bind(R.id.ll_title_menu)
    FrameLayout flTitleMenu;
    @Bind(R.id.toolbar_title)
    TextView toolbarTitle;
    @Bind(R.id.toolbar)
    Toolbar toolbar;
    @Bind(R.id.tv_current_time)
    TextView tvCurrentTime;
    @Bind(R.id.sb_progress)
    SeekBar sbProgress;
    @Bind(R.id.tv_total_time)
    TextView tvTotalTime;
    @Bind(R.id.iv_prev)
    ImageView ivPrev;
    @Bind(R.id.iv_play)
    ImageView ivPlay;
    @Bind(R.id.iv_next)
    ImageView ivNext;
    @Bind(R.id.recyclerView)
    YCRefreshView recyclerView;

    private Activity activity;
    private DetailAudioAdapter adapter;
    /**
     * 是否拖进度,默认是false
     */
    private boolean isDraggingProgress = false;
    private int mLastProgress;
    private static final String TAG = "DetailAudioFragment";
    private String type;
    private AudioBean audioBean;

    public static DetailAudioFragment newInstance(String type) {
        Bundle bundle = new Bundle();
        bundle.putString(TAG, type);
        DetailAudioFragment newsArticleView = new DetailAudioFragment();
        newsArticleView.setArguments(bundle);
        return newsArticleView;
    }

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

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

    /**
     * 返回监听
     */
    private void onBackPressed() {
        getActivity().onBackPressed();
        flTitleMenu.setEnabled(false);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                flTitleMenu.setEnabled(true);
            }
        }, 300);
    }


    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if(activity!=null){
            if(hidden){
                //当该页面隐藏时
                if(activity instanceof DetailVideoActivity){
                    AppLogUtils.e("视频播放"+"DetailVideoActivity-----------");
                }else if(activity instanceof MainActivity){
                    AppLogUtils.e("视频播放"+"MainActivity------");
                }
            }else {
                //当页面展现时
                if(activity instanceof MainActivity){
                    AppLogUtils.e("视频播放"+"MainActivity");
                }else if(activity instanceof DetailVideoActivity){
                    AppLogUtils.e("视频播放"+"DetailVideoActivity");
                }
            }
        }
        AppLogUtils.e("DetailAudioFragment"+"-----onHiddenChanged-----"+hidden);
    }


    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        AppLogUtils.e("DetailAudioFragment"+"-----onViewCreated-----");
    }

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


    @Override
    public void initView(View view) {
        type = getArguments().getString(TAG);
        initToolBar();
        initYCRefreshView();
    }


    private void initToolBar() {
        int statusBarHeight = BarUtils.getStatusBarHeight();
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, SizeUtils.dp2px(50));
        params.topMargin = statusBarHeight;
        toolbar.setLayoutParams(params);
    }


    @Override
    public void initListener() {
        flTitleMenu.setOnClickListener(this);
        ivPlay.setOnClickListener(this);
        ivPrev.setOnClickListener(this);
        ivNext.setOnClickListener(this);
        initSeekBarListener();
    }


    @Override
    public void initData() {
        List<String> data = new ArrayList<>();
        for(int a=0 ; a<3 ; a++){
            data.add("假数据"+a);
        }
        adapter.addAll(data);
        adapter.notifyDataSetChanged();
        setViewData(BaseAppHelper.get().getMusicList().get(0));
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ll_title_menu:
                onBackPressed();
                break;
            case R.id.iv_play:
                play();
                break;
            case R.id.iv_next:
                next();
                break;
            case R.id.iv_prev:
                prev();
                break;
            default:
                break;
        }
    }


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


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

            @Override
            public void onBindView(View headerView) {

            }
        });
    }


    @SuppressLint("SetTextI18n")
    public void setViewData(AudioBean audioBean) {
        if (audioBean == null || toolbarTitle==null) {
            return;
        }
        this.audioBean = audioBean;
        toolbarTitle.setText(audioBean.getTitle()==null?"音频标题":audioBean.getTitle());
        sbProgress.setSecondaryProgress(0);
        sbProgress.setMax((int) audioBean.getDuration());
        sbProgress.setProgress((int) getPlayService().getCurrentPosition());
        tvCurrentTime.setText("00:00");
        tvTotalTime.setText(VideoPlayerUtils.formatTime(audioBean.getDuration()));
        if (getPlayService().isPlaying() || getPlayService().isPreparing()) {
            ivPlay.setSelected(true);
        } else {
            ivPlay.setSelected(false);
        }
    }


    private void initSeekBarListener() {
        SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (seekBar == sbProgress) {
                    if (Math.abs(progress - mLastProgress) >= DateUtils.SECOND_IN_MILLIS) {
                        tvCurrentTime.setText(VideoPlayerUtils.formatTime(progress));
                        if(audioBean!=null){
                            tvTotalTime.setText(VideoPlayerUtils.formatTime(audioBean.getDuration() - progress));
                        }
                        mLastProgress = progress;
                    }
                }
            }

            /**
             * 通知用户已启动触摸手势,开始触摸时调用
             * @param seekBar               seekBar
             */
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                if (seekBar == sbProgress) {
                    isDraggingProgress = true;
                }
            }


            /**
             * 通知用户已结束触摸手势,触摸结束时调用
             * @param seekBar               seekBar
             */
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                if (seekBar == sbProgress) {
                    isDraggingProgress = false;
                    //如果是正在播放,或者暂停,那么直接拖动进度
                    if (getPlayService().isPlaying() || getPlayService().isPausing()) {
                        //获取进度
                        int progress = seekBar.getProgress();
                        //直接移动进度
                        getPlayService().seekTo(progress);
                    } else {
                        //其他情况,直接设置进度为0
                        seekBar.setProgress(0);
                    }
                }
            }
        };
        sbProgress.setOnSeekBarChangeListener(onSeekBarChangeListener);
    }


    private void prev() {
        if (getPlayService() != null) {
            if(getPlayService().isHavePre()){
                ToastUtils.showShort(R.string.state_prev);
                getPlayService().prev();
            }else {
                ToastUtils.showShort("没有上一曲");
            }
        }
    }


    private void next() {
        if (getPlayService() != null) {
            if(getPlayService().isHaveNext()){
                ToastUtils.showShort(R.string.state_next);
                getPlayService().next();
            }else {
                ToastUtils.showShort("没有下一曲");
            }
        }
    }


    private void play() {
        if (getPlayService() != null) {
            getPlayService().playPause();
        }
    }


    /**
     * 切换歌曲
     * 主要是切换歌曲的时候需要及时刷新界面信息
     */
    @Override
    public void onChange(AudioBean music) {
        setViewData(music);
    }

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


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


    /**
     * 更新进度
     * 主要是播放音乐或者拖动进度条时,需要更新进度
     */
    @Override
    public void onUpdateProgress(int progress) {
        AppLogUtils.e("setOnPlayEventListener---progress---"+progress);
        if(progress>0){
            //如果没有拖动进度,则开始更新进度条进度
            if (!isDraggingProgress) {
                sbProgress.setProgress(progress);
            }
        }
    }


    @Override
    public void onBufferingUpdate(int percent) {
        AppLogUtils.e("setOnPlayEventListener---percent---"+percent);
        if(sbProgress.getMax()>0 && percent>0){
            AppLogUtils.e("setOnPlayEventListener---percent---"+ sbProgress.getMax() + "-----" +percent);
            sbProgress.setSecondaryProgress(sbProgress.getMax() * 100 / percent);
        }
    }

    @Override
    public void onTimer(long remain) {

    }


}