using System;
using Services.Interfaces;
using UnityEngine;
using VContainer.Unity;

namespace Services
{
    public sealed class AudioService : IAudioService, IInitializable, IDisposable
    {
        private readonly float volume = 1f;
        private GameObject gameObject;
        private AudioSource source;

        public void Initialize()
        {
            this.gameObject = new GameObject("AudioService");
            UnityEngine.Object.DontDestroyOnLoad(this.gameObject);

            this.source = this.gameObject.AddComponent<AudioSource>();
            this.source.playOnAwake = false;
            this.source.loop = false;
            this.source.volume = this.volume;
        }

        public void PlaySound(AudioClip clip)
        {
            if (clip == null) return;
            if (this.source == null) return; // In case it's called before Initialize in some edge setup

            this.source.PlayOneShot(clip);
        }

        public void Dispose()
        {
            if (this.gameObject != null)
            {
                UnityEngine.Object.Destroy(this.gameObject);
                this.gameObject = null;
                this.source = null;
            }
        }
    }
}