#ifdef WITH_RIVE_AUDIO
#include "rive/audio/audio_sound.hpp"
#include "rive/audio/audio_engine.hpp"
#include "rive/audio/audio_reader.hpp"
#include "rive/audio/audio_source.hpp"

using namespace rive;

AudioSound::AudioSound(AudioEngine* engine,
                       rcp<AudioSource> source,
                       Artboard* artboard) :
    m_decoder({}),
    m_buffer({}),
    m_sound({}),
    m_source(std::move(source)),
    m_isDisposed(false),
    m_engine(engine),
    m_artboard(artboard)
{}

void AudioSound::dispose()
{
    if (m_isDisposed)
    {
        return;
    }
    m_isDisposed = true;
    ma_sound_uninit(&m_sound);
    ma_decoder_uninit(&m_decoder.decoder);
    ma_audio_buffer_uninit(&m_buffer);
}

float AudioSound::volume() { return ma_sound_get_volume(&m_sound); }
void AudioSound::volume(float value) { ma_sound_set_volume(&m_sound, value); }

bool AudioSound::completed() const
{
    if (m_isDisposed)
    {
        return true;
    }
    return (bool)ma_sound_at_end(&m_sound);
}

AudioSound::~AudioSound() { dispose(); }

void AudioSound::stop(uint64_t fadeTimeInFrames)
{
    if (m_isDisposed)
    {
        return;
    }
    if (fadeTimeInFrames == 0)
    {
        ma_sound_stop(&m_sound);
    }
    else
    {
        ma_sound_stop_with_fade_in_pcm_frames(&m_sound, fadeTimeInFrames);
    }
}

void AudioSound::play()
{
    if (m_isDisposed)
    {
        return;
    }
    ma_sound_seek_to_pcm_frame(&m_sound, 0);
    ma_sound_start(&m_sound);
}

void AudioSound::pause() { stop(0); }

void AudioSound::resume()
{
    if (m_isDisposed)
    {
        return;
    }
    ma_sound_start(&m_sound);
}

bool AudioSound::seek(uint64_t timeInFrames)
{
    if (m_isDisposed)
    {
        return false;
    }
    return ma_sound_seek_to_pcm_frame(&m_sound, (ma_uint64)timeInFrames) ==
           MA_SUCCESS;
}

bool AudioSound::seekSeconds(float timeInSeconds)
{
    if (m_isDisposed)
    {
        return false;
    }
    return ma_sound_seek_to_second(&m_sound, timeInSeconds) == MA_SUCCESS;
}

uint64_t AudioSound::timeInFrames()
{
    if (m_isDisposed)
    {
        return 0;
    }
    return ma_sound_get_time_in_pcm_frames(&m_sound);
}

float AudioSound::timeInSeconds()
{
    if (m_isDisposed)
    {
        return 0.0f;
    }
    return ma_sound_get_time_in_milliseconds(&m_sound) / 1000.0f;
}

#endif