<?php namespace HashOver;

// Copyright (C) 2010-2021 Jacob Barkdull
// This file is part of HashOver.
//
// HashOver is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// HashOver is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with HashOver. If not, see <http://www.gnu.org/licenses/>.


class Locale
{
protected $setup;

public $text;

public function __construct (Setup $setup)
{
// Store parameters as properties
$this->setup = $setup;

// Get appropriate locale file
$locale_file_path = $this->getLocaleFile ();

// Include the locale file
$this->includeLocaleFile ($locale_file_path);

// Prepare locale
$this->prepareLocale ();
}

// Check for PHP locale file
protected function getLocaleFile ()
{
// Check if we are automatically selecting the locale
if ($this->setup->language === 'auto') {
// If so, get system locale
$ctype = setlocale (LC_CTYPE, 0);

// Split locale by encoding
$ctype_parts = explode ('.', $ctype);

// Get locale code (en_US, de_DE, etc.)
$locale = $ctype_parts[0];
} else {
// If not, use configured language as locale
$locale = $this->setup->language;
}

// Convert current locale code to lowercase
$locale = mb_strtolower ($locale);

// Get path to locales directory
$locales_path = $this->setup->getAbsolutePath ('backend/locales');

// Convert locale code to dashed format (en-us, de-de, etc.)
if (strpos ($locale, '_') !== false) {
$locale = str_replace ('_', '-', $locale);
}

// Convert locale code to dashed format if it isn't hyphenated
if (strpos ($locale, '-') === false) {
$locale .= '-' . $locale;
}

// Locale file path to try
$locale_file = $locales_path . '/' . $locale . '.php';

// Try to use locale file for current locale
if (file_exists ($locale_file)) {
// If exists, set locale code as language setting
$this->setup->language = $locale;

// And return locale file path
return $locale_file;
}

// Otherwise, set language setting to English
$this->setup->language = 'en-us';

// And return path to English locale
return $locales_path . '/en-us.php';
}

// Includes a locale file
protected function includeLocaleFile ($file)
{
// Check if the locale file can be included
if (@include ($file)) {
// If so, set locale to array stored in the file
$this->text = $locale;
} else {
// If not, throw exception
throw new \Exception (sprintf (
'%s locale file could not be included!',
mb_strtoupper ($this->setup->language)
));
}
}

// Injects optionality into a given locale string
protected function optionality ($locale, $choice = 'optional')
{
// Optionality locale key (default to optional)
$key = ($choice === 'required') ? 'required' : 'optional';

// Optionality locale string
$optionality = mb_strtolower ($this->text[$key]);

// Inject optionality into locale string
$new_locale = sprintf ($locale, $optionality);

return $new_locale;
}

// Adds optionality to any given locale string
public function optionalize ($key, $choice = 'optional')
{
return $this->optionality ($this->text[$key] . ' (%s)', $choice);
}

// Prepares locale by modifying them in various ways
protected function prepareLocale ()
{
// Add optionality to form field title locales
foreach ($this->setup->formFields as $field => $option) {
// Title locale key
$tooltip_key = $field . '-tip';

// Title locale string
$tooltip_locale = $this->text[$tooltip_key];

// Inject optionality into title locale
$optionality = $this->optionality ($tooltip_locale, $option);

// Update the locale
$this->text[$tooltip_key] = $optionality;
}
}

// Return file permissions locale with directory and PHP user
public function permissionsInfo ($file)
{
// PHP user, or www-data
$php_user = Misc::getArrayItem ($_SERVER, 'USER') ?: 'www-data';

return sprintf (
$this->text['permissions-info'],
$this->setup->getHttpPath ($file),
$php_user
);
}
}