#ifndef SRC_MULTI_BODY_PROBLEM_DATA_CUBOIDGEOMETRY_HH
#define SRC_MULTI_BODY_PROBLEM_DATA_CUBOIDGEOMETRY_HH

#include <vector>

#include <dune/common/fvector.hh>
#include <dune/common/parametertree.hh>

#include <dune/fufem/geometry/convexpolyhedron.hh>

template <class ctype = double>
class CuboidGeometry {
public:
    typedef Dune::FieldVector<ctype, MY_DIM> GlobalCoords;
    using WeakeningRegion = ConvexPolyhedron<GlobalCoords>;

    static constexpr double lengthScale() {
        return 1.0;
    } // scaling factor

private:
    const ctype length_;
    const ctype height_;
#if MY_DIM == 3
    const ctype depth_;
#endif

    // corners of cube
    const GlobalCoords lowerLeft_;
    const GlobalCoords lowerRight_;
    const GlobalCoords upperRight_;
    const GlobalCoords upperLeft_;

    // weakening regions
    std::vector<WeakeningRegion> weakeningRegions_;

public:
#if MY_DIM == 3
    CuboidGeometry(const GlobalCoords& origin,
                   const double length = 1.00, const double height = 0.27, const double depth = 0.60);

    const auto& depth() const {
        return depth_;
    }
#else
    CuboidGeometry(const GlobalCoords& origin,
                       const double length = 1.00, const double height = 0.27);
#endif

    void addWeakeningRegion(const WeakeningRegion& weakeningRegion);
    void addWeakeningPatch(const Dune::ParameterTree& parset, const GlobalCoords& vertex0, const GlobalCoords& vertex1);

    const auto& lowerLeft() const {
        return lowerLeft_;
    }

    const auto& lowerRight() const {
        return lowerRight_;
    }

    const auto& upperRight() const {
        return upperRight_;
    }

    const auto& upperLeft() const {
        return upperLeft_;
    }

    const auto& weakeningRegions() const {
        return weakeningRegions_;
    }

    void write() const;

   // void render() const;
};
#endif