#ifndef CLASPLAYER_H
#define CLASPLAYER_H
#include <string>
#include <gringo/control.hh>
#include <ast.h>

typedef std::pair<std::string, AnnotationModifier> Tag;

class CFGraph;

class ClaspLayer
{

public:
   ClaspLayer();

   void addFunctionTags(const std::string& function, const std::vector<Tag>& tags);
   void addCFGData(CFGraph&& graph);
   void addWarningRule(const char* rule);

   void run();

private:
   std::ostringstream __partTags;
   std::ostringstream __partGeneral;

   bool onModel(Gringo::Model const & model);
};

class CFGraph
{
    friend class ClaspLayer;
public:
    void addNode(FID function, std::string&& tag);
    void addLink(FID nodeFrom, FID nodeTo);
    bool existsNode(FID function) const;
    void print(std::ostream& cout) const;

private:
    std::map<FID, FID> __relations;
    std::map<FID, std::string> __nodes;
};

#endif
