#ifndef LOGIN_HPP_INCLUDED
#define LOGIN_HPP_INCLUDED

#include "../../Core/Types/Box.hpp"
#include "../../Core/Classes/World.hpp"

#include <cstdint>
#include <string>
#include <vector>

namespace Login
{
    typedef enum LOGIN_SCREEN_STATE
    {
        WELCOME_SCREEN,
        PVP_WORLD,
        ENTER_CREDENTIALS,
        INVALID_CREDENTIALS,
        AUTHENTICATOR,
        FORGOTTEN_PASSWORD,
        RUNESCAPE_UPDATED,
        ACCOUNT_LOCKED,
        MEMBERS_AREA,
        MEMBERS_REQUIRED,
        WORLD_SELECT,
        ACCOUNT_DISABLED,
        ACCOUNT_LOGGED_IN,
        TOTAL_SKILL_REQUIRED,
        DISCONNECTED,
        CONNECTING,
        LOADING,
        LOBBY_SCREEN,
        LOGGED_IN
    } LOGIN_SCREEN_STATE;

    LOGIN_SCREEN_STATE GetLoginScreenState();

    bool LoginPlayer(bool SwitchToProfileWorld = true);
    bool EnterCredentials();

    bool IsWorldSelectOpen();
    bool OpenWorldSelect();
    bool CloseWorldSelect();

    bool SelectWorld();
    bool SelectWorld(const Internal::World& World);
    bool SelectWorld(std::int32_t WorldID);

    /**
    * @return X of where the login screen starts
    */
    std::int32_t GetScreenX();
    /**
    * @return X of where the login window starts
    */
    std::int32_t GetWindowX();

    /**
    * @return current state of the login caret
    * 0: Username line; 1: Password line;
    */
    std::int32_t GetCaretState();

    /**
    * @return a vector of login messages
    * 0: LoginMessage0; 1: LoginMessage1; 2: LoginMessage2;
    */
    std::vector<std::string> GetLoginMessages();

    /**
    * @return a vector of button boxes on the login screen
    * 0: Existing User; 1: Login; 2: Cancel; 3: Try Again; 4: World Select; 5: World Select Cancel;
    */
    std::vector<Box> GetButtonBoxes();

    bool WaitLoginScreenState(std::uint32_t Duration, std::uint32_t Step, Login::LOGIN_SCREEN_STATE State, bool Result = true);

}

#endif // LOGIN_HPP_INCLUDED
