#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::FileAssetResolver* resolver = nullptr)
{
    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, resolver);
    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
