#ifdef WITH_RIVE_SCRIPTING
#include "rive/lua/rive_lua_libs.hpp"
#include "rive/scripted/scripted_object.hpp"
#include "rive/file.hpp"
#ifdef WITH_RIVE_AUDIO
#include "rive/audio/audio_engine.hpp"
#include "rive/audio/audio_source.hpp"
#include "rive/audio/audio_sound.hpp"
#include "rive/assets/audio_asset.hpp"
#include "rive/component.hpp"
#include "rive/artboard.hpp"
#endif

#include <math.h>
#include <stdio.h>
#include <string.h>

using namespace rive;

#ifdef WITH_RIVE_AUDIO
void ScriptedAudioSource::source(rcp<AudioSource> value) { m_source = value; }

int ScriptedAudioSource::initializeSound(lua_State* L,
                                         rcp<AudioSound> sound,
                                         Artboard* artboard)
{
    if (sound != nullptr)
    {
        if (artboard)
        {
            sound->volume(artboard->volume());
        }
        auto* scriptedAudioSound = lua_newrive<ScriptedAudioSound>(L, artboard);
        scriptedAudioSound->sound = std::move(sound);
        return 1;
    }
    return 0;
}

int ScriptedAudioSource::play(lua_State* L,
                              AudioEngine* engine,
                              double time,
                              bool isRelative)
{
    if (source() == nullptr)
    {
        return 0;
    }
#ifdef WITH_RIVE_TOOLS
    ScriptingContext* context =
        static_cast<ScriptingContext*>(lua_getthreaddata(L));
    if (context && !context->isPlaying())
    {
        return 0;
    }
#endif
    float startTime = time;
    if (isRelative)
    {
        startTime += engine->timeInSeconds();
    }
    rcp<AudioSound> audioSound =
        engine->playSeconds(source(), startTime, 0, 0, nullptr);
    return initializeSound(L, audioSound, nullptr);
}

int ScriptedAudioSource::play(lua_State* L, AudioEngine* engine)
{
    return play(L, engine, 0, true);
}
int ScriptedAudioSource::playFrame(lua_State* L,
                                   AudioEngine* engine,
                                   uint64_t startTime,
                                   bool isRelative)
{
    if (source() == nullptr)
    {
        return 0;
    }

#ifdef WITH_RIVE_TOOLS
    ScriptingContext* context =
        static_cast<ScriptingContext*>(lua_getthreaddata(L));
    if (context && !context->isPlaying())
    {
        return 0;
    }
#endif
    if (isRelative)
    {
        startTime += engine->timeInFrames();
    }
    rcp<AudioSound> audioSound =
        engine->play(source(), startTime, 0, 0, nullptr);
    return initializeSound(L, audioSound, nullptr);
}
int ScriptedAudioSource::playFrame(lua_State* L, AudioEngine* engine)
{
    return playFrame(L, engine, 0, true);
}

static void audio_source_direct_duration(void* udata, void* result)
{
    auto* self = (ScriptedAudioSource*)udata;
    auto src = self->source();
    if (src == nullptr)
    {
        lua_userdatadirectfield_setnil(result);
        return;
    }
    lua_userdatadirectfield_setnumber(result, (double)src->duration());
}

static int audio_source_index(lua_State* L)
{
    int atom;
    const char* key = lua_tostringatom(L, 2, &atom);
    if (!key)
    {
        luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
        return 0;
    }

    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr ||
        scriptedAudioSource->source() == nullptr)
    {
        return 0;
    }
    switch (atom)
    {
        case (int)LuaAtoms::duration:
            lua_pushnumber(
                L,
                (lua_Number)scriptedAudioSource->source()->duration());
            return 1;
        default:
            break;
    }

    luaL_error(L,
               "'%s' is not a valid index of %s",
               key,
               ScriptedAudioSource::luaName);
    return 0;
}

static int audio_sound_namecall(lua_State* L)
{
    int atom;
    const char* str = lua_namecallatom(L, &atom);
    if (str != nullptr)
    {
        auto* scriptedAudioSound = lua_torive<ScriptedAudioSound>(L, 1);
        if (scriptedAudioSound == nullptr ||
            scriptedAudioSound->sound == nullptr)
        {
            return 0;
        }
        auto sound = scriptedAudioSound->sound;
        switch (atom)
        {
            case (int)LuaAtoms::play:
            {
                sound->play();
                return 0;
            }
            case (int)LuaAtoms::pause:
            {
                sound->pause();
                return 0;
            }
            case (int)LuaAtoms::resume:
            {
                sound->resume();
                return 0;
            }
            case (int)LuaAtoms::stop:
            {
                uint64_t fadeTimeInFrames = 0;
                if (lua_gettop(L) >= 2 && lua_isnumber(L, 2))
                {
                    fadeTimeInFrames = (uint64_t)lua_tonumber(L, 2);
                }
                sound->stop(fadeTimeInFrames);
                return 0;
            }
            case (int)LuaAtoms::seek:
            {
                float timeInSeconds = (float)luaL_checknumber(L, 2);
                lua_pushboolean(L, sound->seekSeconds(timeInSeconds));
                return 1;
            }
            case (int)LuaAtoms::seekFrame:
            {
                uint64_t timeInFrames = (uint64_t)luaL_checknumber(L, 2);
                lua_pushboolean(L, sound->seek(timeInFrames));
                return 1;
            }
            case (int)LuaAtoms::completed:
            {
                lua_pushboolean(L, sound->completed());
                return 1;
            }
            case (int)LuaAtoms::time:
            {
                lua_pushnumber(L, sound->timeInSeconds());
                return 1;
            }
            case (int)LuaAtoms::timeFrame:
            {
                lua_pushnumber(L, sound->timeInFrames());
                return 1;
            }
            default:
                break;
        }
    }

    luaL_error(L,
               "%s is not a valid method of %s",
               str,
               ScriptedAudioSound::luaName);
    return 0;
}

