#include "audio.h"
#include "jail_audio.h"
#include "options.h"
#include "resource.h"
#include <SDL3/SDL.h>

// Constructor
Audio::Audio()
{
    // Inicializa SDL
    if (!SDL_Init(SDL_INIT_AUDIO))
    {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_AUDIO could not initialize! SDL Error: %s", SDL_GetError());
    }
    else
    {
        SDL_LogInfo(SDL_LOG_CATEGORY_TEST, "\n** SDL_AUDIO: INITIALIZING\n");

        JA_Init(48000, SDL_AUDIO_S16LE, 2);
        enable(options.audio.enabled);
        setMusicVolume(options.audio.music.volume);
        setSoundVolume(options.audio.sound.volume);

        SDL_LogInfo(SDL_LOG_CATEGORY_TEST, "** SDL_AUDIO: INITIALIZATION COMPLETE\n");
    }
}

// Destructor
Audio::~Audio()
{
    JA_Quit();
}

// Reproduce la música
void Audio::playMusic(const std::string &name, const int loop)
{
    if (enabled_ && music_enabled_)
    {
        JA_PlayMusic(Resource::get()->getMusic(name), loop);
    }
}

// Pausa la música
void Audio::pauseMusic()
{
    if (enabled_ && music_enabled_)
    {
        JA_PauseMusic();
    }
}

// Detiene la música
void Audio::stopMusic()
{
    if (enabled_ && music_enabled_)
    {
        JA_StopMusic();
    }
}

// Reproduce un sonido
void Audio::playSound(const std::string &name)
{
    if (enabled_ && sound_enabled_)
    {
        JA_PlaySound(Resource::get()->getSound(name));
    }
}

// Detiene todos los sonidos
void Audio::stopAllSounds()
{
    if (enabled_ && sound_enabled_)
    {
        JA_StopChannel(-1);
    }
}

// Realiza un fundido de salida de la música
void Audio::fadeOutMusic(int milliseconds)
{
    if (enabled_ && music_enabled_)
    {
        JA_FadeOutMusic(milliseconds);
    }
}

// Establece el volumen de los sonidos
void Audio::setSoundVolume(int volume)
{
    if (enabled_ && sound_enabled_)
    {
        volume = std::clamp(volume, 0, 100);
        const int COVERTED_VOLUME = static_cast<int>((volume / 100.0) * 128);
        JA_SetSoundVolume(COVERTED_VOLUME);
    }
}

// Establece el volumen de la música
void Audio::setMusicVolume(int volume)
{
    if (enabled_ && music_enabled_)
    {
        volume = std::clamp(volume, 0, 100);
        const int COVERTED_VOLUME = static_cast<int>((volume / 100.0) * 128);
        JA_SetMusicVolume(COVERTED_VOLUME);
    }
}