<?php

namespace App\Livewire\LicenseTokens;

use Livewire\Component;
use App\Livewire\Traits\AssignsTokenEnvironments;
use App\Models\Clients\Client;
use App\Models\Environments\Environment;
use App\Models\Products\LicenseToken;

class AssociateLicense extends Component
{
    use AssignsTokenEnvironments;

    public Client $client;
    public ?Environment $environment = null;
    public ?int $selectedTokenId = null;
    public string $search = '';

    protected $listeners = [
        'tokenSelected' => 'handleTokenSelected',
    ];

    public function mount(Client $client, ?Environment $environment = null)
    {
        $this->client = $client;
        $this->environment = $environment;
    }

    public function handleTokenSelected($tokenId)
    {
        $this->selectedTokenId = $tokenId;
    }

    public function updatedSearch()
    {
        // Resetear paginación cuando cambia la búsqueda
        // La paginación se maneja en el componente LicensesTable
    }

    public function associate()
    {
        // El permiso de la ruta no se reaplica en /livewire/update. Ver known-issues MGR-005.
        $this->authorize('admin.license-tokens.associate-license');

        if (!$this->selectedTokenId) {
            session()->flash('error', 'Por favor, selecciona una licencia.');
            return;
        }

        $token = LicenseToken::find($this->selectedTokenId);

        if (!$token) {
            session()->flash('error', 'La licencia seleccionada no existe.');
            return;
        }

        // Verificar que el token pertenece al cliente
        if ($token->client_id !== $this->client->id) {
            session()->flash('error', 'La licencia seleccionada no pertenece a este cliente.');
            return;
        }

        // Se comprobaba el token contra el cliente, pero NO el entorno: el entorno
        // llega por la URL (`/{client}/associate-license/{environment?}`), así que
        // una ruta con el cliente A y un entorno del cliente B se lo llevaba al
        // token de A, dejando a B sin licencia. Ver known-issues MGR-004.
        if ($this->environment && $this->validateAssignableEnvironments($token, [$this->environment->id]) === null) {
            session()->flash('error', 'El entorno seleccionado no pertenece a este cliente.');
            return;
        }

        try {
            if ($this->environment) {
                // Asociar la licencia al entorno
                $this->environment->update(['license_token_id' => $token->id]);
                session()->flash('success', 'Licencia asociada al entorno correctamente.');
                return $this->redirect(route('environments.index'), navigate: true);
            } else {
                // Si no hay entorno, simplemente redirigir al cliente
                // (En este caso, la licencia ya está asociada al cliente por client_id)
                session()->flash('success', 'Licencia asociada correctamente.');
                return $this->redirect(route('clients.show', $this->client), navigate: true);
            }
        } catch (\Exception $e) {
            session()->flash('error', 'Error al asociar la licencia: ' . $e->getMessage());
        }
    }

    public function render()
    {
        return view('livewire.license-tokens.associate-license')
            ->layout('layouts.clean');
    }
}
