#ifndef VTR_GEOMETRY_H
#define VTR_GEOMETRY_H
#include "vtr_range.h"

#include <vector>
#include <tuple>
#include <limits>

namespace vtr {

/*
 * Forward declarations
 */
template<class T>
class Point;

template<class T>
class Rect;

template<class T>
class Line;

template<class T>
class RectUnion;

template<class T>
bool operator==(Point<T> lhs, Point<T> rhs);
template<class T>
bool operator!=(Point<T> lhs, Point<T> rhs);
template<class T>
bool operator<(Point<T> lhs, Point<T> rhs);

template<class T>
bool operator==(const Rect<T>& lhs, const Rect<T>& rhs);
template<class T>
bool operator!=(const Rect<T>& lhs, const Rect<T>& rhs);

template<class T>
bool operator==(const RectUnion<T>& lhs, const RectUnion<T>& rhs);
template<class T>
bool operator!=(const RectUnion<T>& lhs, const RectUnion<T>& rhs);
/*
 * Class Definitions
 */

//A point in 2D space
template<class T>
class Point {
  public: //Constructors
    Point(T x_val, T y_val) noexcept;

  public: //Accessors
    //Coordinates
    T x() const;
    T y() const;

    friend bool operator== <>(Point<T> lhs, Point<T> rhs);
    friend bool operator!= <>(Point<T> lhs, Point<T> rhs);
    friend bool operator< <>(Point<T> lhs, Point<T> rhs);

  public: //Mutators
    /* Set x and y values */
    void set(T x_val, T y_val);
    void set_x(T x_val);
    void set_y(T y_val);
    /* Swap x and y values */
    void swap();

  private:
    T x_;
    T y_;
};

//A 2D rectangle
template<class T>
class Rect {
  public: //Constructors
    Rect(T left_val, T bottom_val, T right_val, T top_val);
    Rect(Point<T> bottom_left_val, Point<T> top_right_val);
    Rect();

  public: //Accessors
    //Co-ordinates
    T xmin() const;
    T xmax() const;
    T ymin() const;
    T ymax() const;

    Point<T> bottom_left() const;
    Point<T> top_right() const;

    T width() const;
    T height() const;

    //Returns true if the point is fully contained within the rectangle (excluding the top-right edges)
    bool contains(Point<T> point) const;

    //Returns true if the point is strictly contained within the region (excluding all edges)
    bool strictly_contains(Point<T> point) const;

    //Returns true if the point is coincident with the rectangle (including the top-right edges)
    bool coincident(Point<T> point) const;

    friend bool operator== <>(const Rect<T>& lhs, const Rect<T>& rhs);
    friend bool operator!= <>(const Rect<T>& lhs, const Rect<T>& rhs);

  public: //Mutators
    //Co-ordinates
    void set_xmin(T xmin_val);
    void set_ymin(T ymin_val);
    void set_xmax(T xmax_val);
    void set_ymax(T ymax_val);

  private:
    Point<T> bottom_left_;
    Point<T> top_right_;
};

//A 2D line
template<class T>
class Line {
  public: //Types
    typedef typename std::vector<Point<T>>::const_iterator point_iter;
    typedef vtr::Range<point_iter> point_range;

  public: //Constructors
    Line(std::vector<Point<T>> line_points);

  public: //Accessors
    //Returns the bounding box
    Rect<T> bounding_box() const;

    //Returns a range of constituent points
    point_range points() const;

  private:
    std::vector<Point<T>> points_;
};

//A union of 2d rectangles
template<class T>
class RectUnion {
  public: //Types
    typedef typename std::vector<Rect<T>>::const_iterator rect_iter;
    typedef vtr::Range<rect_iter> rect_range;

  public: //Constructors
    //Construct from a set of rectangles
    RectUnion(std::vector<Rect<T>> rects);

  public: //Accessors
    //Returns the bounding box of all rectangles in the union
    Rect<T> bounding_box() const;

    //Returns true if the point is fully contained within the region (excluding top-right edges)
    bool contains(Point<T> point) const;

    //Returns true if the point is strictly contained within the region (excluding all edges)
    bool strictly_contains(Point<T> point) const;

    //Returns true if the point is coincident with the region (including the top-right edges)
    bool coincident(Point<T> point) const;

    //Returns a range of all constituent rectangles
    rect_range rects() const;

    //Checks whether two RectUnions have identical representations
    // Note: does not check whether the representations they are equivalent
    friend bool operator== <>(const RectUnion<T>& lhs, const RectUnion<T>& rhs);
    friend bool operator!= <>(const RectUnion<T>& lhs, const RectUnion<T>& rhs);

  private:
    //Note that a union of rectanges may have holes and may not be contiguous
    std::vector<Rect<T>> rects_;
};

} // namespace vtr

#include "vtr_geometry.tpp"
#endif
