#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"

el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject);
el_val_t lang_get(el_val_t profile, el_val_t key);
el_val_t lang_profile_en(void);
el_val_t lang_profile_ja(void);
el_val_t lang_profile_ar(void);
el_val_t lang_profile_zh(void);
el_val_t lang_profile_de(void);
el_val_t lang_profile_es(void);
el_val_t lang_profile_fi(void);
el_val_t lang_profile_sw(void);
el_val_t lang_profile_hi(void);
el_val_t lang_profile_ru(void);
el_val_t lang_profile_fr(void);
el_val_t lang_profile_la(void);
el_val_t lang_profile_he(void);
el_val_t lang_profile_sa(void);
el_val_t lang_profile_got(void);
el_val_t lang_profile_non(void);
el_val_t lang_profile_enm(void);
el_val_t lang_profile_pi(void);
el_val_t lang_profile_grc(void);
el_val_t lang_profile_ang(void);
el_val_t lang_profile_fro(void);
el_val_t lang_profile_goh(void);
el_val_t lang_profile_sga(void);
el_val_t lang_profile_txb(void);
el_val_t lang_profile_peo(void);
el_val_t lang_profile_akk(void);
el_val_t lang_profile_uga(void);
el_val_t lang_profile_egy(void);
el_val_t lang_profile_sux(void);
el_val_t lang_profile_gez(void);
el_val_t lang_profile_cop(void);
el_val_t lang_from_code(el_val_t code);
el_val_t lang_default(void);
el_val_t lang_is_isolating(el_val_t profile);
el_val_t lang_is_agglutinative(el_val_t profile);
el_val_t lang_is_fusional(el_val_t profile);
el_val_t lang_is_polysynthetic(el_val_t profile);
el_val_t lang_is_rtl(el_val_t profile);
el_val_t lang_has_null_subject(el_val_t profile);
el_val_t lang_has_case(el_val_t profile);
el_val_t lang_has_gender(el_val_t profile);
el_val_t lang_word_order(el_val_t profile);
el_val_t lang_code(el_val_t profile);

el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject) {
  el_val_t r = native_list_empty();
  r = native_list_append(r, EL_STR("code"));
  r = native_list_append(r, code);
  r = native_list_append(r, EL_STR("word_order"));
  r = native_list_append(r, word_order);
  r = native_list_append(r, EL_STR("morph_type"));
  r = native_list_append(r, morph_type);
  r = native_list_append(r, EL_STR("has_case"));
  r = native_list_append(r, has_case);
  r = native_list_append(r, EL_STR("has_gender"));
  r = native_list_append(r, has_gender);
  r = native_list_append(r, EL_STR("script_dir"));
  r = native_list_append(r, script_dir);
  r = native_list_append(r, EL_STR("agreement"));
  r = native_list_append(r, agreement);
  r = native_list_append(r, EL_STR("null_subject"));
  r = native_list_append(r, null_subject);
  return r;
  return 0;
}

el_val_t lang_get(el_val_t profile, el_val_t key) {
  el_val_t n = native_list_len(profile);
  el_val_t i = 0;
  while (i < (n - 1)) {
    el_val_t k = native_list_get(profile, i);
    if (str_eq(k, key)) {
      return native_list_get(profile, (i + 1));
    }
    i = (i + 2);
  }
  return EL_STR("");
  return 0;
}

