#include "rive/audio_event.hpp"
#include "rive/assets/audio_asset.hpp"
#include "rive/audio/audio_engine.hpp"
#include "rive/audio/audio_sound.hpp"
#include "rive/artboard.hpp"

using namespace rive;

void AudioEvent::play()
{
#ifdef WITH_RIVE_AUDIO
    auto audioAsset = (AudioAsset*)m_fileAsset;
    if (audioAsset == nullptr)
    {
        return;
    }
    auto audioSource = audioAsset->audioSource();
    if (audioSource == nullptr)
    {
        return;
    }

    auto volume = audioAsset->volume() * artboard()->volume();
    if (volume <= 0.0f)
    {
        return;
    }

    auto engine =
#ifdef EXTERNAL_RIVE_AUDIO_ENGINE
        artboard()->audioEngine() != nullptr ? artboard()->audioEngine() :
#endif
                                             AudioEngine::RuntimeEngine();

    auto sound = engine->play(audioSource, engine->timeInFrames(), 0, 0);

    if (volume != 1.0f)
    {
        sound->volume(volume);
    }
#endif
}

void AudioEvent::trigger(const CallbackData& value)
{
    Super::trigger(value);
    if (!value.context()->playsAudio())
    {
        // Context won't play audio, we'll do it ourselves.
        play();
    }
}

StatusCode AudioEvent::import(ImportStack& importStack)
{
    auto result = registerReferencer(importStack);
    if (result != StatusCode::Ok)
    {
        return result;
    }
    return Super::import(importStack);
}

void AudioEvent::setAsset(FileAsset* asset)
{
    if (asset->is<AudioAsset>())
    {
        FileAssetReferencer::setAsset(asset);
    }
}

Core* AudioEvent::clone() const
{
    AudioEvent* twin = AudioEventBase::clone()->as<AudioEvent>();
    if (m_fileAsset != nullptr)
    {
        twin->setAsset(m_fileAsset);
    }
    return twin;
}

uint32_t AudioEvent::assetId() { return AudioEventBase::assetId(); }