#include <vector>
#include "rive/assets/file_asset_contents.hpp"
#include "rive/assets/file_asset.hpp"
#include "rive/importers/file_asset_importer.hpp"

using namespace rive;

StatusCode FileAssetContents::import(ImportStack& importStack)
{
  auto fileAssetImporter = importStack.latest<FileAssetImporter>(
      FileAsset::typeKey);
  if (fileAssetImporter == nullptr)
  {
    return StatusCode::MissingObject;
  }
  fileAssetImporter->onFileAssetContents(
      std::unique_ptr<FileAssetContents>(this));

  return Super::import(importStack);
}

void FileAssetContents::decodeBytes(Span<const uint8_t> value)
{
  m_bytes = SimpleArray<uint8_t>(value.data(), value.size());
}

void FileAssetContents::copyBytes(const FileAssetContentsBase& object)
{
  // Should never be called.
  assert(false);
}

SimpleArray<uint8_t>& FileAssetContents::bytes() { return m_bytes; }

void FileAssetContents::decodeSignature(Span<const uint8_t> value)
{
  m_signature = SimpleArray<uint8_t>(value.data(), value.size());
}

void FileAssetContents::copySignature(const FileAssetContentsBase& object)
{
  // Should never be called.
  assert(false);
}

SimpleArray<uint8_t>& FileAssetContents::signature() { return m_signature; }