#include "DropUsedItemCondition.h"

#include "Game.h"

DropUsedItemCondition::DropUsedItemCondition(ItemFilter* filter)
    : DropCondition(),
      filter(filter)
{}

DropUsedItemCondition::~DropUsedItemCondition()
{
    filter->release();
}

const ItemFilter* DropUsedItemCondition::zFilter() const
{
    return filter;
}

bool DropUsedItemCondition::evaluate(Entity* zActor,
    Item* zItem,
    ItemSkill* zUsedSkill,
    Framework::Either<Block*, Entity*> zDestroyedObject)
{
    return zItem && filter->matchItem(zItem);
}

bool DropNoUsedItemCondition::evaluate(Entity* zActor,
    Item* zItem,
    ItemSkill* zUsedSkill,
    Framework::Either<Block*, Entity*> zDestroyedObject)
{
    return !zItem;
}

DropUsedItemConditionFactory::DropUsedItemConditionFactory()
    : SubTypeFactory()
{}

JSONObjectValidationBuilder* DropUsedItemConditionFactory::addToValidator(
    JSONObjectValidationBuilder* builder) const
{
    return builder->withRequiredAttribute(
        "filter", Game::INSTANCE->zTypeRegistry()->getValidator<ItemFilter>());
}

const char* DropUsedItemConditionFactory::getTypeToken() const
{
    return "itemFilter";
}

DropUsedItemCondition* DropUsedItemConditionFactory::fromJson(
    Framework::JSON::JSONObject* zJson) const
{
    return new DropUsedItemCondition(
        Game::INSTANCE->zTypeRegistry()->fromJson<ItemFilter>(
            zJson->zValue("filter")));
}

Framework::JSON::JSONObject* DropUsedItemConditionFactory::toJsonObject(
    DropUsedItemCondition* zObject) const
{
    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
    result->addValue(
        "filter", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zFilter()));
    return result;
}

DropNoUsedItemConditionFactory::DropNoUsedItemConditionFactory()
    : SubTypeFactory()
{}

JSONObjectValidationBuilder* DropNoUsedItemConditionFactory::addToValidator(
    JSONObjectValidationBuilder* builder) const
{
    return builder;
}

const char* DropNoUsedItemConditionFactory::getTypeToken() const
{
    return "noItem";
}

DropNoUsedItemCondition* DropNoUsedItemConditionFactory::fromJson(
    Framework::JSON::JSONObject* zJson) const
{
    return new DropNoUsedItemCondition();
}

Framework::JSON::JSONObject* DropNoUsedItemConditionFactory::toJsonObject(
    DropNoUsedItemCondition* zObject) const
{
    return new Framework::JSON::JSONObject();
}