#pragma once

#include <string>

/**
 * @brief Abstract interface for audio system operations
 * 
 * Provides a common interface for audio playback, enabling
 * dependency injection and easier testing.
 */
class IAudioSystem {
public:
    virtual ~IAudioSystem() = default;
    
    /**
     * @brief Play a sound effect
     * @param name Sound effect name/identifier
     */
    virtual void playSound(const std::string& name) = 0;
    
    /**
     * @brief Play background music
     * @param name Music track name/identifier
     */
    virtual void playMusic(const std::string& name) = 0;
    
    /**
     * @brief Stop currently playing music
     */
    virtual void stopMusic() = 0;
    
    /**
     * @brief Set master volume for all audio
     * @param volume Volume level (0.0 to 1.0)
     */
    virtual void setMasterVolume(float volume) = 0;
    
    /**
     * @brief Set music volume
     * @param volume Volume level (0.0 to 1.0)
     */
    virtual void setMusicVolume(float volume) = 0;
    
    /**
     * @brief Set sound effects volume
     * @param volume Volume level (0.0 to 1.0)
     */
    virtual void setSoundVolume(float volume) = 0;
    
    /**
     * @brief Check if music is currently playing
     * @return true if music is playing, false otherwise
     */
    virtual bool isMusicPlaying() const = 0;
};
