#pragma once
#include <Text.h>

#include "Recipie.h"

template<typename T, typename S> class RecipieListType
    : public virtual Framework::ReferenceCounter
{
private:
    Framework::RCArray<T> recipies;
    Framework::Text name;

public:
    RecipieListType(const char* name)
        : ReferenceCounter(),
          name(name)
    {}

    void addRecipie(T* recipie)
    {
        recipies.add(recipie);
    }

    T* zFirstRecipie(S* zStorage)
    {
        for (T* recipie : recipies)
        {
            if (recipie->testApplicability(zStorage)) return recipie;
        }
        return 0;
    }

    const Framework::Text& getName() const
    {
        return name;
    }
};

typedef RecipieListType<Recipie, CraftingStorage> RecipieList;
typedef RecipieListType<ShapedRecipie, ShapedCraftingStorage> ShapedRecipieList;