<?php

namespace App\Livewire\Tutorials;

use App\Support\IdentificadorDeVideo;
use App\Models\Tutorials\Tutorial;
use App\Models\Tutorials\TutorialVersion;
use App\Models\Products\Product;
use App\Support\SiguienteOrden;
use Livewire\Component;

class Create extends Component
{
    use \App\Livewire\Traits\PegaLaUrlDelVideo;

    public Product $product;
    public TutorialVersion $tutorialVersion;
    public string $videoid = '';
    public string $platform = 'youtube';
    public string $title = '';
    public ?string $desc = null;
    public string $status = 'draft';
    public ?int $sort_order = null;

    public function mount(Product $product, TutorialVersion $tutorialVersion)
    {
        $this->product = $product;
        $this->tutorialVersion = $tutorialVersion;
        
        // Verificar que la versión pertenezca al producto
        if ($this->tutorialVersion->product_id !== $this->product->id) {
            abort(404, 'La versión de Tutoriales no pertenece a este producto.');
        }

        // **El orden sale puesto, no vacío.** «Orden (opcional)» se dejaba en blanco
        // casi siempre —es un número que no dice nada mientras escribes— y el elemento
        // se guardaba con el orden a null. Los nulos van al final y se ordenan entre
        // ellos por fecha, así que la lista acababa con un bloque sin orden decidido por
        // nadie: las flechas no hacían lo que parecía y la API los servía en ese orden
        // accidental. Con el número que de verdad le toca, quien no se fija obtiene lo
        // que esperaba —que quede el último— y quien quiere otra posición la escribe.
        $this->sort_order = SiguienteOrden::de($this->tutorialVersion->tutorials());
    }

    protected function rules()
    {
        return [
            // **Se extrae antes de validar** (MGR-091). Pegar la URL del vídeo es lo que
            // hace cualquiera, así que no es un error: es otra forma de rellenar el campo.
            // Y después se comprueba la forma, que antes no se comprobaba en absoluto: el
            // valor se guardaba tal cual y el vídeo no cargaba en el panel del cliente sin
            // que nada avisara.
            'videoid' => [
                'required',
                'string',
                'max:255',
                function (string $atributo, mixed $valor, \Closure $fallo) {
                    $identificador = IdentificadorDeVideo::extraer($valor, $this->platform);

                    if (! IdentificadorDeVideo::esValido($identificador, $this->platform)) {
                        $fallo(IdentificadorDeVideo::mensajeDeError($valor, $this->platform));
                    }
                },
            ],
            'platform' => 'required|in:youtube,vimeo',
            'title' => 'required|string|max:255',
            'desc' => 'nullable|string|max:1000',
            'status' => 'required|in:draft,published,archived',
            'sort_order' => 'nullable|integer|min:0',
        ];
    }

    protected function messages()
    {
        return [
            'videoid.required' => 'El ID del vídeo es obligatorio.',
            'videoid.max' => 'El ID del vídeo no puede tener más de 255 caracteres.',
            'platform.required' => 'La plataforma es obligatoria.',
            'platform.in' => 'La plataforma debe ser youtube o vimeo.',
            'title.required' => 'El título es obligatorio.',
            'title.max' => 'El título no puede tener más de 255 caracteres.',
            'desc.max' => 'La descripción no puede tener más de 1000 caracteres.',
            'status.required' => 'El estado es obligatorio.',
            'status.in' => 'El estado debe ser draft, published o archived.',
            'sort_order.integer' => 'El orden debe ser un número entero.',
            'sort_order.min' => 'El orden debe ser mayor o igual a 0.',
        ];
    }

    public function save()
    {
        $this->authorize('admin.tutorials.create');
        
        $validated = $this->validate();

        // Crear tutorial
        $tutorial = Tutorial::create([
            'tutorial_version_id' => $this->tutorialVersion->id,
            // El extraído, no lo escrito: si el autor pegó la URL, lo que se
            // guarda es el identificador.
            'videoid' => IdentificadorDeVideo::extraer($validated['videoid'], $validated['platform']),
            'platform' => $validated['platform'],
            'title' => $validated['title'],
            'desc' => $validated['desc'],
            'status' => $validated['status'],
            'sort_order' => $validated['sort_order'],
            'created_by' => auth()->id(),
        ]);

        session()->flash('success', 'Tutorial creado correctamente.');

        return $this->redirect(route('products.tutorials.version.show', [$this->product, $this->tutorialVersion]), navigate: true);
    }

    public function render()
    {
        return view('livewire.tutorials.create', [
            // Pegar la URL del vídeo resuelve el id y la plataforma: ver el trait.
            'urlDelVideo' => $this->urlDelVideo(),
            'idPareceValido' => $this->idPareceValido(),
            'product' => $this->product,
            'tutorialVersion' => $this->tutorialVersion,
        ])->layout('layouts.clean');
    }
}


