<?php

namespace App\Livewire\Tutorials;

use App\Models\Tutorials\Tutorial;
use App\Models\Tutorials\TutorialVersion;
use App\Models\Products\Product;
use Livewire\Component;

class VersionShow extends Component
{
    public Product $product;
    public TutorialVersion $tutorialVersion;

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

    public function delete($tutorialId)
    {
        $this->authorize('admin.tutorials.destroy');
        
        $tutorial = Tutorial::findOrFail($tutorialId);

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

        // Eliminar tutorial
        $tutorial->delete();

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

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

    public function moveUp($tutorialId)
    {
        $this->authorize('admin.tutorials.edit');
        
        $tutorial = Tutorial::findOrFail($tutorialId);
        
        if ($tutorial->tutorial_version_id !== $this->tutorialVersion->id) {
            session()->flash('error', 'El tutorial no pertenece a esta versión.');
            return;
        }

        // Buscar el tutorial anterior (sort_order menor)
        $previousTutorial = Tutorial::where('tutorial_version_id', $this->tutorialVersion->id)
            ->where('id', '!=', $tutorial->id)
            ->where(function ($query) use ($tutorial) {
                if ($tutorial->sort_order !== null) {
                    $query->where('sort_order', '<', $tutorial->sort_order)
                        ->orWhereNull('sort_order');
                } else {
                    $query->whereNull('sort_order');
                }
            })
            ->orderByDesc('sort_order')
            ->orderByDesc('created_at')
            ->first();

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

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

    public function moveDown($tutorialId)
    {
        $this->authorize('admin.tutorials.edit');
        
        $tutorial = Tutorial::findOrFail($tutorialId);
        
        if ($tutorial->tutorial_version_id !== $this->tutorialVersion->id) {
            session()->flash('error', 'El tutorial no pertenece a esta versión.');
            return;
        }

        // Buscar el tutorial siguiente (sort_order mayor)
        $nextTutorial = Tutorial::where('tutorial_version_id', $this->tutorialVersion->id)
            ->where('id', '!=', $tutorial->id)
            ->where(function ($query) use ($tutorial) {
                if ($tutorial->sort_order !== null) {
                    $query->where('sort_order', '>', $tutorial->sort_order);
                } else {
                    $query->whereNotNull('sort_order');
                }
            })
            ->orderBy('sort_order')
            ->orderBy('created_at')
            ->first();

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

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

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

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

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

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

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





