#include "rive/shapes/image.hpp"
#include "rive/backboard.hpp"
#include "rive/importers/backboard_importer.hpp"
#include "rive/assets/file_asset.hpp"
#include "rive/assets/image_asset.hpp"

using namespace rive;

void Image::draw(Renderer* renderer)
{
	if (m_ImageAsset == nullptr || renderOpacity() == 0.0f)
	{
		return;
	}
	renderer->save();

	auto renderImage = m_ImageAsset->renderImage();
	auto width = renderImage->width();
	auto height = renderImage->height();

	const Mat2D& transform = worldTransform();
	renderer->transform(transform);

	Mat2D originTranslation(
	    1.0f, 0.0f, 0.0f, 1.0f, -width / 2.0f, -height / 2.0f);
	renderer->transform(originTranslation);

	renderer->drawImage(renderImage, blendMode(), renderOpacity());
	renderer->restore();
}

StatusCode Image::import(ImportStack& importStack)
{
	auto backboardImporter =
	    importStack.latest<BackboardImporter>(Backboard::typeKey);
	if (backboardImporter == nullptr)
	{
		return StatusCode::MissingObject;
	}
	backboardImporter->addFileAssetReferencer(this);

	return Super::import(importStack);
}

void Image::assets(const std::vector<FileAsset*>& assets)
{
	if (assetId() < 0 || assetId() >= assets.size())
	{
		return;
	}
	auto asset = assets[assetId()];
	if (asset->is<ImageAsset>())
	{
		m_ImageAsset = asset->as<ImageAsset>();
	}
}

Core* Image::clone() const
{
	Image* twin = ImageBase::clone()->as<Image>();
	twin->m_ImageAsset = m_ImageAsset;
	return twin;
}