#ifndef MESH_HPP
#define MESH_HPP

#include <Kokkos_Core.hpp>
#include <TinyVector.hpp>

template <typename ConnectivityType>
class Mesh
{
public:
  typedef ConnectivityType Connectivity;
  static constexpr size_t dimension = ConnectivityType::dimension;
  typedef TinyVector<dimension> Rd;

private:
  const Connectivity& m_connectivity;
  Kokkos::View<Rd*> m_xr;

public:

  const Connectivity& connectivity() const
  {
    return m_connectivity;
  }

  const size_t& numberOfNodes() const
  {
    return m_connectivity.numberOfNodes();
  }

  const size_t& numberOfFaces() const
  {
    return m_connectivity.numberOfFaces();
  }

  const size_t& numberOfCells() const
  {
    return m_connectivity.numberOfCells();
  }

  Kokkos::View<Rd*> xr()
  {
    return m_xr;
  }

  const Kokkos::View<const Rd*> xr() const
  {
    return m_xr;
  }

  // pas constant

  // Mesh(const Connectivity& connectivity)
  //: m_connectivity(connectivity),
  // m_xr("xr", connectivity.numberOfNodes())
  //{
  // const double delta_x = 1./connectivity.numberOfCells();
  // Kokkos::parallel_for(connectivity.numberOfNodes(), KOKKOS_LAMBDA(const int& r){
  //	m_xr[r][0] = r*delta_x;
  // });
  //}

  // pas non constant

  //Mesh(const Connectivity& connectivity)
  //  : m_connectivity(connectivity),
  //   m_xr("xr", connectivity.numberOfNodes())
  //{
  // const double delta_x = 1./connectivity.numberOfCells();
  // Kokkos::parallel_for(connectivity.numberOfNodes(), KOKKOS_LAMBDA(const int& r){
  //	if (r%2 == 0) {
  //	  m_xr[r][0] = r*delta_x;
  //	}
  //	else {
  //	  m_xr[r][0] = (r*2+1)*0.5*delta_x;
  //	}
  //  });
  //}

  // pas non constant avec fonction x^2

  Mesh(const Connectivity& connectivity)
    : m_connectivity(connectivity),
      m_xr("xr", connectivity.numberOfNodes())
  {
    const double delta_x = 1./connectivity.numberOfCells();
    Kokkos::parallel_for(connectivity.numberOfNodes(), KOKKOS_LAMBDA(const int& r){
  	m_xr[r][0] = r*delta_x;
      });
    Kokkos::parallel_for(connectivity.numberOfNodes(), KOKKOS_LAMBDA(const int& r){
    	m_xr[r][0] = m_xr[r][0]*m_xr[r][0];
    });
  }

  ~Mesh()
  {
    ;
  }
};

#endif // MESH_HPP