#ifndef DEBUG_HPP_INCLUDED
#define DEBUG_HPP_INCLUDED

#include "../../Include/Core/Types/Logger.hpp"

#define DEBUG_VERBOSE_START                 Debug::Verbose++ << __PRETTY_FUNCTION__ << " > Started" << std::endl
#define DEBUG_VERBOSE_SUCCESS               --Debug::Verbose << __PRETTY_FUNCTION__ << " > Succeeded > "
#define DEBUG_VERBOSE_SUCCESS_NOINFO        --Debug::Verbose << __PRETTY_FUNCTION__ << " > Succeeded" << std::endl
#define DEBUG_VERBOSE_SUCCESS_EOF           --Debug::Verbose << " > Succeeded > Reached end of function" << std::endl
#define DEBUG_VERBOSE_FAIL                  --Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed > "
#define DEBUG_VERBOSE_FAIL_NOINFO           --Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed" << std::endl;
#define DEBUG_VERBOSE_FAIL_EOF              --Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed > Reached end of function" << std::endl

#define DEBUG_VERBOSE_LOG                       Debug::Verbose << __PRETTY_FUNCTION__ << " > "
#define DEBUG_VERBOSE_LOG_SUCCESS               Debug::Verbose << __PRETTY_FUNCTION__ << " > Succeeded > "
#define DEBUG_VERBOSE_LOG_SUCCESS_NOINFO        Debug::Verbose << __PRETTY_FUNCTION__ << " > Succeeded" << std::endl
#define DEBUG_VERBOSE_LOG_SUCCESS_EOF           Debug::Verbose << __PRETTY_FUNCTION__ << " > Succeeded > Reached end of function" << std::endl
#define DEBUG_VERBOSE_LOG_FAIL                  Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed > "
#define DEBUG_VERBOSE_LOG_FAIL_NOINFO           Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed" << std::endl
#define DEBUG_VERBOSE_LOG_FAIL_EOF              Debug::Verbose << __PRETTY_FUNCTION__ << " > Failed > Reached end of function" << std::endl

namespace Debug
{
    extern Logger Info;
    extern Logger Verbose;
    extern Logger Warning;
    extern Logger Error;
    extern Logger Fatal;
    extern Logger Internal;
    extern Logger Paint;

    void ShowConsole();
    void HideConsole();
    void SetVerbose(bool Toggle);

    void EnableInput();
    void DisableInput();

    void Clear();
    void Screenshot(const std::string& Path);
    void SetSleepMultiplier(std::int32_t Multiplier);

    void EnableBlit();
    void DisableBlit();

}


#endif // DEBUG_HPP_INCLUDED
