#include <locale.h>
#include <stdlib.h>
#include <sys/syslog.h>

#include "multilanguage.h"
#include "common.h"
#include "ems/jsonct.h"
#include "pub_fun.h"
#include "ems/self_diagnosis.h"




char* support[] = {
    "en_US",
    "zh_CN"
};

bool sys_language_is_zh(void)
{
    return strcmp(getenv("LANG"), "zh_CN.UTF-8") == 0;
}

void global_init_by_sys_language(void)
{
#ifdef EN_EMS
    extern ems_base_variant_t ems_base_variant[];
    extern const int          g_ems_base_variant_count;

    extern cabinet_info_tab_t cabinet_info_tab[];
    extern int                cabinet_info_tab_count_g;
    extern self_diagnosis_it factory_it[];
    extern int               factory_it_count;
    extern self_diagnosis_it charge_it[];
    extern int               charge_it_count;
    extern ems_base_variant_t ems_microgri_variant[];
    extern int g_ems_microgri_count;
    extern ems_base_variant_t vlc_base_variant[];
    extern int g_vlc_variant_count;

    for (int i = 0; i < g_ems_base_variant_count; i++)
    {
        ems_base_variant[i].name = _(ems_base_variant[i].name);

        if (strlen(ems_base_variant[i].desc) > 0)
        {
            ems_base_variant[i].desc = _(ems_base_variant[i].desc);
        }
    }

    for (int i = 0; i < cabinet_info_tab_count_g; i++)
    {
        cabinet_info_tab[i].cab_show_name = _(cabinet_info_tab[i].cab_show_name);
    }

    for (int i = 0; i < factory_it_count; i++)
    {
        factory_it[i].name = _(factory_it[i].name);
    }

    for (int i = 0; i < charge_it_count; i++)
    {
        charge_it[i].name = _(charge_it[i].name);
    }

    for (int i = 0; i < g_ems_microgri_count; i++)
    {
        ems_microgri_variant[i].name = _(ems_microgri_variant[i].name);

        if (strlen(ems_microgri_variant[i].desc) > 0)
        {
            ems_microgri_variant[i].desc = _(ems_microgri_variant[i].desc);
        }
    }

    for (int i = 0; i < g_vlc_variant_count; i++)
    {
        vlc_base_variant[i].name = _(vlc_base_variant[i].name);

        if (strlen(vlc_base_variant[i].desc) > 0)
        {
            vlc_base_variant[i].desc = _(vlc_base_variant[i].desc);
        }
    }
#else
    extern ems_base_variant_t lc_base_variant[];
    extern const int          lc_base_variant_num;
    for(int i = 0; i < lc_base_variant_num; i++)
    {
        lc_base_variant[i].name = _(lc_base_variant[i].name);
        if (strlen(lc_base_variant[i].desc) > 0){
            lc_base_variant[i].desc = _(lc_base_variant[i].desc);
        }
    }
#endif
}

void init_multilanguage(void)
{
    setlocale(LC_ALL, "");
    /*
        #define MULTILANGUAGE_MO_PATH "/app/global/language"
        #define MULTILANGUAGE_MO_FILE "language"

        则语言文件路径则为
        /app/global/language/+/LC_MESSAGES/language.mo
        其中+为语言， 中文则为 zh_CN 
    */
    bindtextdomain(MULTILANGUAGE_MO_FILE, MULTILANGUAGE_MO_PATH);
    textdomain(MULTILANGUAGE_MO_FILE);

    // 获取当前系统语言
    global_init_by_sys_language();
}


int set_sys_language(char* lang)
{
    int ret = -2;
    for (int i = 0; i < sizeof(support) / sizeof(support[0]); i++)
    {
        if (strcmp(lang, support[i]) == 0)
        {
            ret = 0;
            break;
        }
    }
    if (ret != 0)
    {
        ems_syslog(LOG_ERR, "set language '%s' error", lang);
        return -2;
    }
    // 打开文件
    FILE* fp = fopen("/etc/default/locale", "w");
    if (fp == NULL)
    {
        ems_syslog(LOG_ERR, "open file '/etc/default/locale' error");
        return -1;
    }
    // 写入新的语言设置
    ret = fprintf(fp, "LANG=%s.UTF-8\n", lang) > 0? 0 : -1;
    // 关闭文件
    fclose(fp);
    return ret;
}
