<?php

namespace App\Livewire\Products;

use App\Models\Products\Product;
use App\Support\LimiteDeSubida;
use Livewire\Component;
use Livewire\WithFileUploads;

class Create extends Component
{
    use WithFileUploads;

    /**
     * El identificador del producto, que **es el `component` de Moodle**
     * —`local_tresipunt`, `theme_fresk`—: es cómo lo resuelve la API y cómo se cruza
     * con el inventario de plugins de cada entorno.
     *
     * **En la URL** para poder llegar aquí con el slug ya puesto. El inventario de un
     * entorno enlaza así: cuando encuentra un plugin nuestro que el catálogo no
     * conoce, ofrece darlo de alta sin tener que copiar el identificador a mano —que
     * es donde se cometen los dedazos, y un slug mal escrito deja al producto sin
     * emparejar con nada—.
     */
    #[\Livewire\Attributes\Url(except: '')]
    public string $slug = '';
    public string $name = '';
    public string $summary = '';
    public ?string $description = null;
    public string $tech = '';
    public string $type = '';
    public ?string $metadata = null;
    public bool $actived = false;
    public bool $enabled = false;

    /**
     * El icono del producto.
     *
     * **La columna `products.image` existía desde enero, el accessor `image_url` estaba
     * escrito y tres vistas ya lo pintaban** —el listado, la ficha y la tarjeta, con
     * `placeholder.png` de reserva—, pero ni este formulario ni el de edición tenían el
     * campo: no había forma de poner un icono a un producto. Es el mismo patrón que ya
     * apareció con el alta de tipos de entorno y con el borrado de tipos de soporte.
     *
     * **Sin SVG**, igual que en el resto de subidas del panel: un SVG puede llevar código
     * y se serviría desde el propio dominio del panel (MGR-020).
     */
    public $image = null;

    protected function rules()
    {
        return [
            'slug' => 'required|string|max:200|unique:products,slug',
            'name' => 'required|string|max:200',
            'summary' => 'required|string',
            'description' => 'nullable|string',
            // Opcional por lo mismo: **no lo lee nadie**. `isMoodle()` e
            // `isWordPress()` existen en el modelo y no se llaman desde ningún sitio,
            // así que exigirlo era pedir un dato que no se usa.
            'tech' => 'nullable|string|max:50',
            // **Opcional**, como la columna. Un producto que no es un plugin de Moodle
            // no tiene tipo, y obligarlo solo conseguía que se pusiera uno falso.
            'type' => 'nullable|string|max:50',
            'metadata' => 'nullable|string',
            'actived' => 'nullable|boolean',
            'enabled' => 'nullable|boolean',
            'image' => ['nullable', 'file', 'mimes:jpeg,jpg,png,webp', 'max:' . LimiteDeSubida::enKb()],
        ];
    }

    protected function messages(): array
    {
        return [
            'image.mimes' => 'El icono debe ser jpg, png o webp. El SVG no se acepta: puede llevar código y se serviría desde el propio dominio del panel.',
        ];
    }

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

        // Procesar metadata JSON
        if (!empty($validated['metadata'])) {
            $decoded = json_decode($validated['metadata'], true);
            $validated['metadata'] = json_last_error() === JSON_ERROR_NONE ? $decoded : null;
        } else {
            $validated['metadata'] = null;
        }

        // Vacío es null y no cadena vacía: son el mismo estado y guardarlos como dos deja
        // la columna con las dos formas de «no tiene tipo».
        foreach (['type', 'tech'] as $campo) {
            if (($validated[$campo] ?? '') === '') {
                $validated[$campo] = null;
            }
        }

        // Mismo destino que los iconos de los tipos de entorno, en su propia carpeta. Los
        // que vienen con la aplicación viven en `images_static/` y no se tocan.
        if ($this->image) {
            $validated['image'] = $this->image->store('images/products', 'public');
        }

        Product::create($validated);

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

        return $this->redirect(route('products.index'), navigate: true);
    }

    public function render()
    {
        return view('livewire.products.create', [
            // Las sugerencias de los dos campos libres: los valores de siempre más los que
            // ya se hayan usado. Ver `Product::tiposSugeridos()`.
            'tipos' => Product::tiposSugeridos(),
            'tecnologias' => Product::tecnologiasSugeridas(),
        ])->layout('layouts.app');
    }
}

