<?php

namespace App\Models;

use App\Traits\HasImages;
use App\Traits\HasSortsTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Lubricante extends Model
{
    use HasFactory, HasSortsTrait, HasImages;

    public const TABLE = 'lubricantes';
    public const IMAGE_UPLOAD_TO = 'uploads/lubricantes';
    public const IMAGE_SIZE_SMALL = 'small';
    public const IMAGE_SIZE_MEDIUM = 'medium';
    public const IMAGE_SIZE_LARGE = 'large';

    protected $table = 'lubricantes';

    protected $fillable = [
        'titulo',
        'slug',
        'estado',
    ];

    protected $casts = [
        'estado' => 'boolean',
        'created_at' => 'datetime:d-m-Y H:i:s',
        'updated_at' => 'datetime:d-m-Y H:i:s',
    ];

    protected $appends = [
        'imagen',
    ];

    protected array $allowedSorts = [
        'id',
        'titulo',
        'estado',
        'created_at',
    ];

    /**
     * Normaliza el título y deriva el slug en un único lugar para que altas y
     * ediciones mantengan URLs consistentes aunque el payload llegue con espacios.
     *
     * @param mixed $value
     */
    public function setTituloAttribute($value): void
    {
        $titulo = trim((string) $value);

        $this->attributes['titulo'] = $titulo;
        $this->attributes['slug'] = str_slug($titulo);
    }

    /**
     * Mantiene compatibilidad con respuestas existentes. En listados nuevos se
     * evita este accessor porque consulta imágenes por fila y puede generar N+1.
     */
    public function getImagenAttribute(): ?string
    {
        if (array_key_exists('imagen', $this->attributes)) {
            return $this->attributes['imagen'];
        }

        return $this->getThumbnail();
    }
}
