package com.yidianling.course.widget

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.view.View
import android.widget.ImageView
import com.alibaba.android.arouter.launcher.ARouter
import com.dou361.ijkplayer.widget.PlayStateParams
import com.dou361.ijkplayer.widget.PlayerView
import com.lzf.easyfloat.EasyFloat
import com.lzf.easyfloat.enums.ShowPattern
import com.lzf.easyfloat.interfaces.OnInvokeView
import com.ydl.media.audio.utils.PlayProgressUtil
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
import com.yidianling.course.R
import com.yidianling.course.coursePlay.CoursePlayActivity
import com.yidianling.course.flutterPlugin.CourseSendPlugin
import com.yidianling.course.uitls.VideoProgressUtil
import java.util.*

/**
 * @author jiucheng
 * @描述:视频悬浮窗
 * @Copyright Copyright (c) 2018
 * @Company 壹点灵
 * @date 2019/11/19
 */
object VideoFloatHelper {
    private const val courseTag = "course_video_play"
    var courseVideoUrl = ""
    var courseId = ""
    var isCanClick = true
    var isCurrentVideoPlaying = true
    //视频播放器view
    @SuppressLint("StaticFieldLeak")
    private var videoView: PlayerView? = null
    private var timer: Timer? = null
    var defaultShowPattern = ShowPattern.CURRENT_ACTIVITY

    fun setVideoInfo(
        courseId: String,
        courseVideoUrl: String,
        isCanClick: Boolean
    ): VideoFloatHelper {
        this.courseId = courseId
        this.courseVideoUrl = courseVideoUrl
        this.isCanClick = isCanClick
        return this
    }


    fun showVideoFloat(activity: Activity) {
        val x = RxDeviceTool.getScreenWidth(activity) - RxImageTool.dp2px(220f)
        val y = RxDeviceTool.getScreenHeight(activity) * 3 / 4

        EasyFloat.with(activity)
            .setTag(courseTag)
            .setShowPattern(defaultShowPattern)
            .setLocation(x, y)
            .setAppFloatAnimator(null)
            .setFilter(CoursePlayActivity::class.java)
            .setLayout(R.layout.course_float_video_view, OnInvokeView {
                it.findViewById<ImageView>(R.id.iv_video_close).setOnClickListener {
                    dismissFloat(activity)
                }
                val videoFullScreen = it.findViewById<ImageView>(R.id.iv_video_full_screen)
                if (isCanClick) {
                    videoFullScreen.visibility = View.VISIBLE
                } else {
                    videoFullScreen.visibility = View.INVISIBLE
                }
                videoFullScreen.setOnClickListener {
                    if (isCanClick) {
                        startCoursePlayActivity(activity, 1, 1, courseVideoUrl, true)
                    }
                }

                val videoLayout = it.findViewById<ImageView>(R.id.app_video_box)

                try {
                    initVideoPlayer(activity, videoLayout)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            })
            .show()
    }

    private fun initVideoPlayer(activity: Activity, view: View) {
        val url = courseVideoUrl.replace("https", "http")
        val hisTime = PlayProgressUtil.getProgress(activity, url)
        videoView = PlayerView(activity, view)
            .setScaleType(PlayStateParams.fitparent)
            .hideAllUI()
            .setNetWorkTypeTie(false)
            .setAutoReConnect(true, 3)
            .forbidTouch(true)
            .setOnInfoListener { _, what, _ ->
                if (what == PlayStateParams.STATE_COMPLETED) {
                    isCurrentVideoPlaying = false
                    PlayProgressUtil.saveProgress(activity, url, 0)
                } else {
                    isCurrentVideoPlaying = true
                }

                true
            }
            .setPlaySource(url)
            .startPlay()
            .seekTo(hisTime)

        view.setOnClickListener {
            if (isCanClick) {
                startCoursePlayActivity(activity, 1, 0, courseVideoUrl, true)
            }
        }

        startTimer(url, activity)
    }


    private fun startTimer(url: String, activity: Activity) {
        if (timer == null) {
            timer = Timer()
        }
        timer?.schedule(object : TimerTask() {
            override fun run() {
                if (isCurrentVideoPlaying) {
                    var time = videoView?.currentPosition ?: 0
                    if (time < 3000) return
                    PlayProgressUtil.saveProgress(activity, url, time)
                }
            }
        }, 1000, 1000)
    }


    private fun startCoursePlayActivity(
        context: Context?,
        from: Int,
        fullScreen: Int,
        coursePlayUrl: String,
        isFromFloatView: Boolean
    ) {
        ARouter.getInstance()
            .build("/course/play")
            .withInt("course_id", courseId.toInt())
            .withInt("course_type", 1)
            .withString("coursePlayUrl", coursePlayUrl)
            .withInt("from", from)
            .withBoolean("isFromFloatView", isFromFloatView)
            .withInt("fullScreen", fullScreen)
            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            .navigation()
    }


    fun dismissFloat(activity: Activity) {
        CourseSendPlugin.sendMsg(false)
        EasyFloat.dismissAppFloat(activity, courseTag)
        if (videoView != null) {
            videoView!!.stopPlay()
            videoView = null
        }
        if (timer != null) {
            timer!!.cancel()
        }
        timer = null
    }
}