//
//  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
//
//  Distributed under the Boost Software License, Version 1.0. (See
//  accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <locale.h>
#include <locale>
#include <time.h>
#include <stdexcept>

#include <boost/locale.hpp>
#ifdef BOOST_LOCALE_WITH_ICU
#include <unicode/uversion.h>
#endif

#include "test_locale_tools.hpp"


char const *env(char const *s)
{
    char const *r=getenv(s);
    if(r)
        return r;
    return "";
}

void check_locale(char const **names)
{
    std::cout << "  " << std::setw(32) << "locale" << std::setw(4) << "C" << std::setw(4) << "C++" << std::endl;
    while(*names) {
        char const *name = *names;
        std::cout << "  " << std::setw(32) << name << std::setw(4);
        if(setlocale(LC_ALL,name)!=0)
            std::cout << "Yes";
        else
            std::cout << "No";
        std::cout << std::setw(4);
        try {
            std::locale l(name);
            std::cout << "Yes";
        }
        catch(std::exception const &) {
            std::cout << "No";
        }
        std::cout << std::endl;
        names++;
    }
}

int main()
{
    std::cout << "- Backends: ";
    #ifdef BOOST_LOCALE_WITH_ICU
    std::cout << "icu:" << U_ICU_VERSION << " ";
    #endif
    #ifndef BOOST_LOCALE_NO_STD_BACKEND
    std::cout << "std ";
    #endif
    #ifndef BOOST_LOCALE_NO_POSIX_BACKEND
    std::cout << "posix ";
    #endif
    #ifndef BOOST_LOCALE_NO_WINAPI_BACKEND
    std::cout << "winapi";
    #endif
    std::cout << std::endl;
    #ifdef BOOST_LOCALE_WITH_ICONV
    std::cout << "- With iconv" << std::endl;
    #else
    std::cout << "- Without iconv" << std::endl;
    #endif
    std::cout << "- Environment " << std::endl;
    std::cout << "  LANG="<< env("LANG") << std::endl;
    std::cout << "  LC_ALL="<< env("LC_ALL") << std::endl;
    std::cout << "  LC_CTYPE="<< env("LC_CTYPE") << std::endl;
    std::cout << "  TZ="<< env("TZ") << std::endl;

    char const *clocale=setlocale(LC_ALL,"");
    if(!clocale)
        clocale= "undetected";
    std::cout <<"- C locale: " << clocale << std::endl;

    try {
        std::locale loc("");
        std::cout << "- C++ locale: " << loc.name() << std::endl;
    }
    catch(std::exception const &) {
        std::cout << "- C++ locale: is not supported" << std::endl;
    }

    char const *locales_to_check[] = {
        "en_US.UTF-8", "en_US.ISO8859-1", "English_United States.1252",
        "he_IL.UTF-8", "he_IL.ISO8859-8", "Hebrew_Israel.1255",
        "ru_RU.UTF-8", "Russian_Russia.1251",
        "tr_TR.UTF-8", "Turkish_Turkey.1254",
        "ja_JP.UTF-8", "ja_JP.SJIS", "Japanese_Japan.932",
        0
    };
    std::cout << "- Testing locales availability on the operation system:" << std::endl;
    check_locale(locales_to_check);
    std::cout << "--- Testing Japanese_Japan.932 is working: " << test_std_supports_SJIS_codecvt("Japanese_Japan.932") << std::endl;

    std::cout << "- Testing timezone and time " << std::endl;
    {
        setlocale(LC_ALL,"C");
        time_t now = time(0);
        char buf[1024];
        strftime(buf,sizeof(buf),"%%c=%c; %%Z=%Z; %%z=%z",localtime(&now));
        std::cout << "  Local Time    :" << buf << std::endl;
        strftime(buf,sizeof(buf),"%%c=%c; %%Z=%Z; %%z=%z",gmtime(&now));
        std::cout << "  Universal Time:" << buf << std::endl;
    }
    std::cout << "- Boost.Locale's locale: ";
    try {
        boost::locale::generator gen;
        std::locale l = gen("");
        std::cout << std::use_facet<boost::locale::info>(l).name() << std::endl;
    }
    catch(std::exception const &) {
        std::cout << " undetected" << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;

}

// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
// boostinspect:noascii 
