<?php

namespace App\Helpers\Formats;

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\File;

class LangHelper
{

    public static function get($key, $replace = [], $locale = null) {

        // Obtenemos el Idioma de Configuración del sistema
        $locale = $locale
            ?? session('locale')
            ?? request()->header('X-Locale')
            ?? config('app.locale', 'es');

        // Asignar idioma identificado al entorno de trabajo
        App::setLocale($locale);

        // Buscamos el archivo con el idioma respectivo
        $path = base_path("lang/{$locale}.json");
        if (!File::exists($path))
            return $key;

        // Extraemos sus clave-valor
        $translations = json_decode(File::get($path), true);

        // Obtenemos el mensaje a retornar
        $message = self::arrayGet($translations, $key);
        if (!$message)
            return $key;

        // Reemplazo de variables :variable (si es que hay alguna)
        foreach ($replace as $search => $value) {
            $message = str_replace(":$search", $value, $message);
        }

        return $message;
    }


    protected static function arrayGet(array $array, string $key) {
        // Si el texto puede ser encontrado directamente lo retornamos
        if (array_key_exists($key, $array)) {
            return $array[$key];
        }

        // De lo contrario desestructuramos la notación por punto (messages.information...) para hallar el mensaje
        foreach (explode('.', $key) as $segment) {
            if (!is_array($array) || !array_key_exists($segment, $array)) {
                return null;
            }

            $array = $array[$segment];
        }

        return $array;
    }

}
