<?php

namespace App\Imports;

use App\Models\Product;
use App\Models\Category;
use App\Models\Brand;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\SkipsEmptyRows;

/**
 * Importación masiva de productos desde Excel.
 *
 * - Usa la fila de cabecera (WithHeadingRow) con nombres en español; Laravel-Excel
 *   los normaliza a snake_case (ej. "Precio de oferta" -> "precio_de_oferta").
 * - Resuelve la CATEGORÍA y la MARCA por NOMBRE (las crea si no existen).
 * - Genera el SLUG automáticamente a partir del nombre si no viene.
 */
class ProductsImport implements ToModel, WithHeadingRow, WithBatchInserts, SkipsEmptyRows
{
    public function model(array $row)
    {
        // Nombre es obligatorio; si falta, se omite la fila.
        $name = trim($row['nombre'] ?? '');
        if ($name === '') {
            return null;
        }

        // Resolver categoría por nombre (crea si no existe).
        $categoryId = null;
        if (! empty($row['categoria'])) {
            $categoryId = Category::firstOrCreate(
                ['name' => trim($row['categoria'])],
                ['slug' => Str::slug($row['categoria']) . '-' . Str::random(4)]
            )->id;
        }

        // Resolver marca por nombre (crea si no existe).
        $brandId = null;
        if (! empty($row['marca'])) {
            $brandId = Brand::firstOrCreate(
                ['name' => trim($row['marca'])],
                ['slug' => Str::slug($row['marca']) . '-' . Str::random(4)]
            )->id;
        }

        return new Product([
            'name'                => $name,
            'slug'                => ! empty($row['slug']) ? $row['slug'] : Str::slug($name) . '-' . Str::random(4),
            'description'         => $row['descripcion'] ?? null,
            'price'               => $this->num($row['precio'] ?? 0),
            'sale_price'          => isset($row['precio_de_oferta']) && $row['precio_de_oferta'] !== '' ? $this->num($row['precio_de_oferta']) : null,
            'stock'               => (int) ($row['stock'] ?? 0),
            'category_id'         => $categoryId,
            'brand_id'            => $brandId,
            'image_url'           => $row['imagen_url'] ?? null,
            'is_active'           => $this->bool($row['activo'] ?? 1),
            'is_on_sale'          => $this->bool($row['en_oferta'] ?? 0),
            'is_product_of_month' => $this->bool($row['producto_del_mes'] ?? 0),
        ]);
    }

    public function batchSize(): int
    {
        return 200;
    }

    private function num($v): float
    {
        return (float) str_replace(',', '.', (string) $v);
    }

    private function bool($v): bool
    {
        return in_array(strtolower((string) $v), ['1', 'si', 'sí', 'true', 'x', 'yes'], true);
    }
}
