<?php

namespace App\Livewire\Traits;

use App\Support\VideoDeTutorial;

/**
 * Pegar la URL del vídeo en el campo del identificador y que se resuelva sola.
 *
 * **Lo que uno tiene en la mano es la URL**, copiada del navegador. El formulario pedía
 * dos campos —plataforma e identificador—, así que había que abrir la URL, encontrar el
 * trozo que es el id, copiarlo sin el `&t=42s` que YouTube pega detrás, y elegir la
 * plataforma a mano.
 *
 * Ahora se pega la URL entera en el mismo campo: se saca el id, se pone la plataforma que
 * toca y se enseña el enlace para comprobar que es el vídeo correcto. Y si lo que se pega
 * ya es un id, se deja como está sin tocar la plataforma —adivinarla ahí sería peor que no
 * hacer nada—.
 *
 * Importa porque `videoid` es **el único campo que puede estar mal y no fallar aquí**: se
 * guarda cualquier cadena, el tutorial se sirve igual y el vídeo no se ve en el Moodle del
 * cliente.
 */
trait PegaLaUrlDelVideo
{
    /**
     * Lo último que se resolvió de una URL pegada, para poder decirlo en pantalla.
     *
     * Vacío cuando el campo se ha escrito a mano: el aviso solo tiene sentido si acabamos
     * de cambiar algo que el usuario no pidió explícitamente.
     */
    public ?string $urlReconocida = null;

    /**
     * Se dispara al escribir o pegar en el campo del identificador.
     *
     * Livewire llama a `updated<Propiedad>` en cada cambio de `videoid`, así que esto corre
     * también al teclear: por eso solo actúa cuando lo pegado **es** una URL reconocible.
     */
    public function updatedVideoid(): void
    {
        $leido = VideoDeTutorial::interpretar($this->videoid);

        // Ni URL ni nada que interpretar: se deja lo escrito tal cual.
        if ($leido['id'] === null) {
            $this->urlReconocida = null;

            return;
        }

        // Era una URL de una plataforma conocida: se pone también la plataforma, porque
        // tenerla mal con el id bien deja el vídeo sin ver igualmente.
        if ($leido['plataforma'] !== null) {
            $this->platform = $leido['plataforma'];
            $this->urlReconocida = VideoDeTutorial::url($leido['plataforma'], $leido['id']);
        } else {
            $this->urlReconocida = null;
        }

        $this->videoid = $leido['id'];
    }

    /**
     * La URL del vídeo tal como está el formulario ahora, para el enlace de comprobar y
     * para el botón de copiar.
     *
     * Es la misma que calcula la API en `video_url`: copiar de aquí y lo que recibe el
     * cliente son el mismo enlace.
     */
    public function urlDelVideo(): ?string
    {
        return VideoDeTutorial::url($this->platform, $this->videoid);
    }

    /**
     * Si el identificador tiene la forma que esa plataforma usa.
     *
     * No comprueba que el vídeo exista —eso exige salir a internet—, pero un id de YouTube
     * que no tiene 11 caracteres o un Vimeo con letras **no va a funcionar**, y hoy se
     * guarda sin decir nada.
     */
    public function idPareceValido(): bool
    {
        return VideoDeTutorial::pareceValido($this->platform, $this->videoid);
    }
}
