<?php

namespace App\Livewire\Environments;

use App\Models\Environments\Environment;
use App\Services\Moodle\MoodleSyncService;
use LivewireUI\Modal\ModalComponent;

/**
 * Pedirle al Moodle del cliente que envíe su foto de uso, ahora.
 *
 * **El hueco que tapa.** «Uso del entorno» sale vacía —«último dato recibido: nunca»— y
 * hasta ahora no había nada que hacer desde el Manager: la foto la manda una tarea
 * programada del plugin (`sync_stats_task`, sobre las 02:00), así que la única salida era
 * esperar a la madrugada o entrar al Moodle del cliente a lanzar la tarea a mano. Es el
 * mismo problema que ya resolvió «Sincronizar ahora» para el inventario de plugins, y la
 * misma solución: el Manager llama al servicio web del plugin y le dice que la lance.
 *
 * **Va en modal y no en un botón suelto, y por dos razones.** Una: esto **llama al Moodle
 * de un cliente**, y una acción que sale de nuestro servidor hacia el sitio de otro se
 * confirma antes, no se dispara con un clic al pasar. Y dos: lo que hay que contar no cabe
 * en un botón —que los datos no vuelven en esta respuesta, que llegan en una llamada aparte
 * unos segundos después, y qué hacer si el sitio no tiene guardado su token—.
 *
 * **Qué significa «ha ido bien».** Que el Moodle ha aceptado el encargo. La foto la manda
 * él, en una petición aparte a nuestra API, igual que hace de noche. Así que la pantalla
 * tiene que recargar para verla, y por eso el resultado correcto ofrece recargar en vez de
 * dar por hecho que ya está.
 */
class PedirDatosModal extends ModalComponent
{
    public Environment $environment;

    public ?bool $ok = null;
    public ?string $resultado = null;
    public ?string $detalle = null;

    public function mount(int $environmentId): void
    {
        // El permiso de la ruta no se reaplica en /livewire/update (MGR-005), y esto
        // dispara una llamada al sitio de un cliente.
        $this->authorize('admin.environments.refresh');

        $this->environment = Environment::findOrFail($environmentId);
    }

    public static function modalMaxWidth(): string
    {
        return 'lg';
    }

    /**
     * ¿Se le puede pedir algo a este Moodle?
     *
     * Un método y no una propiedad computada: la forma `getXProperty()` que usa el resto
     * del proyecto es de Livewire 2 y no resuelve al llamarla desde dentro del componente
     * —el mismo detalle que ya mordió en `MoodleConnectionModal`—.
     */
    public function tieneToken(): bool
    {
        return trim((string) $this->environment->moodletoken) !== '';
    }

    public function pedir(MoodleSyncService $servicio): void
    {
        $this->authorize('admin.environments.refresh');

        $respuesta = $servicio->pedirDatosDeUso($this->environment);

        $this->ok = $respuesta['ok'];
        $this->resultado = $respuesta['mensaje'];
        $this->detalle = $respuesta['detalle'] ?? null;

        if ($this->ok) {
            // La pantalla de detrás se repinta: puede que la foto ya haya llegado
            // mientras esperábamos la respuesta del Moodle.
            $this->dispatch('datosDeUsoPedidos');
        }
    }

    public function render()
    {
        return view('livewire.environments.pedir-datos-modal');
    }
}
