<?php

namespace App\Models\Products;

use App\Models\Products\LicenseToken;
use App\Models\Environments\Environment;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Storage;

class Product extends Model
{
    use HasFactory, SoftDeletes;

    protected $table = 'products';

    protected $fillable = [
        'slug',
        'name',
        'summary',
        'image',
        'description',
        'tech',
        'type',
        'metadata',
        'actived',
        'enabled',
    ];

    protected $casts = [
        'metadata' => 'array',
        'actived'  => 'boolean',
        'enabled'  => 'boolean',
    ];

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

    /**
     * Tokens que tienen asignado este producto.
     */
    public function tokens()
    {
        return $this->belongsToMany(LicenseToken::class, 'license_token_product')
            ->withPivot([
                'mode',
                'status',
                'start_at',
                'end_at',
                'observation',
                'assigned_by',
            ])
            ->withTimestamps();
    }

    /**
     * Query base de entornos que tienen instalado este producto
     * a través de una licencia.
     */
    public function environmentsQuery()
    {
        return Environment::whereHas('licenseToken.products', function ($query) {
            $query->where('products.id', $this->id);
        });
    }

    /**
     * Accesor para `$product->environments`.
     *
     * Devuelve la colección de entornos asociados al producto.
     */
    public function getEnvironmentsAttribute()
    {
        return $this->environmentsQuery()->get();
    }

    /**
     * Tipos de entornos válidos para este producto
     */
    public function types()
    {
        return $this->belongsToMany(\App\Models\Environments\Type::class, 'product_type');
    }

    /**
     * Setups de configuración para este producto
     */
    public function setups()
    {
        return $this->hasMany(\App\Models\Setups\Setup::class);
    }

    /**
     * Versiones de Features para este producto
     */
    public function featureVersions()
    {
        return $this->hasMany(\App\Models\Features\FeatureVersion::class);
    }

    /**
     * Features (funcionalidades) de este producto (a través de versiones)
     */
    public function features()
    {
        return $this->hasManyThrough(\App\Models\Features\Feature::class, \App\Models\Features\FeatureVersion::class, 'product_id', 'feature_version_id');
    }

    /**
     * Versiones de Tutoriales para este producto
     */
    public function tutorialVersions()
    {
        return $this->hasMany(\App\Models\Tutorials\TutorialVersion::class);
    }

    /**
     * Versiones de Recursos para este producto
     */
    public function resourceVersions()
    {
        return $this->hasMany(\App\Models\Resources\ResourceVersion::class);
    }

    /**
     * Recursos de este producto (a través de versiones)
     */
    public function resources()
    {
        return $this->hasManyThrough(\App\Models\Resources\Resource::class, \App\Models\Resources\ResourceVersion::class, 'product_id', 'resource_version_id');
    }

    /**
     * Versiones SCSS para este producto
     */
    public function scssVersions()
    {
        return $this->hasMany(\App\Models\Scss\ScssVersion::class);
    }

    /**
     * Archivos SCSS para este producto (a través de versiones)
     * Helper para obtener todos los archivos de todas las versiones
     */
    public function getScssFilesProperty()
    {
        return \App\Models\Scss\ScssFile::whereIn('scss_version_id', function ($query) {
            $query->select('id')
                ->from('scss_versions')
                ->where('product_id', $this->id);
        })->get();
    }

    /**
     * Versiones JS para este producto
     */
    public function jsVersions()
    {
        return $this->hasMany(\App\Models\Js\JsVersion::class);
    }

    /**
     * Archivos JS para este producto (a través de versiones)
     * Helper para obtener todos los archivos de todas las versiones
     */
    public function getJsFilesProperty()
    {
        return \App\Models\Js\JsFile::whereIn('js_version_id', function ($query) {
            $query->select('id')
                ->from('js_versions')
                ->where('product_id', $this->id);
        })->get();
    }

    /* -----------------------------
       Helpers técnicos
    ------------------------------*/

    public function isMoodle(): bool
    {
        return $this->tech === 'moodle';
    }

    public function isWordPress(): bool
    {
        return $this->tech === 'wordpress';
    }

    public function isEnabledForSale(): bool
    {
        return $this->enabled === true;
    }

    public function isOperational(): bool
    {
        return $this->actived === true;
    }

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

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

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

