<?php

namespace App\Models\Features;

use App\Models\Auth\User;
use App\Models\Products\Product;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;

class Feature extends Model
{
    use HasFactory;

    protected $table = 'features';

    protected $fillable = [
        'feature_version_id',
        'title',
        'description',
        'content_html',
        'thumbnail_image',
        'header_image',
        'status',
        'sort_order',
        'created_by',
    ];

    protected $casts = [
        'sort_order' => 'integer',
    ];

    /* -----------------------------
       Relaciones
    ------------------------------*/

    /**
     * Versión a la que pertenece la feature
     */
    public function featureVersion()
    {
        return $this->belongsTo(FeatureVersion::class, 'feature_version_id');
    }

    /**
     * Producto al que pertenece la feature (a través de featureVersion)
     */
    public function product()
    {
        return $this->hasOneThrough(Product::class, FeatureVersion::class, 'id', 'id', 'feature_version_id', 'product_id');
    }

    /**
     * Usuario que creó la feature
     */
    public function creator()
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    /* -----------------------------
       Scopes
    ------------------------------*/

    /**
     * Scope para filtrar features publicadas
     */
    public function scopePublished($query)
    {
        return $query->where('status', 'published');
    }

    /**
     * Scope para filtrar features en borrador
     */
    public function scopeDraft($query)
    {
        return $query->where('status', 'draft');
    }

    /**
     * Scope para filtrar features archivadas
     */
    public function scopeArchived($query)
    {
        return $query->where('status', 'archived');
    }

    /**
     * Scope para filtrar por producto (a través de featureVersion)
     */
    public function scopeForProduct($query, $product)
    {
        $productId = $product instanceof Product ? $product->id : $product;
        return $query->whereHas('featureVersion', function ($q) use ($productId) {
            $q->where('product_id', $productId);
        });
    }

    /**
     * Scope para ordenar por sort_order
     */
    public function scopeOrdered($query)
    {
        return $query->orderBy('sort_order', 'asc')
            ->orderBy('created_at', 'desc');
    }

    /* -----------------------------
       Accessors
    ------------------------------*/

    /**
     * Obtiene la URL pública de la imagen miniatura
     */
    public function getThumbnailUrlAttribute(): ?string
    {
        if (!$this->thumbnail_image) {
            return null;
        }

        return Storage::disk('public')->url($this->thumbnail_image);
    }

    /**
     * Obtiene la URL pública de la imagen de cabecera
     */
    public function getHeaderUrlAttribute(): ?string
    {
        if (!$this->header_image) {
            return null;
        }

        return Storage::disk('public')->url($this->header_image);
    }
}

