<?php

namespace App\Livewire\Features;

use App\Livewire\Traits\MuestraVersionDeElementos;
use App\Models\Features\Feature;
use App\Models\Features\FeatureVersion;
use App\Models\Products\Product;
use Livewire\Component;

/**
 * Una versión de Funcionalidades y lo que contiene.
 *
 * Comparte pantalla con Recursos y Tutoriales 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í, las imágenes—.
 *
 * **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 `Feature::scopeOrdered()`.
 */
class VersionShow extends Component
{
    use MuestraVersionDeElementos;

    public Product $product;

    public FeatureVersion $featureVersion;

    public function mount(Product $product, FeatureVersion $featureVersion)
    {
        $this->product = $product;

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

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

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

    protected function elementosDeLaVersion()
    {
        return $this->featureVersion->features();
    }

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

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

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

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

    public function moveUp($featureId)
    {
        $this->authorize('admin.features.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) $featureId, -1));
    }

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

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

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

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

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

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

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