# Réglages globaux — Conventions

## Concept

Les réglages sont des paires clé/valeur stockées en base de données.
Ils remplacent les fichiers de config pour tout ce que l'admin peut modifier :
nom du site, logo, couleurs, textes globaux, etc.

---

## Modèle de données

```sql
settings
  id, key (unique), value (JSON), autoload (bool), timestamps
```

La valeur est stockée en JSON pour supporter tous les types (string, bool, array...).

---

## SettingsService

```php
// app/Services/SettingsService.php

class SettingsService
{
    // Lire un réglage
    public static function get(string $key, mixed $default = null): mixed
    {
        return cache()->rememberForever("setting.{$key}", function () use ($key, $default) {
            $setting = Setting::whereKey($key)->first();
            return $setting !== null ? $setting->value : $default;
        });
    }

    // Écrire un réglage
    public static function set(string $key, mixed $value): void
    {
        Setting::updateOrCreate(['key' => $key], ['value' => $value]);
        cache()->forget("setting.{$key}");
        cache()->forget('settings.shared');  // invalider aussi le cache partagé
    }

    // Retourner tous les réglages autoload pour l'injection Inertia
    public static function shared(): array
    {
        return cache()->remember('settings.shared', 3600, function () {
            return Setting::where('autoload', true)
                ->pluck('value', 'key')
                ->toArray();
        });
    }

    public static function clearCache(): void
    {
        cache()->forget('settings.shared');
    }
}
```

---

## Réglages définis (seeder)

| Clé | Type | Description |
|---|---|---|
| `site.name` | string | Nom du site |
| `site.tagline` | string | Slogan |
| `site.logo` | string (url) | Logo principal |
| `site.favicon` | string (url) | Favicon |
| `site.primary_color` | string (hex) | Couleur principale |
| `site.footer_text` | string | Texte de pied de page |

---

## Accès dans Vue (front-office et back-office)

```js
// Injecté globalement via HandleInertiaRequests
const { settings } = usePage().props

// Exemples
settings['site.name']          // "Belle Évasion"
settings['site.primary_color'] // "#2563EB"
settings['site.logo']          // "/storage/media/logo.png"
```

---

## Page de réglages (back-office)

```
Settings.vue
 ├── Section "Identité"
 │   ├── Nom du site       (string)
 │   ├── Slogan            (string)
 │   ├── Logo              (MediaPicker)
 │   └── Favicon           (MediaPicker)
 ├── Section "Apparence"
 │   └── Couleur principale (color picker)
 └── Section "Pied de page"
     └── Texte footer       (string)
```

---

## Conventions

- Toujours préfixer les clés par domaine : `site.`, `seo.`, `mail.`
- Ne jamais accéder à `Setting::` directement dans un Controller — passer par `SettingsService`
- Appeler `SettingsService::clearCache()` après tout `set()`
- Les réglages avec `autoload = true` sont injectés dans toutes les pages via Inertia