static int audio_sound_newindex(lua_State* L)
{
    int atom;
    const char* key = lua_tostringatom(L, 2, &atom);
    if (!key)
    {
        luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
        return 0;
    }

    auto scriptedAudioSound = lua_torive<ScriptedAudioSound>(L, 1);
    auto sound = scriptedAudioSound->sound;
    auto artboard = scriptedAudioSound->artboard();
    switch (atom)
    {
        case (int)LuaAtoms::volume:
        {
            float value = (float)luaL_checknumber(L, 3);
            if (artboard)
            {
                value *= artboard->volume();
            }
            sound->volume(value);
            return 0;
        }
        default:
            break;
    }

    luaL_error(L,
               "'%s' is not a valid index of %s",
               key,
               ScriptedAudioSound::luaName);

    return 0;
}

static void audio_sound_direct_volume(void* udata, void* result)
{
    auto* self = (ScriptedAudioSound*)udata;
    lua_userdatadirectfield_setnumber(
        result,
        self->sound ? (double)self->sound->volume() : 0.0);
}

static int audio_sound_index(lua_State* L)
{
    int atom;
    const char* key = lua_tostringatom(L, 2, &atom);
    if (!key)
    {
        luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
        return 0;
    }

    auto scriptedAudioSound = lua_torive<ScriptedAudioSound>(L, 1);
    auto sound = scriptedAudioSound->sound;
    switch (atom)
    {
        case (int)LuaAtoms::volume:
            lua_pushnumber(L, (lua_Number)sound->volume());
            return 1;

        default:
            break;
    }

    luaL_error(L,
               "'%s' is not a valid index of %s",
               key,
               ScriptedAudioSound::luaName);
    return 0;
}

static int audio_play(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    if (engine == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    return scriptedAudioSource->play(L, engine.get());
#else
    lua_pushnil(L);
    return 1;
#endif
}

static int audio_play_at_time(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    if (engine == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto startTime = lua_tonumber(L, 2);

    return scriptedAudioSource->play(L, engine.get(), startTime, false);
#else
    lua_pushnil(L);
    return 1;
#endif
}

static int audio_play_in_time(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    if (engine == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto startTime = lua_tonumber(L, 2);

    return scriptedAudioSource->play(L, engine.get(), startTime, true);
#else
    lua_pushnil(L);
    return 1;
#endif
}

static int audio_play_at_frame(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    if (engine == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto startTime = lua_tonumber(L, 2);

    return scriptedAudioSource->playFrame(L, engine.get(), startTime, false);
#else
    lua_pushnil(L);
    return 1;
#endif
}

static int audio_play_in_frame(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    if (engine == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto* scriptedAudioSource = lua_torive<ScriptedAudioSource>(L, 1);
    if (scriptedAudioSource == nullptr)
    {
        lua_pushnil(L);
        return 1;
    }
    auto startTime = lua_tonumber(L, 2);

    return scriptedAudioSource->playFrame(L, engine.get(), startTime, true);
#else
    lua_pushnil(L);
    return 1;
#endif
}

static int audio_time(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    lua_pushnumber(L, (lua_Number)(engine ? engine->timeInSeconds() : 0));
#else
    lua_pushnumber(L, 0);
#endif
    return 1;
}

static int audio_time_frame(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    lua_pushinteger(L, (engine ? (int)engine->timeInFrames() : 0));
#else
    lua_pushinteger(L, 0);
#endif
    return 1;
}

static int audio_sample_rate(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    auto engine = AudioEngine::RuntimeEngine(true);
    lua_pushinteger(L, (engine ? (int)engine->sampleRate() : 0));
#else
    lua_pushinteger(L, 0);
#endif
    return 1;
}

static const luaL_Reg audioStaticMethods[] = {
    {"time", audio_time},
    {"timeFrame", audio_time_frame},
    {"sampleRate", audio_sample_rate},
    {"play", audio_play},
    {"playAtTime", audio_play_at_time},
    {"playInTime", audio_play_in_time},
    {"playAtFrame", audio_play_at_frame},
    {"playInFrame", audio_play_in_frame},
    {nullptr, nullptr}};
#endif

int luaopen_rive_audio(lua_State* L)
{
#ifdef WITH_RIVE_AUDIO
    {
        lua_register_rive<ScriptedAudioSource>(L);

        lua_pushcfunction(L, audio_source_index, nullptr);
        lua_setfield(L, -2, "__index");

        lua_setreadonly(L, -1, true);
        lua_pop(L, 1); // pop the metatable

        lua_registeruserdatadirectfieldget(L,
                                           ScriptedAudioSource::luaTag,
                                           "duration",
                                           audio_source_direct_duration);
    }
    {
        lua_register_rive<ScriptedAudioSound>(L);

        lua_pushcfunction(L, audio_sound_namecall, nullptr);
        lua_setfield(L, -2, "__namecall");

        lua_pushcfunction(L, audio_sound_index, nullptr);
        lua_setfield(L, -2, "__index");

        lua_pushcfunction(L, audio_sound_newindex, nullptr);
        lua_setfield(L, -2, "__newindex");

        lua_setreadonly(L, -1, true);
        lua_pop(L, 1); // pop the metatable

        lua_registeruserdatadirectfieldget(L,
                                           ScriptedAudioSound::luaTag,
                                           "volume",
                                           audio_sound_direct_volume);
    }
    luaL_register(L, ScriptedAudio::luaName, audioStaticMethods);
#endif

    return 0;
}

#endif
