#pragma once

#include "DropConfig.h"
#include "ItemModifier.h"
#include "ItemType.h"

class SpecificItemDrop : public DropConfig
{
private:
    Framework::Text itemTypeName;
    const ItemType* zType;
    ItemModifier* modifier;
    int amount;

public:
    SpecificItemDrop(
        Framework::Text itemTypeName, ItemModifier* modifier, int amount);
    ~SpecificItemDrop();
    void initialize() override;
    Framework::Text getItemTypeName() const;
    const ItemModifier* zModifier() const;
    int getAmount() const;
    void doDrop(Entity* zActor,
        Item* zItem,
        ItemSkill* zUsedSkill,
        Framework::Either<Block*, Entity*> zDestroyedObject) const override;
};

class SpecificItemDropFactory : public DropConfigFactory<SpecificItemDrop>
{
public:
    SpecificItemDropFactory();
    JSONObjectValidationBuilder* addToValidator(
        JSONObjectValidationBuilder* builder) const override;
    const char* getTypeToken() const override;
    SpecificItemDrop* createInstance(
        Framework::JSON::JSONObject* zJson) const override;
    void addToJson(Framework::JSON::JSONObject* zJson,
        SpecificItemDrop* zObject) const override;
};