<?php

namespace App\Livewire\Setups;

use App\Models\Products\Product;
use App\Models\Setups\Setup;
use Livewire\Component;

class Show extends Component
{
    public Product $product;
    public Setup $setup;
    public ?int $historyIdToView = null;

    public function mount(Product $product, Setup $setup)
    {
        $this->product = $product;
        $this->setup = $setup->load(['product', 'creator', 'updater', 'history.changer']);
    }

    /**
     * Abre la modal del cambio de estado, la misma que el listado y los otros seis tipos.
     *
     * Aquí el aviso era **«¿Seguro que deseas marcar este setup como deprecado?»**: un
     * «¿seguro?» pelado, sin un número ni un entorno. Y esta es la pantalla en la que uno
     * entra a mirar un setup y decide, así que es donde más falta hace ver a cuántos
     * entornos les cambia el contenido, a qué versión cae cada uno y cuáles se quedan sin
     * ninguna.
     */
    public function pedirCambioDeEstado(string $estado): void
    {
        // Permiso de escritura, aunque la ruta exija solo `admin.setups.show`: cambiar
        // el estado es editar. Ver known-issues MGR-005.
        $this->authorize('admin.setups.edit');

        $this->dispatch('openModal',
            component: \App\Livewire\Products\CambioDeEstadoModal::class,
            arguments: [
                'tipo' => 'setups',
                'productId' => $this->product->id,
                'versionId' => $this->setup->id,
                'estado' => $estado,
            ]
        );
    }

    /** La modal avisa al aplicar; se recarga la ficha para que el estado cuadre. */
    #[\Livewire\Attributes\On('versionCambioDeEstado')]
    public function repintarTrasElCambio(): void
    {
        $this->setup->refresh()->load(['product', 'creator', 'updater', 'history.changer']);
    }

    public function duplicate()
    {
        // Duplicar crea un setup: el gate de la ruta (`admin.setups.show`) no se reaplica
        // en /livewire/update, así que sin esto cualquiera que pueda ver la ficha podía
        // crear setups (MGR-005).
        $this->authorize('admin.setups.create');

        try {
            $newSetup = $this->setup->duplicate();
            session()->flash('success', "Setup duplicado. Nueva versión: {$newSetup->version}");

            return $this->redirect(route('products.setups.edit', [$this->product, $newSetup]), navigate: true);
        } catch (\Exception $e) {
            session()->flash('error', $e->getMessage());
        }
    }

    public function viewHistoryYaml($historyId)
    {
        $this->historyIdToView = $historyId;
    }

    public function closeHistoryModal()
    {
        $this->historyIdToView = null;
        $this->dispatch('history-modal-closed');
    }

    public function render()
    {
        $historyYaml = null;
        if ($this->historyIdToView) {
            $historyEntry = $this->setup->history->firstWhere('id', $this->historyIdToView);
            $historyYaml = $historyEntry?->yaml;
        }

        return view('livewire.setups.show', [
            'product' => $this->product,
            'historyYaml' => $historyYaml,
        ])->layout('layouts.app');
    }
}

