#ifndef SRC_HDF_RESTART_HDF_HH
#define SRC_HDF_RESTART_HDF_HH

#include <dune/fufem/hdf5/file.hh>
#include <dune/fufem/hdf5/sequenceio.hh>

template <class ProgramState> class RestartBodyIO {
public:
  RestartBodyIO(HDF5::Grouplike& group, const size_t vertexCount, const size_t id);

  void write(const ProgramState& programState);

  void read(size_t timeStep, ProgramState& programState);

private:
  const size_t id_;

  HDF5::SequenceIO<2> displacementWriter_;
  HDF5::SequenceIO<2> velocityWriter_;
  HDF5::SequenceIO<2> accelerationWriter_;
  HDF5::SequenceIO<1> stateWriter_;
  HDF5::SequenceIO<1> weightedNormalStressWriter_;
};

template <class ProgramState> class RestartIO {

public:
  RestartIO(HDF5::Grouplike& group, const std::vector<size_t>& vertexCounts);
  ~RestartIO();

  void write(const ProgramState& programState);

  void read(size_t timeStep, ProgramState& programState);

private:
  std::vector<RestartBodyIO<ProgramState>* > bodyIO_;

  HDF5::SequenceIO<0> relativeTimeWriter_;
  HDF5::SequenceIO<0> relativeTimeIncrementWriter_;
};
#endif