<?php
/**
 * wallabag, self hostable application allowing you to not miss any content anymore
 *
 * @category   wallabag
 * @author     Nicolas Lœuillet <nicolas@loeuillet.org>
 * @copyright  2013
 * @license    http://opensource.org/licenses/MIT see COPYING file
 */

class Language
{
    protected $wallabag;

    private $currentLanguage;

    private $languageNames = array(
        'cs_CZ.utf8' => 'čeština',
        'de_DE.utf8' => 'German',
        'en_EN.utf8' => 'English',
        'en_US.utf8' => 'English (US)',
        'es_ES.utf8' => 'Español',
        'fa_IR.utf8' => 'فارسی',
        'fr_FR.utf8' => 'Français',
        'it_IT.utf8' => 'Italiano',
        'pl_PL.utf8' => 'Polski',
        'pt_BR.utf8' => 'Português (Brasil)',
        'ru_RU.utf8' => 'Pусский',
        'sl_SI.utf8' => 'Slovenščina',
        'uk_UA.utf8' => 'Українська',
    );

    public function __construct(Poche $wallabag)
    {
        $this->wallabag = $wallabag;
        $pocheUser = Session::getParam('poche_user');
        $language  = (is_null($pocheUser) ? LANG : $pocheUser->getConfigValue('language'));

        @putenv('LC_ALL=' . $language);
        setlocale(LC_ALL, $language);
        bindtextdomain($language, LOCALE);
        textdomain($language);

        $this->currentLanguage = $language;
    }

    public function getLanguage() {
        return $this->currentLanguage;
    }

    public function getInstalledLanguages() {
        $handle = opendir(LOCALE);
        $languages = array();

        while (($language = readdir($handle)) !== false) {
            # Languages are stored in a directory, so all directory names are languages
            # @todo move language installation data to database
            if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.', 'tools'))) {
                continue;
            }

            $current = false;

            if ($language === $this->getLanguage()) {
                $current = true;
            }

            $languages[] = array('name' => (isset($this->languageNames[$language]) ? $this->languageNames[$language] : $language), 'value' => $language, 'current' => $current);
        }

        return $languages;
    }


    /**
     * Update language for current user
     *
     * @param $newLanguage
     */
    public function updateLanguage($newLanguage)
    {
        # we are not going to change it to the current language
        if ($newLanguage == $this->getLanguage()) {
            $this->wallabag->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!'));
            Tools::redirect('?view=config');
        }

        $languages = $this->getInstalledLanguages();
        $actualLanguage = false;

        foreach ($languages as $language) {
            if ($language['value'] == $newLanguage) {
                $actualLanguage = true;
                break;
            }
        }

        if (!$actualLanguage) {
            $this->wallabag->messages->add('e', _('that language does not seem to be installed'));
            Tools::redirect('?view=config');
        }

        $this->wallabag->store->updateUserConfig($this->wallabag->user->getId(), 'language', $newLanguage);
        $this->wallabag->messages->add('s', _('you have changed your language preferences'));

        $currentConfig = $_SESSION['poche_user']->config;
        $currentConfig['language'] = $newLanguage;

        $_SESSION['poche_user']->setConfig($currentConfig);

        Tools::emptyCache();
        Tools::redirect('?view=config');
    }
}