package middleware

import (
	"game-driver/internal/schema"
	"game-driver/leaf"
	"game-driver/pkg/audio"
	"game-driver/pkg/utils"
	"github.com/gopxl/beep/v2/speaker"
	"go.uber.org/zap"
	"sync"
)

// PlayBgm 播放背景音乐
func PlayBgm() leaf.HandlerFunc {
	return func(c *leaf.Context) {
		pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey)

		bgm, err := utils.LinkAudio(pm.BGM)
		if err != nil {
			zap.S().Errorln("背景音乐数据解析异常:", err)
		}
		if bgm != nil {
			zap.S().Infoln("背景音乐解析成功")
			// 等待组
			var wait sync.WaitGroup
			defer wait.Wait()

			// 结束信号通道
			a := make(chan struct{})
			// 发送结束信号
			defer close(a)

			wait.Add(1)
			go func() {
				defer wait.Done()

				zap.S().Infoln("开始播放背景音乐")
				defer zap.S().Infoln("结束背景音乐播放")

				ctrl, closer, e := audio.PlayBgmMP3(bgm)
				defer closer()
				if e != nil {
					zap.S().Errorln("播放背景音乐异常:", e)
					return
				}

				select {
				case <-a:
					{
						speaker.Lock()
						ctrl.Streamer = nil
						speaker.Unlock()
						return
					}
				}
			}()
		} else {
			zap.S().Infoln("未解析到背景音乐")
		}

		c.Next()
	}
}
