#ifndef _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_
#define _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_

#include "rive/file_asset_resolver.hpp"
#include "rive/assets/file_asset.hpp"
#include <cstdio>
#include <string>

namespace rive {
class FileAsset;
class Factory;

/// An implementation of FileAssetResolver which finds the assets in a local
/// path relative to the original .riv file looking for them.
class RelativeLocalAssetResolver : public FileAssetResolver {
private:
    std::string m_Path;
    Factory* m_Factory;

public:
    RelativeLocalAssetResolver(std::string filename, Factory* factory) : m_Factory(factory) {
        std::size_t finalSlash = filename.rfind('/');

        if (finalSlash != std::string::npos) {
            m_Path = filename.substr(0, finalSlash + 1);
        }
    }

    void loadContents(FileAsset& asset) override {
        std::string filename = m_Path + asset.uniqueFilename();
        FILE* fp = fopen(filename.c_str(), "rb");

        fseek(fp, 0, SEEK_END);
        const size_t length = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        uint8_t* bytes = new uint8_t[length];
        if (fread(bytes, 1, length, fp) == length) {
            asset.decode(Span<const uint8_t>(bytes, length), m_Factory);
        }
        delete[] bytes;
    }
};
} // namespace rive
#endif
