using ET;
using ET.Client;
using ET.EventType;
using System.Text.RegularExpressions;
using UnityEngine;

[Event(SceneType.Client)]
public class PlayBGMHandler : BEvent<PlayBgm>
{
    protected override async ETTask OnEvent(PlayBgm args)
    {
        if (args.Play)
        {
            SoundManager.Instance.PlayBgm(args.Bgm).Coroutine();
        }
        else
        {
            SoundManager.Instance.StopBgm();
        }
        await ETTask.CompletedTask;
    }
}

public class SoundManager : Singleton<SoundManager>, ISingletonAwake
{
    private AudioSource mMusicBgAudioSource = null;
    private AudioSource mSoundAudioSource = null;
    public bool BGMute
    {
        get { return mMusicBgAudioSource.mute; }
        set { mMusicBgAudioSource.mute = value; }
    }
    public float BGVolume
    {
        get { return mMusicBgAudioSource.volume; }
        set { mMusicBgAudioSource.volume = value; }
    }

    public bool MusicMute
    {
        get { return mSoundAudioSource.mute; }
        set { mSoundAudioSource.mute = value; }
    }
    public float MusicVolume
    {
        get { return mSoundAudioSource.volume; }
        set { mSoundAudioSource.volume = value; }
    }
    public void Awake()
    {
        Log.Debug("初始化SoundManager管理");
        var globalObj = GameObject.Find("Global");
        GameObject bgMusicObj = new GameObject("BGMusicObj");
        bgMusicObj.transform.parent = globalObj.transform;
        mMusicBgAudioSource = bgMusicObj.AddComponent<AudioSource>();
        mMusicBgAudioSource.loop = true;
        mMusicBgAudioSource.volume = 1f;
        mMusicBgAudioSource.playOnAwake = false;
        var mute = GameSetting.Instance.GetBool(GameSetting.MusicSets.Mute_BG, GameSetting.BGMusicMute);
        mMusicBgAudioSource.mute = mute;

        GameObject soundMusicObj = new GameObject("SoundMusicObj");
        soundMusicObj.transform.parent = globalObj.transform;
        mSoundAudioSource = soundMusicObj.AddComponent<AudioSource>();
        mSoundAudioSource.loop = false;
        mSoundAudioSource.volume = 1f;
        mSoundAudioSource.playOnAwake = false;
        mute = GameSetting.Instance.GetBool(GameSetting.MusicSets.Mute_Music, GameSetting.MusicMute);
        mSoundAudioSource.mute = mute;
    }

    public async ETTask PlaySound(string name,bool isLoop = false)
    {
        if (isLoop)
        {
            await PlayBgm(name);
        }
        else
        {
            await PlayUISound(name);
        }
    }

    public async ETTask PlayBgm(string name)
    {
        if (BGMute) return;

        Log.Debug($"play bgm:{name}");
        var ac = await GameObjectPool.Instance.AcquireSound(name);
        mMusicBgAudioSource.clip = ac;
        mMusicBgAudioSource.loop = true;
        mMusicBgAudioSource.Play();
    }
    public void StopBgm()
    {
        Log.Debug("stop bgm");
        mMusicBgAudioSource.Stop();
    }

    public async ETTask PlayUISound(string name, float duration = -1f)
    {
        if (MusicMute) return;
        var ac = await GameObjectPool.Instance.AcquireSound(name);
        mSoundAudioSource.loop = false;
        mSoundAudioSource.PlayOneShot(ac);
    }
}