#pragma once

#include <memory>
#include <vector>
#include <unordered_map>
#include <string>

class Edge;

class AbstractFace
{
public:
    AbstractFace(unsigned id=0);

    virtual ~AbstractFace();

    virtual std::vector<unsigned> getNodeIds() const = 0;

    void addVectorAttribute(const std::string& tag, const std::vector<double>& values);

    std::vector<double> getVectorAttribute(const std::string& tag) const;

    void setIndex(std::size_t idx);

    virtual unsigned getNumNodes() const = 0;

    virtual void associateWidthEdges() = 0;

    virtual void replaceEdge(Edge* original, Edge* replacement) = 0;

    virtual std::vector<unsigned> getEdgeIds() const = 0;

protected:
    unsigned mId{0};
    std::unordered_map<std::string, std::vector<double> > mVectorAttributes;
};
