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

[Event]
public class PlayBGMHandler : BEvent<ET.EventType.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
{
    public AudioSource UnityAudioSource { get; private set; }
    public bool Mute
    {
        get { return UnityAudioSource.mute; }
        set { UnityAudioSource.mute = value; }
    }
    public float Volume
    {
        get { return UnityAudioSource.volume; }
        set { UnityAudioSource.volume = value; }
    }
    public void Awake()
    {
        UnityAudioSource = GameObject.Find("/Global/Audio").GetComponent<AudioSource>();
        UnityAudioSource.loop = true;
        UnityAudioSource.volume = 1f;
        UnityAudioSource.playOnAwake = false;

        var mute = GameSetting.Instance.GetBool(GameSetting.Sets.Mute_int, GameSetting.Cnst_Mute);
        UnityAudioSource.mute = mute;
    }

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

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

    public async ETTask PlayUISound(string name, float duration = -1f)
    {
        if (Mute) return;

        var key = name;
        var m = Regex.Match(key, "/?res/sound/.*/([\\w_\\d]+)\\.assetbundles$");
        if (m.Success)
        {
            key = m.Groups[1].Value.ToLower();
        }
        var ac = await GameObjectPool.Instance.AcquireSound(key);
        UnityAudioSource.PlayOneShot(ac);
    }

    //TODO:实现3D音源随物体移动
    public async ETTask Play3DSound(string name, Vector3 pos, float duration = -1f)
    {
        if (Mute) return;

        var key = name;
        var m = Regex.Match(key, "/?res/sound/.*/([\\w_\\d]+)\\.assetbundles$");
        if (m.Success)
        {
            key = m.Groups[1].Value.ToLower();
        }
        //Log.Debug($"play 3dsound: {key}");
        var ac = await GameObjectPool.Instance.AcquireSound(key);
        //AudioSource.PlayClipAtPoint(ac, pos);
        UnityAudioSource.PlayOneShot(ac);

    }
}