#ifndef TILE_HPP_INCLUDED
#define TILE_HPP_INCLUDED

#include <iostream>
#include <cstdint>

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

        /**
        * @brief Default Constructor, constructs a Tile with -1 as the X, Y, and Plane
        * @par Description
        *   Default Constructor, constructs a Tile with -1 as the X, Y, and Plane
        */
        Tile();
        /**
        * @brief Constructs a Tile based on an X, Y, and a Plane
		* @param std::int32_t X The X of the Tile
		* @param std::int32_t Y The Y of the Tile
		* @param std::int32_t Y The Plane the Tile is on
		*/
        Tile(std::int32_t X, std::int32_t Y, std::int32_t Plane);
        /**
        * @brief Constructs a Tile, by copying another
		* @param const Tile& T The Tile to "copy"
		*/
        Tile(const Tile& T);
        /**
        * @brief Returns the distance from one Tile to another
        * @return The distance from one Tile to another
        */
        double DistanceFrom(const Tile& T) const;
        /**
        * @brief Returns True if the Tile is less than 0, not equal to
        * @return True if the Tile is less than 0, not equal to
        */
        bool IsNegative() const;
        /**
        * @brief Returns True if the Tile is greater than 0, not equal to
        * @return True if the Tile is greater than 0, not equal to
        */
        bool IsPositive() const;
        bool operator==(const Tile& T) const;
        bool operator!=(const Tile& T) const;

        Tile operator+(const Tile& T) const;
        Tile operator-(const Tile& T) const;
        Tile& operator+=(const Tile& T);
        Tile& operator-=(const Tile& T);

        friend std::ostream& operator<<(std::ostream& OS, const Tile& T);
        ~Tile();
};

/** @} */

#endif // TILE_HPP_INCLUDED
