<?php

namespace App\Livewire\Resources;

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

/**
 * Una versión de Recursos 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í, el tipo —archivo o enlace— y sus dos condiciones para servirse—.
 *
 * **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 `Resource::scopeOrdered()`.
 */
class VersionShow extends Component
{
    use MuestraVersionDeElementos;

    public Product $product;

    public ResourceVersion $resourceVersion;

    public function mount(Product $product, ResourceVersion $resourceVersion)
    {
        $this->product = $product;

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

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

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

    protected function elementosDeLaVersion()
    {
        return $this->resourceVersion->resources();
    }

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

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

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

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

    public function moveUp($elementoId)
    {
        $this->authorize('admin.resources.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.resources.edit');

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

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

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

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

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

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