package com.yidianling.muse.helper

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.PixelFormat
import android.graphics.Point
import android.os.Bundle
import android.text.TextUtils
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import androidx.core.view.ViewCompat
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer
import com.ydl.media.view.PlayTypeEnum
import com.yidianling.common.tools.RxImageTool


class MeditationPlayWindowController {

    companion object {
        @SuppressLint("StaticFieldLeak")
        private var mPlayerFloatView: MeditationFloatWindow? = null

        //已添加悬浮窗页面全路径名
        private var showingPageName: String? = null
        private var wm: WindowManager? = null
        var isCanClick = true

        var playingType = PlayTypeEnum.PLAY_TYPE_NONE
        var playTempData = hashMapOf<String, String>()

        /**
         * 如果有音频正在播放则显示
         */
        fun showIfPlaying(context: Context) {
            if (MediaPlayerManager.getInstance(context)?.isPlaying() == true) {
                show(context)
                mPlayerFloatView?.updatePlayState()
            } else {
                hide()
            }
        }

        /**
         * 显示悬浮控件
         */
        fun show(
            context: Context,
            playTypeEnum: PlayTypeEnum = PlayTypeEnum.PLAY_TYPE_NONE,
            playData: HashMap<String, String> = hashMapOf<String, String>()
        ) {

            playingType = playTypeEnum
            if (playData.size > 0) {
                this.playTempData.putAll(playData)
            }

            if (mPlayerFloatView == null) {
                mPlayerFloatView = MeditationFloatWindow(context)
                mPlayerFloatView?.addFloatClickListener(object :
                    MeditationFloatWindow.FloatViewPlayListener {
                    override fun onPauseClick() {

                    }

                    override fun onStartClick() {

                    }

                    override fun onPlayFinish() {

                    }

                })
            }

            if (showingPageName != context::class.qualifiedName) {
                mPlayerFloatView?.resetWm(context)
                addFloatToWm(context)
            }

            mPlayerFloatView?.resetView()

            mPlayerFloatView?.visibility = View.VISIBLE
            mPlayerFloatView?.setPlayingState()
        }

        fun hide() {
            mPlayerFloatView?.visibility = View.GONE
        }

        fun addClickListener(listener: MeditationFloatWindow.FloatViewPlayListener) {
            mPlayerFloatView?.addFloatClickListener(listener)
        }

        fun removeClickListener(listener: MeditationFloatWindow.FloatViewPlayListener) {
            mPlayerFloatView?.removeFloatClickListener(listener)
        }

        fun isShow(context: Context): Boolean {
            return !TextUtils.isEmpty(showingPageName) && showingPageName == context::class.qualifiedName && mPlayerFloatView?.visibility == View.VISIBLE
        }

        fun removeView(context: Context) {
            if (TextUtils.isEmpty(showingPageName) || showingPageName != context::class.qualifiedName) {
                return
            }
            mPlayerFloatView?.visibility = View.GONE
            wm?.removeViewImmediate(mPlayerFloatView)
            showingPageName = ""
            wm = null
        }

        fun onDestroy() {
            if (mPlayerFloatView != null) {
                if (!TextUtils.isEmpty(showingPageName)) {
                    wm?.removeViewImmediate(mPlayerFloatView)
                    showingPageName = ""
                }

                mPlayerFloatView?.onDestroy()
                mPlayerFloatView?.removeAllViews()

            }
        }

        fun setPlayingState(context: Context) {
            show(context)
            mPlayerFloatView?.setPlayingState()
        }

        fun updatePlayState() {
            mPlayerFloatView?.updatePlayState()
        }

        private fun addFloatToWm(context: Context) {
            if (wm != null && !TextUtils.isEmpty(showingPageName)) {
                if (ViewCompat.isAttachedToWindow(mPlayerFloatView!!)) {
//                    if (context is Activity && !(context.isFinishing)){
//                      wm?.removeViewImmediate(mPlayerFloatView)
//                    }
                    wm?.removeViewImmediate(mPlayerFloatView)
                }
                wm = null
            }
            //获取WindowManager
            wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
            //设置LayoutParams(全局变量)相关参数
            val wmParams = mPlayerFloatView?.wmParams
            wmParams?.type = WindowManager.LayoutParams.TYPE_APPLICATION   //设置window type
            wmParams?.format = PixelFormat.RGBA_8888   //设置图片格式,效果为背景透明
            //设置Window flag
            wmParams?.flags =
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            wmParams?.gravity = Gravity.LEFT or Gravity.TOP   //调整悬浮窗口至左上角
            //以屏幕左上角为原点,设置x、y初始值
            val size = Point()
            wm?.defaultDisplay?.getSize(size)
            wmParams?.x = 0
            wmParams?.y = size.y * 5 / 6
            //设置悬浮窗口长宽数据
            wmParams?.width = WindowManager.LayoutParams.MATCH_PARENT
            wmParams?.height = RxImageTool.dp2px(56f)
            //显示myFloatView图像
            wm?.addView(mPlayerFloatView, wmParams)
            showingPageName = context::class.qualifiedName!!
        }

        /**
         * 打开播放中的页面详情
         */
        fun startPlayingActivity(context: Context?, fullScreen: Int = 0) {
            if (playingType == PlayTypeEnum.PLAY_TYPE_FM) {
                //FM播放页
                startFMPlayActivity(context)
            } else if (playingType == PlayTypeEnum.PLAY_TYPE_COURSE) {
                var url = AudioPlayer.get().playMusic?.path
                //课程播放页
                startCoursePlayActivity(context, 1, fullScreen, url, true)
            }
        }

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

        fun startFMPlayActivity(context: Context?) {
            val bundle = Bundle()
            bundle.putInt("id", playTempData["fmId"]?.toInt() ?: 0)
            ARouter.getInstance().build("/fm/detail")
                .withBundle("bundle", bundle)
                .navigation()
        }

        /**
         * 获取FM播放Id
         */
        fun getFmId(): Int {
            return playTempData["fmId"]?.toInt() ?: 0
        }


    }


}