<?php

namespace App\Livewire\Tutorials;

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

/**
 * Una versión de Tutoriales y lo que contiene.
 *
 * Comparte pantalla con las otras dos de su familia a través de `MuestraVersionDeElementos`: los
 * tres tenían los mismos seis métodos y la misma tabla, y solo cambia lo propio de cada
 * elemento —aquí, la plataforma del vídeo y su identificador—.
 *
 * **El orden estaba roto de dos formas distintas**, y las dos se arreglaron al hacer esta
 * pantalla: ver el docblock del trait y el de `Tutorial::scopeOrdered()`.
 */
class VersionShow extends Component
{
    use MuestraVersionDeElementos;

    public Product $product;

    public TutorialVersion $tutorialVersion;

    public function mount(Product $product, TutorialVersion $tutorialVersion)
    {
        $this->product = $product;

        abort_unless($tutorialVersion->product_id === $product->id, 404);

        $this->tutorialVersion = $tutorialVersion->load('creator');
    }

    protected function fichaDeLaVersion(): array
    {
        return [
            'clave' => 'tutorials',
            'version' => $this->tutorialVersion,
            'elemento' => 'tutorial',
            'elementos' => 'tutoriales',
            'parcial' => 'livewire.products.contenido.elementos.tutorial',
            'rutaListado' => 'products.tutorials.index',
            'rutaEditarVersion' => 'products.tutorials.version.edit',
            'rutaVerElemento' => null,
            'rutaEditarElemento' => 'products.tutorials.edit',
            'rutaCrearElemento' => 'products.tutorials.create',
            'permisoVersionCrear' => 'admin.tutorials.version.create',
            'permisoVersionEditar' => 'admin.tutorials.version.edit',
            'permisoCrear' => 'admin.tutorials.create',
            'permisoEditar' => 'admin.tutorials.edit',
            'permisoBorrar' => 'admin.tutorials.destroy',
        ];
    }

    protected function elementosDeLaVersion()
    {
        return $this->tutorialVersion->tutorials();
    }

    public function delete($elementoId)
    {
        $this->authorize('admin.tutorials.destroy');

        // Acotado a esta versión en la consulta, no comparando después: si no es de aquí,
        // es un 404 (MGR-006).
        $elemento = Tutorial::query()
            ->where('tutorial_version_id', $this->tutorialVersion->id)
            ->findOrFail($elementoId);

        $titulo = $elemento->title;
        $elemento->delete();

        session()->flash('success', '«' . $titulo . '» borrado de la versión ' . $this->tutorialVersion->version . '.');
    }

    public function moveUp($elementoId)
    {
        $this->authorize('admin.tutorials.edit');

        // **Solo se dice que cambió si cambió.** Antes intercambiaba dos `sort_order` y con
        // los valores a null no hacía nada, pero decía «Orden actualizado correctamente».
        $this->avisarDelOrden($this->moverElemento((int) $elementoId, -1));
    }

    public function moveDown($elementoId)
    {
        $this->authorize('admin.tutorials.edit');

        $this->avisarDelOrden($this->moverElemento((int) $elementoId, 1));
    }

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

        $nueva = $this->tutorialVersion->duplicate();

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

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

    public function render()
    {
        return view('livewire.products.contenido.version-elementos', array_merge(
            $this->datosDeLaPantalla(),
            ['version' => $this->tutorialVersion]
        ))->layout('layouts.app');
    }
}
