#include "rive/animation/keyed_property.hpp"
#include "rive/animation/keyed_object.hpp"
#include "rive/animation/keyframe.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/keyed_object_importer.hpp"

using namespace rive;

KeyedProperty::KeyedProperty() {}
KeyedProperty::~KeyedProperty() {}

void KeyedProperty::addKeyFrame(std::unique_ptr<KeyFrame> keyframe)
{
    m_KeyFrames.push_back(std::move(keyframe));
}

void KeyedProperty::apply(Core* object, float seconds, float mix)
{
    assert(!m_KeyFrames.empty());

    int idx = 0;
    int mid = 0;
    float closestSeconds = 0.0f;
    int start = 0;
    auto numKeyFrames = static_cast<int>(m_KeyFrames.size());
    int end = numKeyFrames - 1;
    while (start <= end)
    {
        mid = (start + end) >> 1;
        closestSeconds = m_KeyFrames[mid]->seconds();
        if (closestSeconds < seconds)
        {
            start = mid + 1;
        }
        else if (closestSeconds > seconds)
        {
            end = mid - 1;
        }
        else
        {
            idx = start = mid;
            break;
        }
        idx = start;
    }
    int pk = propertyKey();

    if (idx == 0)
    {
        m_KeyFrames[0]->apply(object, pk, mix);
    }
    else
    {
        if (idx < numKeyFrames)
        {
            KeyFrame* fromFrame = m_KeyFrames[idx - 1].get();
            KeyFrame* toFrame = m_KeyFrames[idx].get();
            if (seconds == toFrame->seconds())
            {
                toFrame->apply(object, pk, mix);
            }
            else
            {
                if (fromFrame->interpolationType() == 0)
                {
                    fromFrame->apply(object, pk, mix);
                }
                else
                {
                    fromFrame->applyInterpolation(object, pk, seconds, toFrame, mix);
                }
            }
        }
        else
        {
            m_KeyFrames[idx - 1]->apply(object, pk, mix);
        }
    }
}

StatusCode KeyedProperty::onAddedDirty(CoreContext* context)
{
    StatusCode code;
    for (auto& keyframe : m_KeyFrames)
    {
        if ((code = keyframe->onAddedDirty(context)) != StatusCode::Ok)
        {
            return code;
        }
    }
    return StatusCode::Ok;
}

StatusCode KeyedProperty::onAddedClean(CoreContext* context)
{
    StatusCode code;
    for (auto& keyframe : m_KeyFrames)
    {
        if ((code = keyframe->onAddedClean(context)) != StatusCode::Ok)
        {
            return code;
        }
    }
    return StatusCode::Ok;
}

StatusCode KeyedProperty::import(ImportStack& importStack)
{
    auto importer = importStack.latest<KeyedObjectImporter>(KeyedObjectBase::typeKey);
    if (importer == nullptr)
    {
        return StatusCode::MissingObject;
    }
    importer->addKeyedProperty(std::unique_ptr<KeyedProperty>(this));
    return Super::import(importStack);
}
