#ifndef INTERACTABLEGROUNDITEM_HPP_INCLUDED
#define INTERACTABLEGROUNDITEM_HPP_INCLUDED

#include "../../Core/Classes/GroundItem.hpp"
#include "../../Core/Classes/ItemInfo.hpp"
#include "../../Core/Types/Tile.hpp"
#include "../../Core/Types/Point.hpp"
#include "../../Core/Types/Box.hpp"
#include "../../Core/Types/Convex.hpp"
#include "../../Core/Types/Wireframe.hpp"
#include "../../Core/Input.hpp"
#include "../../Game/Tools/Camera.hpp"
#include <cstdint>
#include <functional>

namespace Interactable
{
    class GroundItem : public Internal::GroundItem
    {
        private:
            Tile LocalTile;
        public:
            GroundItem(const Internal::GroundItem& G);
            GroundItem(const Internal::GroundItem& G, const Tile& LocalTile);

            GroundItem() = default;
            GroundItem(GroundItem&& Obj) = default;
            GroundItem(const GroundItem& Obj) = default;
            GroundItem& operator=(GroundItem&& Obj) = default;
            GroundItem& operator=(const GroundItem& Obj) = default;

            std::string GetName() const;
            Internal::ItemInfo GetInfo() const;

            std::vector<Point> GetModel() const;
            Wireframe GetWireframe() const;

            Convex GetConvex() const;
            Box GetBox() const;
            Point GetPoint() const;
            Point GetPoint(double PointGenAccuracy) const;

            double GetVisibility() const;
            Tile GetTile() const;
            Tile GetLocalTile() const;
            Tile GetReachableTile() const;
            bool IsReachable() const;
            bool RotateTo(std::int32_t Angle = 0) const;
            bool RotateTo(Camera::COMPASS_DIRECTION Direction) const;

            bool Hover() const;
            bool Interact(const Button& B = BUTTON_LEFT) const;
            bool Interact(const std::string& Option, bool CheckTarget = true) const;
            bool Interact(const std::vector<std::string>& Options, bool CheckTarget = true) const;
            bool Interact(const std::function<bool (const std::vector<Point>&)>& InteractMethod) const;

    };
}


#endif // INTERACTABLEGROUNDITEM_HPP_INCLUDED
