#ifndef _RIVE_FILE_READER_HPP_
#define _RIVE_FILE_READER_HPP_

#include <rive/file.hpp>

#include "rive_testing.hpp"
#include "utils/no_op_factory.hpp"

static rive::NoOpFactory gNoOpFactory;

static inline std::vector<uint8_t> ReadFile(const char path[])
{
    FILE* fp = fopen(path, "rb");
    REQUIRE(fp != nullptr);

    fseek(fp, 0, SEEK_END);
    const size_t length = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    std::vector<uint8_t> bytes(length);
    REQUIRE(fread(bytes.data(), 1, length, fp) == length);
    fclose(fp);

    return bytes;
}

static inline rive::rcp<rive::File> ReadRiveFile(
    const char path[],
    rive::Factory* factory = nullptr,
    rive::FileAssetLoader* loader = nullptr,
    bool loadInBandAssets = true)
{
    if (!factory)
    {
        factory = &gNoOpFactory;
    }

    std::vector<uint8_t> bytes = ReadFile(path);

    rive::ImportResult result;
    auto file = rive::File::import(bytes, factory, &result, loader);
    REQUIRE(result == rive::ImportResult::success);
    REQUIRE(file.get() != nullptr);
    REQUIRE(file->artboard() != nullptr);

    return file;
}

#endif
