<?php

namespace App\Livewire\Traits;

use App\Models\Products\Product;
use Illuminate\Database\Eloquent\Model;
use Livewire\WithPagination;

trait HasVersionIndex
{
    use WithPagination;

    public Product $product;
    public string $search = '';
    public ?string $versionFilter = null;

    protected $queryString = ['search', 'versionFilter'];

    /**
     * Obtiene el modelo de versión a usar (ej: JsVersion::class)
     */
    abstract protected function getVersionModel(): string;

    /**
     * Obtiene el nombre de la relación para contar (ej: 'files', 'resources', 'features')
     */
    abstract protected function getCountRelation(): string;

    /**
     * Obtiene el mensaje de éxito al crear una nueva versión
     */
    abstract protected function getCreateSuccessMessage(string $version): string;

    /**
     * Obtiene la ruta para mostrar la versión creada
     */
    abstract protected function getVersionShowRoute(Product $product, Model $version): string;

    /**
     * Obtiene el nombre del parámetro para el método duplicate (ej: 'jsVersionId', 'scssVersionId')
     */
    abstract protected function getDuplicateParameterName(): string;

    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function updatingVersionFilter()
    {
        $this->resetPage();
    }

    public function mount(Product $product)
    {
        $this->product = $product;
    }

    public function duplicate($versionId)
    {
        try {
            $modelClass = $this->getVersionModel();
            $relation = $this->getCountRelation();
            
            $version = $modelClass::with($relation)->findOrFail($versionId);
            $newVersion = $version->duplicate();
            
            session()->flash('success', "Versión duplicada correctamente. Nueva versión: {$newVersion->version}");
        } catch (\Exception $e) {
            session()->flash('error', 'Error al duplicar la versión: ' . $e->getMessage());
        }
    }

    public function createNewVersion()
    {
        try {
            $modelClass = $this->getVersionModel();
            
            // Buscar la última versión del producto
            $lastVersion = $modelClass::where('product_id', $this->product->id)
                ->orderByDesc('version')
                ->first();

            // Generar el número de versión
            if ($lastVersion) {
                // Si existe una versión previa, generar la siguiente
                $newVersionNumber = $lastVersion->generateNextVersion();
            } else {
                // Si no hay versiones, crear la primera con la fecha actual
                $newVersionNumber = date('Ymd') . '00';
                
                // Verificar que no exista ya esta versión
                $exists = $modelClass::where('product_id', $this->product->id)
                    ->where('version', $newVersionNumber)
                    ->exists();
                
                if ($exists) {
                    // Si existe, incrementar
                    $newVersionNumber = str_pad((string) ((int) $newVersionNumber + 1), 10, '0', STR_PAD_LEFT);
                }
            }

            // Crear la nueva versión
            $newVersion = $modelClass::create([
                'product_id' => $this->product->id,
                'version' => $newVersionNumber,
                'description' => null,
                'created_by' => auth()->id(),
                'updated_by' => auth()->id(),
            ]);

            session()->flash('success', $this->getCreateSuccessMessage($newVersion->version));
            
            // Redirigir a la página de la versión
            return $this->redirect($this->getVersionShowRoute($this->product, $newVersion), navigate: true);
        } catch (\Exception $e) {
            session()->flash('error', 'Error al crear la versión: ' . $e->getMessage());
        }
    }

    protected function getVersionsQuery()
    {
        $modelClass = $this->getVersionModel();
        $relation = $this->getCountRelation();
        
        return $modelClass::query()
            ->with(['product', 'creator', 'updater'])
            ->withCount($relation)
            ->where('product_id', $this->product->id)
            ->when($this->search, function ($query) {
                $query->where(function ($q) {
                    $q->where('version', 'like', "%{$this->search}%")
                      ->orWhere('description', 'like', "%{$this->search}%");
                });
            })
            ->when($this->versionFilter, function ($query) {
                $query->where('version', $this->versionFilter);
            })
            ->orderByDesc('version');
    }
}

