#pragma once
#include <string>

namespace audio
{
    // Enumeració per a representar el estat de un canal de sò
    enum channel_state
    {
        CHANNEL_INVALID,
        CHANNEL_FREE,
        CHANNEL_PLAYING,
        CHANNEL_PAUSED
    };

    // Enumeració per a representar el estat de la música
    enum music_state
    {
        MUSIC_INVALID,
        MUSIC_PLAYING,
        MUSIC_PAUSED,
        MUSIC_STOPPED
    };

    /// @brief Inicialitza el sistema de só
    void init();

    /// @brief Tanca el sistema de só
    void quit();

    /// @brief Comença a reproduïr la música des d'un arxiu
    /// @param filename nom de l'arxiu
    /// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
    void playMusic(const std::string filename, const int loop = -1);

    /// @brief Pausa la música que està sonant ara
    void pauseMusic();

    /// @brief Continua la música pausada
    void resumeMusic();

    /// @brief Para la música que estava sonant
    void stopMusic();

    /// @brief Obté el estat actual de la música
    /// @return estat actual de la música (MUSIC_INVALID, MUSIC_PLAYING, MUSIC_PAUSED o MUSIC_STOPPED)
    const music_state getMusicState();

    /// @brief Obté el nom de la música actual
    /// @return nom de la cançò
    const std::string getCurrentMusic();

    /// @brief Precarrega un só des d'un arxiu WAV
    /// @param filename nom de l'arxiu
    void loadSound(const std::string filename);

    /// @brief Comença a reproduïr el só especificat
    /// @param snd punter al só a reproduïr
    /// @param loop si es fa bucle (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
    /// @return número del canal en que està sonant el só
    const int playSound(const std::string name, const int priority, const int loop = 0);

    /// @brief Pausa un canal en el que s'estava reproduïnt un só
    /// @param channel número del canal a pausar
    void pauseChannel(const int channel);

    /// @brief Continua un canal pausat
    /// @param channel número del canal pausat
    void resumeChannel(const int channel);

    /// @brief Para un canal que estava reproduïnt un só
    /// @param channel número del canal a parar
    void stopChannel(const int channel);

    /// @brief Para tots els canals
    void stopAllChannel();

    /// @brief Obté l'estat d'un canal
    /// @param channel canal del que es vol obtindre l'estat
    /// @return estat del canal (CHANNEL_INVALID, CHANNEL_FREE, CHANNEL_PLAYING o CHANNEL_PAUSED)
    const channel_state getChannelState(const int channel);

    /// @brief Estableix el volum general
    /// @param volume valor a establir com a volum (128 màxim)
    /// @return el volum anterior
    const int setVolume(int volume);
}