#ifndef SRC_VTK_HH
#define SRC_VTK_HH

#include <string>

template <class VertexBasis, class CellBasis> class BodyVTKWriter {
private:
  CellBasis const &cellBasis_;
  VertexBasis const &vertexBasis_;
  std::string const prefix_;

public:
  BodyVTKWriter(CellBasis const &cellBasis, VertexBasis const &vertexBasis,
              std::string prefix);

  template <class Vector, class ScalarVector>
  void write(size_t record, Vector const &u, Vector const &v,
             ScalarVector const &alpha, ScalarVector const &stress) const;

  void writeGrid() const;
};

template <class VertexBasis, class CellBasis> class MyVTKWriter {
private:
  std::vector<BodyVTKWriter<VertexBasis, CellBasis>* > bodyVTKWriters_;
  std::string const prefix_;

public:
  MyVTKWriter(const std::vector<const CellBasis* >& cellBases, const std::vector<const VertexBasis* >& vertexBases,
              std::string prefix);

  ~MyVTKWriter();

  template <class Vector, class ScalarVector>
  void write(size_t record, const std::vector<Vector>& u, const std::vector<Vector>& v,
             const std::vector<ScalarVector>& alpha, const std::vector<ScalarVector>& stress) const;

  void writeGrids() const;
};
#endif