#include "RE/BSScript/IVirtualMachine.h"
#include "RE/BSScript/Internal/VirtualMachine.h"

// 1) The initial callback signature:
BSScript::LatentStatus StartGIFCapture(
    RE::BSScript::Internal::VirtualMachine* vm,
    VMStackID                         stackID,
    RE::StaticFunctionTag*,          // standard first param
    float                             durationSeconds,
    std::int32_t                      fps
) {
    // Kick off your async capture (on another thread or via timers).
    // Store 'vm' and 'stackID' in your capture manager, so you can
    // return to the right script stack once done.
    CaptureManager::Get().Begin(
        durationSeconds,
        fps,
        [vm, stackID](bool success) {
            // 3) Return to Papyrus when frames are all saved:
            vm->ReturnFromLatent(stackID, success);
        }
    );

    // 2) Tell the VM “I’m latent—don’t resume yet”:
    return BSScript::LatentStatus::kLatent;
}

// Plugin registration:
bool BindPapyrusFunctions(RE::BSScript::IVirtualMachine* vm) {
    // Register as a latent function:
    vm->RegisterLatentFunction(
        "StartGIFCapture",         // Papyrus function name
        "MyScreenGrabScript",      // Your .psc ScriptName
        StartGIFCapture           // Callback above
    );
    return true;
}

extern "C" DLLEXPORT bool SKSEPlugin_Load(const SKSE::LoadInterface* skse) {
    SKSE::Init(skse);
    SKSE::GetPapyrusInterface()->Register(BindPapyrusFunctions);
    return true;
}