<?php

namespace App\Livewire\LicenseTokens;

use App\Livewire\Traits\AssignsTokenEnvironments;
use App\Models\Products\LicenseToken;
use Illuminate\Database\Eloquent\Builder;
use Livewire\Component;

class ManageEnvironments extends Component
{
    use AssignsTokenEnvironments;

    public LicenseToken $licenseToken;
    public array $selectedEnvironments = [];
    public string $search = '';

    public function mount(LicenseToken $license_token)
    {
        $this->licenseToken = $license_token;
        // Cargar entornos actualmente vinculados
        $this->selectedEnvironments = $license_token->environments->pluck('id')->toArray();
    }

    public function updatingSearch()
    {
        // Reset cuando se busca
    }

    public function save()
    {
        // El permiso de la ruta solo protege el GET de la pantalla: las llamadas a
        // métodos van a /livewire/update, donde el middleware `permission:` no se
        // reaplica. Hay que comprobarlo aquí. Ver known-issues MGR-005.
        $this->authorize('admin.license-tokens.manage-environments');

        $validIds = $this->validateAssignableEnvironments($this->licenseToken, $this->selectedEnvironments);

        if ($validIds === null) {
            session()->flash('error', 'La operación se ha cancelado: alguno de los entornos seleccionados no pertenece al cliente de este token.');

            return null;
        }

        $result = $this->syncTokenEnvironments($this->licenseToken, $validIds);

        $message = "Se han vinculado {$result['linked']} entorno(s) al token correctamente.";

        // Desvincular deja ese sitio SIN licencia: su plugin empezará a recibir
        // "Environment not found". Decirlo explícitamente en vez de solo "correctamente".
        if (!empty($result['unlinked'])) {
            $message .= ' Atención: ' . count($result['unlinked']) . ' entorno(s) se han quedado sin token y dejarán de recibir licencia ('
                . implode(', ', $result['unlinked']) . ').';
        }

        session()->flash('success', $message);

        return $this->redirect(route('license_tokens.show', $this->licenseToken), navigate: true);
    }

    public function render()
    {
        // Solo se ofrecen entornos del cliente dueño del token (ver el trait).
        $environments = $this->assignableEnvironmentsQuery($this->licenseToken)
            ->with(['client', 'licenseToken'])
            ->when($this->search, function (Builder $query) {
                // Las condiciones de búsqueda van agrupadas: sin el paréntesis, el
                // orWhere se saltaría el filtro por cliente.
                $query->where(function (Builder $inner) {
                    $inner->where('name', 'like', "%{$this->search}%")
                        ->orWhere('domain', 'like', "%{$this->search}%");
                });
            })
            ->orderBy('name')
            ->get();

        return view('livewire.license-tokens.manage-environments', [
            'environments' => $environments,
        ])->layout('layouts.app');
    }
}
