<?php

namespace App\Models\Js;

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

class JsFile extends Model
{
    use HasFactory;

    protected $table = 'js_files';

    protected $fillable = [
        'js_version_id',
        'filename',
        'content',
        'created_by',
        'updated_by',
    ];

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

    /**
     * Versión JS a la que pertenece el archivo
     */
    public function jsVersion()
    {
        return $this->belongsTo(JsVersion::class, 'js_version_id');
    }

    /**
     * Producto al que pertenece el archivo JS (a través de jsVersion)
     */
    public function product()
    {
        return $this->hasOneThrough(Product::class, JsVersion::class, 'id', 'id', 'js_version_id', 'product_id');
    }

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

    /**
     * Usuario que editó por última vez el archivo
     */
    public function updater()
    {
        return $this->belongsTo(User::class, 'updated_by');
    }

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

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

    /**
     * Scope para filtrar por versión JS
     */
    public function scopeForJsVersion($query, $jsVersion)
    {
        $jsVersionId = $jsVersion instanceof JsVersion ? $jsVersion->id : $jsVersion;
        return $query->where('js_version_id', $jsVersionId);
    }

    /* -----------------------------
       Métodos estáticos
    ------------------------------*/

    /**
     * Encuentra la versión compatible de archivos JS para un producto y versión dados
     * Ahora usa JsVersion para encontrar la versión compatible primero
     *
     * @param Product|int $product Producto o ID del producto
     * @param string $productVersion Versión del producto (formato YYYYMMDDXX)
     * @param string|null $filename Nombre del archivo específico (opcional)
     * @return \Illuminate\Database\Eloquent\Collection|JsFile|null
     */
    public static function findCompatibleVersion($product, string $productVersion, ?string $filename = null)
    {
        // Primero encontrar la versión JS compatible
        $jsVersion = JsVersion::findCompatibleVersion($product, $productVersion);

        if (!$jsVersion) {
            return $filename ? null : collect();
        }

        // Buscar archivos de esa versión
        $query = self::forJsVersion($jsVersion);

        if ($filename) {
            $query->where('filename', $filename);
            return $query->first();
        }

        return $query->get();
    }
}

