#include "Lang.h"
#include "iana_charset.h"
#include <cstring>

void languageToString ( unsigned char langId , char *buf ) {
	const char *p = getLanguageString ( langId );
	if ( ! p ) p = "ERROR";
	strcpy(buf,p);
}

static const char * const s_langStrings[] = {
	"Unknown",
	"English",
	"French",
	"Spanish",
	"Russian",
	"Turkish",
	"Japanese",
	"Chinese Traditional",
	"Chinese Simplified",
	"Korean",
	"German",
	"Dutch",
	"Italian",
	"Finnish",
	"Swedish",
	"Norwegian",
	"Portuguese",
	"Vietnamese",
	"Arabic",
	"Hebrew",
	"Indonesian",
	"Greek",
	"Thai",
	"Hindi",
	"Bengala",
	"Polish",
	"Tagalog",
	"Latin",
	"Esperanto",
	"Catalan",
	"Bulgarian",
	"Translingual",
	"Serbo-Croatian",
	"Hungarian",
	"Danish",
	"Lithuanian",
	"Czech",
	"Galician",
	"Georgian",
	"Scottish Gaelic",
	"Gothic",
	"Romanian",
	"Irish",
	"Latvian",
	"Armenian",
	"Icelandic",
	"Ancient Greek",
	"Manx",
	"Ido",
	"Persian",
	"Telugu",
	"Venetian",
	"Malagasy",
	"Kurdish",
	"Luxembourgish",
	"Estonian",
	NULL
};

const char* getLanguageString ( unsigned char langId ) {
	if ( langId >= sizeof(s_langStrings)/sizeof(char *) ) return NULL;
	return s_langStrings[langId];
}

static const char * const s_langAbbr[] = {
	"xx",
	"en",
	"fr",
	"es",
	"ru",
	"tr",
	"ja",
	"zh_tw",
	"zh_cn",
	"ko",
	"de",
	"nl",
	"it",
	"fi",
	"sv",
	"no",
	"pt",
	"vi",
	"ar",
	"he",
	"id",
	"el",
	"th",
	"hi",
	"bn",
	"pl",
	"tl",
	"la", // latin
	"eo", // esperanto
	"ca", // catalan
	"bg", // bulgarian
	"tx", // translingual
	"sr", // serbo-crotian
	"hu", // hungarian
	"da", // danish
	"lt", // lithuanian
	"cs", // czech
	"gl", // galician
	"ka", // georgian
	"gd", // scottish gaelic
	"go", // gothic, MADE UP!
	"ro", // romanian
	"ga", // irish
	"lv", // latvian
	"hy", // armenian
	"is", // icelandic
	"ag", // ancient gree, MADE UP!
	"gv", // manx
	"io", // ido
	"fa", // persian
	"te", // telugu
	"vv", // venetian MADE UP!
	"mg", // malagasy
	"ku", // kurdish
	"lb", // luxembourgish
	"et", // estonian
	NULL
};

uint8_t getLangIdFromAbbr ( const char *abbr ) {
	for (int x = 0; x < langLast && s_langAbbr[x]; ++x) {
		if (!strcasecmp((char*)abbr, s_langAbbr[x])) {
			return x;
		}
	}

	// english?
	if ( ! strcasecmp((char *)abbr,"en_uk")) {
		return langEnglish;
	}

	if ( ! strcasecmp((char *)abbr,"en_us")) {
		return langEnglish;
	}

	return langUnknown;
}

uint8_t getLangIdFromCharset(uint16_t charset) {
	switch (charset) {
		case csISO58GB231280:
		case csGBK:
		case csGB18030:
		case csGB2312:
			return langChineseSimp;
		case csBig5:
			return langChineseTrad;
		case csHalfWidthKatakana:
		case csJISEncoding:
		case csxsjis:
		case csEUCJP:
		case csEUCFixWidJapanese:
		case csISO2022JP:
		case csISO2022JP2:
		case csISO13JISC6220jp:
			return langJapanese;
		case csKSC56011987:
		case csISO2022KR:
		case csEUCKR:
			return langKorean;
		default:
			return langUnknown;
	}
}

const char* getLanguageAbbr ( unsigned char langId ) {
	if ( langId >= sizeof(s_langAbbr)/sizeof(char *) ) {
		return NULL;
	}

	return s_langAbbr[langId];
}