<?php

namespace App\Concerns;

use Illuminate\Support\Facades\Storage;

/**
 * Supprime automatiquement du disque "public" l'ancien fichier d'un champ
 * FileUpload quand il est remplacé ou vidé. Sans ça, Filament ne supprime
 * jamais le fichier physique — seulement la référence en base — et les
 * anciens fichiers s'accumulent indéfiniment dans storage/app/public.
 *
 * Le modèle qui utilise ce trait doit définir fileUploadColumns() avec la
 * liste des colonnes concernées.
 */
trait DeletesReplacedFileUploads
{
    protected static function bootDeletesReplacedFileUploads(): void
    {
        static::updating(function (self $model) {
            foreach ($model->fileUploadColumns() as $column) {
                if (! $model->isDirty($column)) {
                    continue;
                }

                $old = $model->getOriginal($column);

                if ($old && Storage::disk('public')->exists($old)) {
                    Storage::disk('public')->delete($old);
                }
            }
        });
    }

    /**
     * @return array<string>
     */
    abstract protected function fileUploadColumns(): array;
}
