#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;
    }

    if (!clip(renderer)) {
        // We didn't clip, so make sure to save as we'll be doing some
        // transformations.
        renderer->save();
    }

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

    renderer->transform(worldTransform());
    renderer->translate(-width / 2.0f, -height / 2.0f);

    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;
}
