<?php

namespace App\Livewire\Resources;

use App\Models\Resources\Resource;
use App\Models\Resources\ResourceVersion;
use App\Models\Products\Product;
use Livewire\Component;

class VersionShow extends Component
{
    public Product $product;
    public ResourceVersion $resourceVersion;

    public function mount(Product $product, ResourceVersion $resourceVersion)
    {
        $this->product = $product;
        $this->resourceVersion = $resourceVersion->load('resources', 'product', 'creator');
        
        // Verificar que la versión pertenezca al producto
        if ($this->resourceVersion->product_id !== $this->product->id) {
            abort(404, 'La versión de Recursos no pertenece a este producto.');
        }
    }

    public function delete($resourceId)
    {
        $this->authorize('admin.resources.destroy');
        
        $resource = Resource::findOrFail($resourceId);

        // Verificar que el recurso pertenece a esta versión
        if ($resource->resource_version_id !== $this->resourceVersion->id) {
            session()->flash('error', 'El recurso no pertenece a esta versión.');
            return;
        }

        // Si es un archivo, eliminarlo
        if ($resource->type === 'file' && $resource->path) {
            $fileService = app(\App\Services\Resources\ResourceFileService::class);
            $fileService->deleteAllResourceFiles($resource);
        }

        // Eliminar recurso
        $resource->delete();

        session()->flash('success', 'Recurso eliminado exitosamente.');

        // Recargar versión
        $this->resourceVersion->refresh();
    }

    public function moveUp($resourceId)
    {
        $this->authorize('admin.resources.edit');
        
        $resource = Resource::findOrFail($resourceId);
        
        if ($resource->resource_version_id !== $this->resourceVersion->id) {
            session()->flash('error', 'El recurso no pertenece a esta versión.');
            return;
        }

        // Buscar el recurso anterior (sort_order menor)
        $previousResource = Resource::where('resource_version_id', $this->resourceVersion->id)
            ->where('id', '!=', $resource->id)
            ->where(function ($query) use ($resource) {
                if ($resource->sort_order !== null) {
                    $query->where('sort_order', '<', $resource->sort_order)
                        ->orWhereNull('sort_order');
                } else {
                    $query->whereNull('sort_order');
                }
            })
            ->orderByDesc('sort_order')
            ->orderByDesc('created_at')
            ->first();

        if ($previousResource) {
            $tempOrder = $resource->sort_order;
            $resource->sort_order = $previousResource->sort_order;
            $previousResource->sort_order = $tempOrder;
            
            $resource->save();
            $previousResource->save();
        } else {
            // Si no hay anterior, asignar el sort_order más bajo disponible
            $minOrder = Resource::where('resource_version_id', $this->resourceVersion->id)
                ->whereNotNull('sort_order')
                ->min('sort_order');
            
            $resource->sort_order = $minOrder !== null ? $minOrder - 1 : 0;
            $resource->save();
        }

        session()->flash('success', 'Orden actualizado correctamente.');
        $this->resourceVersion->refresh();
    }

    public function moveDown($resourceId)
    {
        $this->authorize('admin.resources.edit');
        
        $resource = Resource::findOrFail($resourceId);
        
        if ($resource->resource_version_id !== $this->resourceVersion->id) {
            session()->flash('error', 'El recurso no pertenece a esta versión.');
            return;
        }

        // Buscar el recurso siguiente (sort_order mayor)
        $nextResource = Resource::where('resource_version_id', $this->resourceVersion->id)
            ->where('id', '!=', $resource->id)
            ->where(function ($query) use ($resource) {
                if ($resource->sort_order !== null) {
                    $query->where('sort_order', '>', $resource->sort_order);
                } else {
                    $query->whereNotNull('sort_order');
                }
            })
            ->orderBy('sort_order')
            ->orderBy('created_at')
            ->first();

        if ($nextResource) {
            $tempOrder = $resource->sort_order;
            $resource->sort_order = $nextResource->sort_order;
            $nextResource->sort_order = $tempOrder;
            
            $resource->save();
            $nextResource->save();
        } else {
            // Si no hay siguiente, asignar el sort_order más alto disponible + 1
            $maxOrder = Resource::where('resource_version_id', $this->resourceVersion->id)
                ->whereNotNull('sort_order')
                ->max('sort_order');
            
            $resource->sort_order = $maxOrder !== null ? $maxOrder + 1 : 1;
            $resource->save();
        }

        session()->flash('success', 'Orden actualizado correctamente.');
        $this->resourceVersion->refresh();
    }

    public function duplicateVersion()
    {
        $this->authorize('admin.resources.version.create');
        
        $newVersion = $this->resourceVersion->duplicate();

        session()->flash('success', "Versión duplicada exitosamente. Nueva versión: {$newVersion->version}");

        return redirect()->route('products.resources.version.show', [$this->product, $newVersion]);
    }

    public function render()
    {
        $resources = $this->resourceVersion->resources()
            ->with('creator')
            ->ordered()
            ->get();

        return view('livewire.resources.version-show', [
            'resources' => $resources,
        ])->layout('layouts.app');
    }
}

