<?php

use App\Libs\Database\Eloquent\BaseModel;
use Illuminate\Validation\Rule;

if (!function_exists('translation')) {
    function translation($id, $default = null, $parameters = array(), $domain = 'messages', $locale = null)
    {
        if (!translator()->has($id, $locale) && !empty($default)) {
            return $default;
        } else {
            return trans($id, $parameters, $domain, $locale);
        }
    }
}

if (!function_exists('getAvailableLanguages')) {
    function getAvailableLanguages()
    {
        return LaravelLocalization::getSupportedLocales();
    }
}

if (!function_exists('getActiveLanguage')) {
    function getActiveLanguage()
    {
        return LaravelLocalization::getCurrentLocale();
    }
}

if (!function_exists('getDefaultLanguage')) {
    function getDefaultLanguage()
    {
        return LaravelLocalization::getDefaultLocale();
    }
}

if (!function_exists('generateLangRules')) {
    function generateLangRules($rules, $locales, $subField = null, BaseModel $model = null)
    {
        $langRules = array();
        $dbTableName = null;
        if (!is_null($model)) {
            $dbTableName = $model->languages()->getModel()->getTable();
        }
        foreach ($rules as $field => &$rule) {
            foreach ($locales as $locale) {
                if (is_array($rule) && in_array("unique", $rule)) {
                    if (!is_null($dbTableName)) {
                        $uniqueRule = Rule::unique($dbTableName, $field)
                            ->where(
                                function ($query) use ($locale) {
                                    return $query->where("language_id", $locale);
                                }
                            );

                        if ($model->exists) {
                            $uniqueRule->ignore($model->getKey(), $model->languages()->getForeignKeyName());
                        }

                        $rule[array_search("unique", $rule)] = $uniqueRule;

                    } else {
                        unset($rule[array_search("unique", $rule)]);
                    }
                }
                if ($subField) {
                    $langRules[$field.'.'.$locale.'.'.$subField] = $rule;
                } else {
                    $langRules[$field.'.'.$locale] = $rule;
                }
            }
        }
        return $langRules;
    }
}

if (!function_exists('generateLangLabels')) {
    function generateLangLabels($field, $label, $locales, $subField = null)
    {
        $labels = array();
        foreach ($locales as $locale) {
            if ($subField) {
                $labels[$field.'.'.$locale.'.'.$subField] = $label;
            } else {
                $labels[$field.'.'.$locale] = $label;
            }
        }

        return $labels;
    }
}

if (!function_exists('getLangField')) {
    function getLangField($model, $field, $lang)
    {
        if (!$model || !$model->languages) {
            return '';
        }
        $modelLanguages = $model->languages;
        foreach ($modelLanguages as $modelLanguage) {
            if ($modelLanguage->language_id == $lang) {
                return $modelLanguage->$field;
            }
        }
        return '';
    }
}

if (!function_exists('lang_url')) {
    function lang_url($url = null, $locale = null)
    {

        $langUrl = LaravelLocalization::getLocalizedURL($locale, $url);
        return rtrim($langUrl, '/');
    }
}
