package org.song.demo.danmaku;

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.ViewGroup;

import org.song.demo.R;
import org.song.videoplayer.IVideoPlayer;
import org.song.videoplayer.PlayListener;
import org.song.videoplayer.QSVideoView;


import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.ui.widget.DanmakuView;

/**
 * Created by song
 * Contact github.com/tohodog
 * Date 2018/5/8
 * 弹幕关联播放器以及控制
 */

public class DanmakuControl implements PlayListener {

    public static DanmakuControl bind(QSVideoView qsVideoView, final QSDanmakuParser parser, DanmakuContext danmakuContext) {
        return new DanmakuControl(qsVideoView, parser, danmakuContext);
    }


    private DanmakuView danmakuView;
    private QSDanmakuParser parser;
    private QSVideoView qsVideoView;
    private DanmakuContext danmakuContext;
    private Context context;
    private boolean isShow = true;


    //需要播放前调用!!
    private DanmakuControl(QSVideoView qsVideoView, final QSDanmakuParser parser, DanmakuContext danmakuContext) {
        this.parser = parser;
        this.qsVideoView = qsVideoView;
        this.context = qsVideoView.getContext();
        this.danmakuContext = danmakuContext;
        parser.setTextSize(context.getResources().getDisplayMetrics().density);

        danmakuView = new DanmakuView(context);
        ViewGroup videoview = qsVideoView.findViewById(R.id.qs_videoview);
        videoview.addView(danmakuView, 1, new ViewGroup.LayoutParams(-1, -1));

        //danmakuView.showFPS(true);
        danmakuView.enableDanmakuDrawingCache(true);

        danmakuView.setCallback(new master.flame.danmaku.controller.DrawHandler.Callback() {
            @Override
            public void updateTimer(DanmakuTimer timer) {
            }

            @Override
            public void drawingFinished() {

            }

            @Override
            public void danmakuShown(BaseDanmaku danmaku) {
//                    Log.d("DFM", "danmakuShown(): text=" + danmaku.text);
            }

            @Override
            public void prepared() {
                Log.e("danmakuView", "prepared");
                if (DanmakuControl.this.qsVideoView.isPlaying()) {
                    danmakuView.start(DanmakuControl.this.qsVideoView.getPosition());
                    danmakuView.resume();
                    Log.e("danmakuView", "prepared " + DanmakuControl.this.qsVideoView.getPosition());
                }
            }
        });

        qsVideoView.addPlayListener(this);

    }

    public boolean isShow() {
        return isShow;
    }

    public void hide() {
        danmakuView.hide();
        isShow = false;
    }

    public void show() {
        danmakuView.show();
        isShow = true;
    }

    public void add(BaseDanmaku item) {
        danmakuView.addDanmaku(item);
    }

    @Override
    public void onStatus(int status) {
    }


    @Override
    public void onMode(int mode) {
        if (qsVideoView.isWindowFloatMode()) {
            danmakuView.hide();
        } else if (isShow)
            danmakuView.show();
    }


    @Override
    public void onEvent(int what, Integer... extra) {
        if (what != IVideoPlayer.EVENT_PREPARE_START && !danmakuView.isPrepared())
            return;
        switch (what) {
            case IVideoPlayer.EVENT_PREPARE_START:
                danmakuView.prepare(parser, danmakuContext);
                danmakuView.enableDanmakuDrawingCache(true);
                break;
            case IVideoPlayer.EVENT_PREPARE_END:
                if (danmakuView.isPrepared())
                    danmakuView.start(0);
                break;
            case IVideoPlayer.EVENT_PLAY:
                handler.removeCallbacks(run);
                danmakuView.resume();
                Log.e("danmakuView", "EVENT_PLAY");
                break;
            case IVideoPlayer.EVENT_PAUSE:
                danmakuView.pause();
                Log.e("danmakuView", "EVENT_PAUSE");
                break;
            case IVideoPlayer.EVENT_ERROR:
                danmakuView.clear();
                break;
            case IVideoPlayer.EVENT_COMPLETION:
                danmakuView.pause();
                break;
            case IVideoPlayer.EVENT_RELEASE:
                danmakuView.release();
                Log.e("danmakuView", "EVENT_RELEASE");
                break;

            case IVideoPlayer.EVENT_BUFFERING_START:
                danmakuView.pause();
                Log.e("danmakuView", "EVENT_BUFFERING_START");
                break;
            case IVideoPlayer.EVENT_SEEK_TO:
                break;
            case IVideoPlayer.EVENT_SEEK_COMPLETION:
            case IVideoPlayer.EVENT_BUFFERING_END:
                danmakuView.seekTo(Long.valueOf(extra[0]));//seek后会播放
                if (!qsVideoView.isPlaying())//danmakuView.pause();seek后马上调用pause 没有用
                    rundelayed(run, 168);
                Log.e("danmakuView", "EVENT_SEEK_COMPLETION");
                break;
        }
    }

    private Handler handler = new Handler();
    private Runnable run = new Runnable() {
        @Override
        public void run() {
            danmakuView.pause();
        }
    };

    private void rundelayed(Runnable run, int delayed) {
        this.run = run;
        handler.postDelayed(run, delayed);
    }
}