#include "translation.hpp"
#include <libintl.h>
#include <locale.h>
#include "config.h"
static const char *orig_language;
static const char *cur_locale_dir;
static const char *cur_locale;
const char *tr_ctx(const char *ctx, const char *msgid) {
    std::string msg_ctxt_id = (std::string(ctx) + std::string("\004") + std::string(msgid));
    const char *translation = gettext(msg_ctxt_id.c_str());
    if (std::string(translation) == msg_ctxt_id) {
        return msgid;
    } else {
        return translation;
    }
}
const char *tr(const char *msgid) {
    return gettext(msgid);
}
void set_language(const char *language) {
    if (language == nullptr) {
        language = "";
    }
    #ifdef LIBINTL_LITE_API
    if (language[0] == '\0') {
        setenv("LANGUAGE", orig_language, 1);
    } else {
        setenv("LANGUAGE", language, 1);
    }
    #else
    setlocale(LC_ALL, language);
    #endif

    bindtextdomain(cur_locale, cur_locale_dir);
    textdomain(cur_locale);
}
char *get_language() {
    #ifdef LIBINTL_LITE_API
    return getenv("LANGUAGE");
    #else
    return setlocale(LC_MESSAGES, NULL);
    #endif
}
void setup_locale(const char *locale, const char *locale_dir) {
    if (orig_language == nullptr) {
        orig_language = getenv("LANGUAGE");
        if (orig_language == nullptr) {
            orig_language = "C.UTF-8";
        }
    }
    if (locale_dir == nullptr) {
        if (cur_locale_dir == nullptr) {
            locale_dir = LOCALE_DIR;
        } else {
            locale_dir = cur_locale_dir;
        }
    }
    if (cur_locale_dir == nullptr) {
        cur_locale_dir = locale_dir;
    }
    cur_locale = locale;
    set_language();
}