<?php

namespace App\Concerns;

use Illuminate\Support\HtmlString;

/**
 * Multilingue par colonnes suffixées : chaque champ traduisible existe en
 * `<prefixe>_<champ>_fr` et `<prefixe>_<champ>_en`.
 *
 * Le modèle qui utilise ce trait doit définir la propriété `$columnPrefix`
 * (ex. 'svc' pour la table `service`).
 *
 * Usage dans les vues : {{ $service->trad('title') }} -> renvoie la colonne
 * de la langue courante (app()->getLocale()), avec repli sur le français.
 */
trait HasTranslations
{
    /**
     * Retourne la valeur traduite d'un champ selon la locale courante.
     * Repli automatique sur le français si la traduction est vide.
     */
    public function trad(string $field): ?string
    {
        $prefix = $this->columnPrefix;
        $locale = app()->getLocale() === 'en' ? 'en' : 'fr';

        $value = $this->getAttribute("{$prefix}_{$field}_{$locale}");

        if (($value === null || $value === '') && $locale !== 'fr') {
            $value = $this->getAttribute("{$prefix}_{$field}_fr");
        }

        return $value;
    }

    /**
     * Comme trad(), mais convertit les segments marqués `[[...]]` en <em>
     * (mise en emphase or/italique du design). Le reste du texte reste
     * échappé : seul ce marqueur permet d'injecter du HTML.
     */
    public function tradEm(string $field): HtmlString
    {
        $escaped = e($this->trad($field) ?? '');
        $html = preg_replace('/\[\[(.*?)\]\]/s', '<em>$1</em>', $escaped);

        return new HtmlString($html);
    }
}
