#ifndef _RIVE_BACKBOARD_IMPORTER_HPP_
#define _RIVE_BACKBOARD_IMPORTER_HPP_

#include "rive/importers/import_stack.hpp"
#include <unordered_map>
#include <vector>

namespace rive {
class Artboard;
class NestedArtboard;
class Backboard;
class FileAsset;
class FileAssetReferencer;
class BackboardImporter : public ImportStackObject {
private:
    Backboard* m_Backboard;
    std::unordered_map<int, Artboard*> m_ArtboardLookup;
    std::vector<NestedArtboard*> m_NestedArtboards;
    std::vector<FileAsset*> m_FileAssets;
    std::vector<FileAssetReferencer*> m_FileAssetReferencers;
    int m_NextArtboardId;

public:
    BackboardImporter(Backboard* backboard);
    void addArtboard(Artboard* artboard);
    void addMissingArtboard();
    void addNestedArtboard(NestedArtboard* artboard);
    void addFileAsset(FileAsset* asset);
    void addFileAssetReferencer(FileAssetReferencer* referencer);

    StatusCode resolve() override;
    const Backboard* backboard() const { return m_Backboard; }
};
} // namespace rive
#endif
