<?php

namespace App\Models;

use App\Concerns\HasTranslations;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Article extends Model
{
    use HasTranslations;

    protected $table = 'article';

    protected $primaryKey = 'art_id';

    protected string $columnPrefix = 'art';

    const CREATED_AT = 'art_created_at';

    const UPDATED_AT = 'art_updated_at';

    protected $fillable = [
        'art_categorie_fr', 'art_categorie_en', 'art_date_fr', 'art_date_en',
        'art_title_fr', 'art_title_en', 'art_slug', 'art_publie', 'art_excerpt_fr', 'art_excerpt_en',
        'art_contenu_fr', 'art_contenu_en',
        'art_auteur', 'art_initiales', 'art_meta_fr', 'art_meta_en',
        'art_featured', 'art_url', 'art_ordre',
    ];

    protected $casts = ['art_featured' => 'boolean', 'art_publie' => 'boolean'];

    protected static function booted(): void
    {
        static::saving(function (Article $article) {
            // Le slug se fige dès que l'article a été publié une première
            // fois (même repassé en brouillon ensuite). Tant qu'il n'a
            // jamais été publié, il se régénère à chaque sauvegarde pour
            // suivre le titre.
            $dejaPublie = $article->exists && $article->getOriginal('art_publie');

            if ($dejaPublie) {
                return;
            }

            $base = Str::slug($article->art_title_fr) ?: 'article';
            $slug = $base;
            $suffix = 2;

            while (static::where('art_slug', $slug)->where('art_id', '!=', $article->art_id ?? 0)->exists()) {
                $slug = "{$base}-{$suffix}";
                $suffix++;
            }

            $article->art_slug = $slug;
        });
    }

    /** Articles visibles sur le site public. */
    public function scopePublie($query)
    {
        return $query->where('art_publie', true);
    }

    /** Libellé "catégorie · date" traduit, tel qu'affiché dans la maquette. */
    public function tradLabel(): string
    {
        $locale = app()->getLocale() === 'en' ? 'en' : 'fr';

        return $this->getAttribute("art_categorie_{$locale}").' · '.$this->getAttribute("art_date_{$locale}");
    }

    /** URL publique de la page dédiée à l'article, dans la langue courante. */
    public function url(): string
    {
        return route('articles.show', ['locale' => app()->getLocale(), 'slug' => $this->art_slug]);
    }
}