el_val_t lang_profile_en(void) {
  return lang_profile(EL_STR("en"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_ja(void) {
  return lang_profile(EL_STR("ja"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_ar(void) {
  return lang_profile(EL_STR("ar"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("rtl"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_zh(void) {
  return lang_profile(EL_STR("zh"), EL_STR("SVO"), EL_STR("isolating"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_de(void) {
  return lang_profile(EL_STR("de"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_es(void) {
  return lang_profile(EL_STR("es"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_fi(void) {
  return lang_profile(EL_STR("fi"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_sw(void) {
  return lang_profile(EL_STR("sw"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("noun-class;number"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_hi(void) {
  return lang_profile(EL_STR("hi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_ru(void) {
  return lang_profile(EL_STR("ru"), EL_STR("free"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_fr(void) {
  return lang_profile(EL_STR("fr"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_la(void) {
  return lang_profile(EL_STR("la"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_he(void) {
  return lang_profile(EL_STR("he"), EL_STR("SVO"), EL_STR("semitic"), EL_STR("true"), EL_STR("false"), EL_STR("rtl"), EL_STR("number;person;gender"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_sa(void) {
  return lang_profile(EL_STR("sa"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_got(void) {
  return lang_profile(EL_STR("got"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_non(void) {
  return lang_profile(EL_STR("non"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_enm(void) {
  return lang_profile(EL_STR("enm"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_pi(void) {
  return lang_profile(EL_STR("pi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_grc(void) {
  return lang_profile(EL_STR("grc"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case;aspect"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_ang(void) {
  return lang_profile(EL_STR("ang"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_fro(void) {
  return lang_profile(EL_STR("fro"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_goh(void) {
  return lang_profile(EL_STR("goh"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_sga(void) {
  return lang_profile(EL_STR("sga"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_txb(void) {
  return lang_profile(EL_STR("txb"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_peo(void) {
  return lang_profile(EL_STR("peo"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_akk(void) {
  return lang_profile(EL_STR("akk"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_uga(void) {
  return lang_profile(EL_STR("uga"), EL_STR("VSO"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false"));
  return 0;
}

el_val_t lang_profile_egy(void) {
  return lang_profile(EL_STR("egy"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_sux(void) {
  return lang_profile(EL_STR("sux"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_gez(void) {
  return lang_profile(EL_STR("gez"), EL_STR("SOV"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true"));
  return 0;
}

el_val_t lang_profile_cop(void) {
  return lang_profile(EL_STR("cop"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false"));
  return 0;
}

el_val_t lang_from_code(el_val_t code) {
  if (str_eq(code, EL_STR("en"))) {
    return lang_profile_en();
  }
  if (str_eq(code, EL_STR("ja"))) {
    return lang_profile_ja();
  }
  if (str_eq(code, EL_STR("ar"))) {
    return lang_profile_ar();
  }
  if (str_eq(code, EL_STR("zh"))) {
    return lang_profile_zh();
  }
  if (str_eq(code, EL_STR("de"))) {
    return lang_profile_de();
  }
  if (str_eq(code, EL_STR("es"))) {
    return lang_profile_es();
  }
  if (str_eq(code, EL_STR("fi"))) {
    return lang_profile_fi();
  }
  if (str_eq(code, EL_STR("sw"))) {
    return lang_profile_sw();
  }
  if (str_eq(code, EL_STR("hi"))) {
    return lang_profile_hi();
  }
  if (str_eq(code, EL_STR("ru"))) {
    return lang_profile_ru();
  }
  if (str_eq(code, EL_STR("fr"))) {
    return lang_profile_fr();
  }
  if (str_eq(code, EL_STR("la"))) {
    return lang_profile_la();
  }
  if (str_eq(code, EL_STR("he"))) {
    return lang_profile_he();
  }
  if (str_eq(code, EL_STR("grc"))) {
    return lang_profile_grc();
  }
  if (str_eq(code, EL_STR("ang"))) {
    return lang_profile_ang();
  }
  if (str_eq(code, EL_STR("sa"))) {
    return lang_profile_sa();
  }
  if (str_eq(code, EL_STR("got"))) {
    return lang_profile_got();
  }
  if (str_eq(code, EL_STR("non"))) {
    return lang_profile_non();
  }
  if (str_eq(code, EL_STR("enm"))) {
    return lang_profile_enm();
  }
  if (str_eq(code, EL_STR("pi"))) {
    return lang_profile_pi();
  }
  if (str_eq(code, EL_STR("fro"))) {
    return lang_profile_fro();
  }
  if (str_eq(code, EL_STR("goh"))) {
    return lang_profile_goh();
  }
  if (str_eq(code, EL_STR("sga"))) {
    return lang_profile_sga();
  }
  if (str_eq(code, EL_STR("txb"))) {
    return lang_profile_txb();
  }
  if (str_eq(code, EL_STR("peo"))) {
    return lang_profile_peo();
  }
  if (str_eq(code, EL_STR("akk"))) {
    return lang_profile_akk();
  }
  if (str_eq(code, EL_STR("uga"))) {
    return lang_profile_uga();
  }
  if (str_eq(code, EL_STR("egy"))) {
    return lang_profile_egy();
  }
  if (str_eq(code, EL_STR("sux"))) {
    return lang_profile_sux();
  }
  if (str_eq(code, EL_STR("gez"))) {
    return lang_profile_gez();
  }
  if (str_eq(code, EL_STR("cop"))) {
    return lang_profile_cop();
  }
  return lang_profile_en();
  return 0;
}

el_val_t lang_default(void) {
  return lang_profile_en();
  return 0;
}

el_val_t lang_is_isolating(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("isolating"));
  return 0;
}

el_val_t lang_is_agglutinative(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("agglutinative"));
  return 0;
}

el_val_t lang_is_fusional(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("fusional"));
  return 0;
}

el_val_t lang_is_polysynthetic(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("polysynthetic"));
  return 0;
}

el_val_t lang_is_rtl(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("script_dir")), EL_STR("rtl"));
  return 0;
}

el_val_t lang_has_null_subject(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("null_subject")), EL_STR("true"));
  return 0;
}

el_val_t lang_has_case(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("has_case")), EL_STR("true"));
  return 0;
}

el_val_t lang_has_gender(el_val_t profile) {
  return str_eq(lang_get(profile, EL_STR("has_gender")), EL_STR("true"));
  return 0;
}

el_val_t lang_word_order(el_val_t profile) {
  return lang_get(profile, EL_STR("word_order"));
  return 0;
}

el_val_t lang_code(el_val_t profile) {
  return lang_get(profile, EL_STR("code"));
  return 0;
}

