#pragma once

#include <string>

#include "audio.h"

class Audio
{
public:
    // === Singleton ===
    static Audio &get() // Obtención de la instancia única (Meyers Singleton)
    {
        static Audio instance;
        return instance;
    }

    // === Control de Música ===
    void playMusic(const std::string &name, int loop = -1); // Reproducir en bucle
    void pauseMusic();                                      // Pausar reproducción
    void stopMusic();                                       // Detener completamente
    void fadeOutMusic(int milliseconds);                    // Fundido de salida

    // === Control de Sonidos ===
    void playSound(const std::string &name); // Reproducir sonido puntual
    void stopAllSounds();                    // Detener todos los sonidos

    // === Configuración General ===
    void enable() { enabled_ = true; }             // Habilitar audio
    void disable() { enabled_ = false; }           // Deshabilitar audio
    void enable(bool value) { enabled_ = value; }  // Establecer estado
    void toggleEnabled() { enabled_ = !enabled_; } // Alternar estado

    // === Configuración de Sonidos ===
    void enableSound() { sound_enabled_ = true; }            // Habilitar sonidos
    void disableSound() { sound_enabled_ = false; }          // Deshabilitar sonidos
    void enableSound(bool value) { sound_enabled_ = value; } // Establecer estado
    void toggleSound() { sound_enabled_ = !sound_enabled_; } // Alternar estado

    // === Configuración de Música ===
    void enableMusic() { music_enabled_ = true; }            // Habilitar música
    void disableMusic() { music_enabled_ = false; }          // Deshabilitar música
    void enableMusic(bool value) { music_enabled_ = value; } // Establecer estado
    void toggleMusic() { music_enabled_ = !music_enabled_; } // Alternar estado

    // === Control de Volumen ===
    void setSoundVolume(int volume); // Ajustar volumen de efectos
    void setMusicVolume(int volume); // Ajustar volumen de música

private:
    // === Variables de Estado ===
    bool enabled_ = true;       // Estado general del audio
    bool sound_enabled_ = true; // Estado de los efectos de sonido
    bool music_enabled_ = true; // Estado de la música

    // === Patrón Singleton ===
    Audio();                                  // Constructor privado
    ~Audio();                                 // Destructor privado
    Audio(const Audio &) = delete;            // Evitar copia
    Audio &operator=(const Audio &) = delete; // Evitar asignación
};