#ifndef _RIVE_FILE_READER_HPP_
#define _RIVE_FILE_READER_HPP_

#include <rive/file.hpp>
#include "rive/rive_counter.hpp"

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

static rive::NoOpFactory gNoOpFactory;

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

    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);

    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;
}

class RenderObjectLeakChecker
{
    int m_before[rive::Counter::kNumTypes];

public:
    RenderObjectLeakChecker()
    {
        std::copy(rive::Counter::counts,
                  rive::Counter::counts + rive::Counter::kNumTypes,
                  m_before);
    }
    ~RenderObjectLeakChecker()
    {
        const int* after = rive::Counter::counts;
        for (int i = 0; i < rive::Counter::kNumTypes; ++i)
        {
            if (rive::Counter::counts[i] != m_before[i])
            {
                printf("[%d] before:%d after:%d\n", i, m_before[i], after[i]);
                REQUIRE(false);
            }
        }
    }
};

#endif
