#ifndef POINT_HPP_INCLUDED
#define POINT_HPP_INCLUDED

#include <cstdint>
#include "Box.hpp"

class Box;

/** @addtogroup Types
* @{ */
class Point
{
    public:
        /**
		* @brief The X of the Point
		* @par Description
		* The X of the Point
		*/
        std::int32_t X;
        /**
		* @brief The Y of the Point
		* @par Description
		* The Y of the Point
		*/
        std::int32_t Y;

        /**
        * @brief Default Constructor, constructs a Point with -1 as the X, Y, and Plane
        * @par Description
        *   Default Constructor, constructs a Point with -1 as the X, Y, and Plane
        */
        Point();
        /**
        * @brief Constructs a Point based on an X and Y
		* @param std::int32_t X The X of the Point
		* @param std::int32_t Y The Y of the Point
		*/
        Point(std::int32_t X, std::int32_t Y);
        /**
        * @brief Constructs a Point, by copying another
		* @param const Point& P The Point to "copy"
		*/
        Point(const Point& P);

        /**
        * @brief Returns the distance from one Point to another
        * @return The distance from one Point to another
        */
        double DistanceFrom(const Point& P) const;
        /**
        * @brief Returns True if the Point is inside the passed Box
        * @return True if the Point is inside the passed Box
        */
        bool InBox(const Box& B) const;
        /**
        * @brief Returns True if the Point is inside a Circle defined by a starting Point, and Radius
        * @return True if the Point is inside a Circle defined by a starting Point, and Radius
        */
        bool InCircle(const Point& P, std::int32_t Radius) const;
        /**
        * @brief Returns True if the Point is less than 0, not equal to
        * @return True if the Point is less than 0, not equal to
        */
        bool IsNegative() const;
        /**
        * @brief Returns True if the Point is greater than 0, not equal to
        * @return True if the Point is greater than 0, not equal to
        */
        bool IsPositive() const;
        /**
		* @brief Returns True if the Point is within the bounds of Client Canvas
		* @return True if the Point is within the bounds of Client Canvas
		*/
        bool OnScreen() const;
        bool operator==(const Point& P) const;
        bool operator!=(const Point& P) const;
        Point operator+(const Point& P) const;
        Point operator-(const Point& P) const;
        Point& operator+=(const Point& P);
        Point& operator-=(const Point& P);
        friend std::ostream& operator<<(std::ostream& OS, const Point& P);
        ~Point();
};

/** @} */

#endif // POINT_HPP_INCLUDED
