package eu.eudat.models.rda;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import java.util.HashMap;
import java.util.Map;

public enum Language {

	AAR("aar"),
	ABK("abk"),
	AFR("afr"),
	AKA("aka"),
	AMH("amh"),
	ARA("ara"),
	ARG("arg"),
	ASM("asm"),
	AVA("ava"),
	AVE("ave"),
	AYM("aym"),
	AZE("aze"),
	BAK("bak"),
	BAM("bam"),
	BEL("bel"),
	BEN("ben"),
	BIH("bih"),
	BIS("bis"),
	BOD("bod"),
	BOS("bos"),
	BRE("bre"),
	BUL("bul"),
	CAT("cat"),
	CES("ces"),
	CHA("cha"),
	CHE("che"),
	CHU("chu"),
	CHV("chv"),
	COR("cor"),
	COS("cos"),
	CRE("cre"),
	CYM("cym"),
	DAN("dan"),
	DEU("deu"),
	DIV("div"),
	DZO("dzo"),
	ELL("ell"),
	ENG("eng"),
	EPO("epo"),
	EST("est"),
	EUS("eus"),
	EWE("ewe"),
	FAO("fao"),
	FAS("fas"),
	FIJ("fij"),
	FIN("fin"),
	FRA("fra"),
	FRY("fry"),
	FUL("ful"),
	GLA("gla"),
	GLE("gle"),
	GLG("glg"),
	GLV("glv"),
	GRN("grn"),
	GUJ("guj"),
	HAT("hat"),
	HAU("hau"),
	HBS("hbs"),
	HEB("heb"),
	HER("her"),
	HIN("hin"),
	HMO("hmo"),
	HRV("hrv"),
	HUN("hun"),
	HYE("hye"),
	IBO("ibo"),
	IDO("ido"),
	III("iii"),
	IKU("iku"),
	ILE("ile"),
	INA("ina"),
	IND("ind"),
	IPK("ipk"),
	ISL("isl"),
	ITA("ita"),
	JAV("jav"),
	JPN("jpn"),
	KAL("kal"),
	KAN("kan"),
	KAS("kas"),
	KAT("kat"),
	KAU("kau"),
	KAZ("kaz"),
	KHM("khm"),
	KIK("kik"),
	KIN("kin"),
	KIR("kir"),
	KOM("kom"),
	KON("kon"),
	KOR("kor"),
	KUA("kua"),
	KUR("kur"),
	LAO("lao"),
	LAT("lat"),
	LAV("lav"),
	LIM("lim"),
	LIN("lin"),
	LIT("lit"),
	LTZ("ltz"),
	LUB("lub"),
	LUG("lug"),
	MAH("mah"),
	MAL("mal"),
	MAR("mar"),
	MKD("mkd"),
	MLG("mlg"),
	MLT("mlt"),
	MON("mon"),
	MRI("mri"),
	MSA("msa"),
	MYA("mya"),
	NAU("nau"),
	NAV("nav"),
	NBL("nbl"),
	NDE("nde"),
	NDO("ndo"),
	NEP("nep"),
	NLD("nld"),
	NNO("nno"),
	NOB("nob"),
	NOR("nor"),
	NYA("nya"),
	OCI("oci"),
	OJI("oji"),
	ORI("ori"),
	ORM("orm"),
	OSS("oss"),
	PAN("pan"),
	PLI("pli"),
	POL("pol"),
	POR("por"),
	PUS("pus"),
	QUE("que"),
	ROH("roh"),
	RON("ron"),
	RUN("run"),
	RUS("rus"),
	SAG("sag"),
	SAN("san"),
	SIN("sin"),
	SLK("slk"),
	SLV("slv"),
	SME("sme"),
	SMO("smo"),
	SNA("sna"),
	SND("snd"),
	SOM("som"),
	SOT("sot"),
	SPA("spa"),
	SQI("sqi"),
	SRD("srd"),
	SRP("srp"),
	SSW("ssw"),
	SUN("sun"),
	SWA("swa"),
	SWE("swe"),
	TAH("tah"),
	TAM("tam"),
	TAT("tat"),
	TEL("tel"),
	TGK("tgk"),
	TGL("tgl"),
	THA("tha"),
	TIR("tir"),
	TON("ton"),
	TSN("tsn"),
	TSO("tso"),
	TUK("tuk"),
	TUR("tur"),
	TWI("twi"),
	UIG("uig"),
	UKR("ukr"),
	URD("urd"),
	UZB("uzb"),
	VEN("ven"),
	VIE("vie"),
	VOL("vol"),
	WLN("wln"),
	WOL("wol"),
	XHO("xho"),
	YID("yid"),
	YOR("yor"),
	ZHA("zha"),
	ZHO("zho"),
	ZUL("zul");
	private final String value;
	private final static Map<String, Language> CONSTANTS = new HashMap<>();

	static {
		for (Language c: values()) {
			CONSTANTS.put(c.value, c);
		}
	}

	private Language(String value) {
		this.value = value;
	}

	@Override
	public String toString() {
		return this.value;
	}

	@JsonValue
	public String value() {
		return this.value;
	}

	@JsonCreator
	public static Language fromValue(String value) {
		Language constant = CONSTANTS.get(value);
		if (constant == null) {
			throw new IllegalArgumentException(value);
		} else {
			return constant;
		}
	}

}
