<?php

namespace App\Livewire\Js;

use App\Livewire\Traits\MuestraVersionDeArchivos;
use App\Models\Js\JsFile;
use App\Models\Js\JsVersion;
use App\Models\Products\Product;
use App\Services\Js\JsStorageService;
use Livewire\Component;

/**
 * Una versión de JavaScript y sus archivos.
 *
 * Gemela de la de SCSS: comparten pantalla a través de `MuestraVersionDeArchivos`, porque
 * eran dos ficheros de 160 líneas con un diff de 48, todas nombres.
 */
class VersionShow extends Component
{
    use MuestraVersionDeArchivos;

    public Product $product;

    public JsVersion $jsVersion;

    public function mount(Product $product, JsVersion $jsVersion)
    {
        $this->product = $product;

        // **La versión pertenece a este producto.** Los dos llegan de la URL y esto no se
        // comprobaba: se podía ver la versión de otro producto poniendo su id (MGR-006).
        abort_unless($jsVersion->product_id === $product->id, 404);

        // Sin `load('files')`: el trait los consulta con su peso calculado en SQL, y
        // cargarlos aquí traía el contenido entero de cada uno para nada.
        $this->jsVersion = $jsVersion->load('creator');
    }

    protected function fichaDeLaVersion(): array
    {
        return [
            'clave' => 'js',
            'version' => $this->jsVersion,
            'elemento' => 'archivo',
            'elementos' => 'archivos',
            'rutaListado' => 'products.js.index',
            'rutaEditarVersion' => 'products.js.version.edit',
            'rutaVerArchivo' => 'products.js.file.show',
            'rutaEditarArchivo' => 'products.js.file.edit',
            'rutaSubir' => 'products.js.files.upload',
            'rutaCrearArchivo' => 'products.js.file.create',
            'permisoVersion' => 'admin.js.version.create',
            'permisoVersionEdit' => 'admin.js.version.edit',
            'permisoSubir' => 'admin.js.files.upload',
            'permisoArchivo' => 'admin.js.file.create',
            'permisoVerArchivo' => 'admin.js.file.show',
            'permisoEditarArchivo' => 'admin.js.file.edit',
            'permisoBorrarArchivo' => 'admin.js.file.destroy',
        ];
    }

    protected function archivosDeLaVersion()
    {
        return $this->jsVersion->files();
    }

    public function delete($fileId)
    {
        $this->authorize('admin.js.file.destroy');

        // Acotado a esta versión en la consulta, no comparando después (MGR-006).
        $file = JsFile::query()
            ->where('js_version_id', $this->jsVersion->id)
            ->findOrFail($fileId);

        JsStorageService::deleteFile($this->product, $this->jsVersion, $file->filename);
        $file->delete();

        session()->flash('success', 'Archivo «' . $file->filename . '» borrado de la versión ' . $this->jsVersion->version . '.');
    }

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

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

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

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

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