#ifndef SRC_VTK_BODYWRITER_HH
#define SRC_VTK_BODYWRITER_HH

#include <dune/grid/io/file/vtk/vtkwriter.hh>
#include <dune/fufem/functions/vtkbasisgridfunction.hh>
#include "../utils/debugutils.hh"

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

public:
  VTKBodyWriter(CellBasis const &cellBasis, VertexBasis const &vertexBasis, std::string prefix) :
    cellBasis_(cellBasis), vertexBasis_(vertexBasis), prefix_(prefix)
  {}

  template <class Vector, class ScalarVector>
  void write(size_t record, Vector const &u, Vector const &v,
             ScalarVector const &alpha, ScalarVector const &stress) const {
      Dune::VTKWriter<typename VertexBasis::GridView> writer(
          vertexBasis_.getGridView());

      auto const displacementPointer =
          std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>(
              vertexBasis_, u, "displacement");
      writer.addVertexData(displacementPointer);

      auto const velocityPointer =
          std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>(
              vertexBasis_, v, "velocity");
      writer.addVertexData(velocityPointer);

      auto const AlphaPointer =
          std::make_shared<VTKBasisGridFunction<VertexBasis, ScalarVector> const>(
              vertexBasis_, alpha, "Alpha");
      writer.addVertexData(AlphaPointer);

      auto const stressPointer =
          std::make_shared<VTKBasisGridFunction<CellBasis, ScalarVector> const>(
              cellBasis_, stress, "stress");
      writer.addCellData(stressPointer);

      std::string const filename = prefix_ + "_" + std::to_string(record);
      writer.write(filename.c_str(), Dune::VTK::appendedraw);
  }

  void writeGrid() const {
      Dune::VTKWriter<typename VertexBasis::GridView> writer(
          vertexBasis_.getGridView());

      std::string const filename = prefix_ + "_grid";
      writer.write(filename.c_str(), Dune::VTK::appendedraw);
  }
};

#endif