#ifndef INTERACT_HPP_INCLUDED
#define INTERACT_HPP_INCLUDED

#include "../../Core/Input.hpp"
#include "../../Core/Internal.hpp"
#include <functional>
#include <string>
#include <cstdint>

namespace Interact
{
    bool MoveMouse(const Point& P);
    bool MoveMouse(const Box& B);

    bool Click(const Button& B = BUTTON_LEFT);

    bool Click(const Point& P, const Button& B = BUTTON_LEFT);
    bool Click(const Point& P, const std::string& Option, const std::string& Target = "");
    bool Click(const Point& P, const std::vector<std::string>& Options, const std::string& Target = "");

    bool Click(const Box& B, const Button& Button = BUTTON_LEFT);
    bool Click(const Box& B, const std::string& Option, const std::string& Target = "");
    bool Click(const Box& B, const std::vector<std::string>& Options, const std::string& Target = "");

    bool Click(const Convex& C, const Button& B = BUTTON_LEFT);
    bool Click(const Convex& C, const std::string& Option, const std::string& Target = "");
    bool Click(const Convex& C, const std::vector<std::string>& Options, const std::string& Target = "");

    bool Scroll(const ScrollDirection& Direction);
    bool ScrollUntil(const ScrollDirection& Direction, std::int32_t Duration, const std::function<bool()>& Func);

    bool UpKey(std::int32_t Key);
    bool DownKey(std::int32_t Key);
    bool ReleaseKey(std::int32_t Key);
    bool HoldKey(std::int32_t Key, std::uint32_t Duration);
    bool TypeKey(std::int32_t Key);
    bool TypeString(const std::string& String, bool PressEnter = false);
}

#endif // INTERACT_HPP_INCLUDED
