#ifndef VTR_GEOMETRY_H
#define VTR_GEOMETRY_H
#include "vtr_range.h"
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==(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);

    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);
    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);

    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);

    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

#include "vtr_geometry.tpp"
#endif
