#ifndef SQTYPE_H
#define SQTYPE_H

#define SQ_OK (1)
#define SQ_ERROR (-1)
#define SQ_FAILED(res) (res<0)
#define SQ_SUCCEEDED(res) (res>=0)

typedef char SQChar;
typedef float SQFloat;
typedef long SQInteger;
typedef unsigned long SQUnsignedInteger;

typedef SQUnsignedInteger SQBool;
typedef SQInteger SQRESULT;

struct SQVM
{
	char pad_0000[0x8];
	SQVM* m_pSqVTable;
	// !TODO: The rest.

	SQVM* GetVTable()
	{
		return m_pSqVTable;
	}
};
typedef SQVM* HSQUIRRELVM;

struct SQBufState
{
	const SQChar* buf;
	const SQChar* bufTail;
	const SQChar* bufCopy;

	SQBufState(const std::string& code)
	{
		buf = code.c_str();
		bufTail = code.c_str() + code.size();
		bufCopy = code.c_str();
	}
};

struct SQFuncRegistration
{
	const char* m_szScriptName; // 00
	const char* m_szNativeName; // 08
	const char* m_szHelpString; // 10
	const char* m_szRetValType; // 18
	const char* m_szArgTypes;   // 20
	std::int16_t unk28;         // 28
	std::int16_t padding1;      // 2A
	std::int32_t unk2c;         // 2C
	std::int64_t unk30;         // 30
	std::int32_t unk38;         // 38
	std::int32_t padding2;      // 3C
	std::int64_t unk40;         // 40
	std::int64_t unk48;         // 48
	std::int64_t unk50;         // 50
	std::int32_t unk58;         // 58
	std::int32_t padding3;      // 5C
	void* m_pFunction;          // 60

	SQFuncRegistration()
	{
		memset(this, '\0', sizeof(SQFuncRegistration));
		this->padding2 = 6;
	}
};

enum class SQCONTEXT : int
{
	SERVER = 0,
	CLIENT,
	UI,
	NONE
};

const static std::string SQVM_TYPE_T[4] =
{
	"SERVER",
	"CLIENT",
	"UI",
	"NONE"
};

const static std::string SQVM_LOG_T[4] =
{
	"Script(S):",
	"Script(C):",
	"Script(U):",
	"Script(X):"
};

const static std::string SQVM_WARNING_LOG_T[4] =
{
	"Script(S):Warning:",
	"Script(C):Warning:",
	"Script(U):Warning:",
	"Script(X):Warning:"
};

const static std::string SQVM_ANSI_LOG_T[4] =
{
	"\033[38;2;151;149;187mScript(S):",
	"\033[38;2;151;149;163mScript(C):",
	"\033[38;2;151;123;136mScript(U):",
	"\033[38;2;151;149;163mScript(X):"
};

const static std::string SQVM_WARNING_ANSI_LOG_T[4] =
{
	"\033[38;2;151;149;187mScript(S):\033[38;2;255;255;000mWarning:",
	"\033[38;2;151;149;163mScript(C):\033[38;2;255;255;000mWarning:",
	"\033[38;2;151;123;136mScript(U):\033[38;2;255;255;000mWarning:",
	"\033[38;2;151;149;163mScript(X):\033[38;2;255;255;000mWarning:"
};
#endif // SQTYPE_H
