#ifndef LOCALIZE_H
#define LOCALIZE_H

// direct references to localized strings
typedef unsigned long StringIndex_t;
const unsigned long INVALID_LOCALIZE_STRING_INDEX = (StringIndex_t)-1;

abstract_class ILocalize : public IAppSystem
{
public:
	virtual bool LoadLocalizationFileLists() = 0;

	// adds the contents of a file to the localization table
	virtual bool AddFile(const char* fileName, const char* pPathID = NULL) = 0;

	// Remove all strings from the table
	virtual void RemoveAll() = 0;

	// Finds the localized text for tokenName
	virtual wchar_t* Find(char const* tokenName) = 0;

	virtual void* FindIndex_Unknown(StringIndex_t index) = 0;

	// converts an english string to unicode
	// returns the number of wchar_t in resulting string, including null terminator
	virtual int ConvertANSIToUnicode(const char* ansi, OUT_Z_BYTECAP(unicodeBufferSizeInBytes) wchar_t* unicode, ssize_t unicodeBufferSizeInBytes) = 0;

	// converts an unicode string to an english string
	// unrepresentable characters are converted to system default
	// returns the number of characters in resulting string, including null terminator
	virtual int ConvertUnicodeToANSI(const wchar_t* unicode, OUT_Z_BYTECAP(ansiBufferSize) char* ansi, ssize_t ansiBufferSize) = 0;


	virtual StringIndex_t FindIndex(StringIndex_t index) = 0;

	//!!! TODO !!!
  //void* func_80[3];


  //virtual void ConstructString(CLocalize*, char*, __int64, __int64, ...);

  //__int64(__fastcall* GetNameByIndex)(CLocalize*, int);
  //__int64(__fastcall* GetValueByIndex)(CLocalize*, int);
  //__int64(__fastcall* GetFirstStringIndex)(CLocalize*);
  //__int64(__fastcall* GetNextStringIndex)(CLocalize*, int);


  //void* func_C0[6];


  //__int64(__fastcall* ReloadLocalizationFiles)(CLocalize*);


  //void* func_F8[6];


  //__int64(__fastcall* ConvertANSIToUCS2)(CLocalize*, const char*, void*, __int64);
  //void(__fastcall* ConvertUCS2ToANSI)(CLocalize*, __int16*, char*, int);
};

inline const char* const g_LanguageNames[] = {
	"english",
	"german",
	"french",
	"italian",
	"korean",
	"spanish",
	"mspanish",
	"schinese",
	"tchinese",
	"russian",
	"japanese",
	"portuguese",
	"polish",
};

inline const char* const g_LanguageCodes[] = {
	"en_US",
	"de_DE",
	"fr_FR",
	"it_IT",
	"ko_KR",
	"es_ES",
	"es_MX",
	"zh_CN",
	"zh_TW",
	"ru_RU",
	"ja_JP",
	"pt_BR",
	"pl_PL",
};

inline bool V_LocaleNameExists(const char* const localeName)
{
	for (size_t i = 0; i < V_ARRAYSIZE(g_LanguageNames); i++)
	{
		if (V_strcmp(localeName, g_LanguageNames[i]) == NULL)
		{
			return true;
		}
	}

	return false;
}

inline bool V_LocaleCodeExists(const char* const localeCode)
{
	for (size_t i = 0; i < V_ARRAYSIZE(g_LanguageCodes); i++)
	{
		if (V_strcmp(localeCode, g_LanguageCodes[i]) == NULL)
		{
			return true;
		}
	}

	return false;
}

#endif // LOCALIZE_H