<?php

namespace App\Imports;

use App\Models\Producto;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\SkipsEmptyRows;
use Illuminate\Support\Facades\Log;

class ProductosImport implements ToModel, WithHeadingRow, SkipsEmptyRows
{
    protected $importedCount = 0;
    protected $errors = [];

    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        try {
            // Función helper para limpiar y convertir valores numéricos
            $cleanNumber = function($value) use (&$nombreProducto) {
                $original = $value;

                // Convertir a string
                $value = (string)$value;

                // Eliminar TODOS los tipos de espacios en blanco (espacios, tabs, nbsp, etc.)
                $value = preg_replace('/\s+/u', '', $value);

                // Si ya es numérico después de limpiar espacios, convertir directamente
                if (is_numeric($value)) {
                    $result = floatval($value);
                    Log::info("cleanNumber ÉXITO para {$nombreProducto}: '{$original}' -> limpieza espacios -> '{$value}' -> {$result}");
                    return $result;
                }

                // Limpiar puntos y comas (separadores de miles)
                $cleaned = str_replace(['.', ','], '', $value);

                $result = is_numeric($cleaned) ? floatval($cleaned) : 0;
                Log::info("cleanNumber para {$nombreProducto}: '{$original}' -> limpieza espacios -> '{$value}' -> limpieza separadores -> '{$cleaned}' -> {$result}");

                return $result;
            };

            // Obtener nombre del producto para mensajes de error
            $nombreProducto = $row['producto'] ?? $row['nombre'] ?? 'desconocido';
            $fragancia = $row['fragancia'] ?? '';

            // LOG: Ver todas las claves del array
            Log::info("=== FILA: {$nombreProducto} ===");
            Log::info("Claves disponibles: " . implode(', ', array_keys($row)));

            // Validar que los valores requeridos estén presentes
            if (empty($nombreProducto) || $nombreProducto === 'desconocido') {
                $this->errors[] = "Fila sin nombre de PRODUCTO";
                return null;
            }

            if (empty($fragancia)) {
                $this->errors[] = "FRAGANCIA vacía en fila: {$nombreProducto}";
                return null;
            }

            // Obtener y limpiar costo_1k (probar múltiples variaciones de nombre)
            $costo1kRaw = $row['costo_1k'] ??
                          $row['costo1k'] ??
                          $row['costo_1_k'] ??
                          $row['costo__1k'] ??
                          null;

            Log::info("costo_1k RAW para {$nombreProducto}: " . var_export($costo1kRaw, true));

            $costo1k = $costo1kRaw !== null ? $cleanNumber($costo1kRaw) : 0;

            Log::info("costo_1k FINAL para {$nombreProducto}: {$costo1k}");

            // Obtener y limpiar costo_frag_cf_cv (probar múltiples variaciones)
            $costoFragRaw = $row['costo_frag_cf_cv'] ??
                           $row['costo_frag_cfcv'] ??
                           $row['costofragcfcv'] ??
                           $row['costo_frag_cf__cv'] ??
                           $row['costofrag_cf_cv'] ??
                           null;

            Log::info("costo_frag_cf_cv RAW para {$nombreProducto}: " . var_export($costoFragRaw, true));

            $costoFragCfCv = $costoFragRaw !== null ? $cleanNumber($costoFragRaw) : 0;

            Log::info("costo_frag_cf_cv FINAL para {$nombreProducto}: {$costoFragCfCv}");

            // Obtener categoría
            $categoriaId = intval($row['categoria'] ?? $row['categoria_id'] ?? 1);
            if ($categoriaId <= 0) {
                $categoriaId = 1; // Categoría por defecto
            }

            // Calcular automáticamente los campos
            $iva19 = round($costo1k * 0.19, 2);
            $costo1kConIva = round($costo1k + $iva19, 2);
            $costoGr = round($costo1kConIva / 1000, 2);
            $precio30 = round($costoFragCfCv * 1.30, 2);
            $precio50 = round($costoFragCfCv * 1.50, 2);
            $precio75 = round($costoFragCfCv * 1.75, 2);
            $precio100 = round($costoFragCfCv * 2.00, 2);

            $this->importedCount++;

            return new Producto([
                'codigo' => $row['codigo'] ?? null,
                'nombre' => $nombreProducto,
                'fragancia' => $fragancia,
                'presentacion' => $row['presentacion'] ?? null,
                'categoria_id' => $categoriaId,
                'costo_1k' => $costo1k,
                'iva_19' => $iva19,
                'costo_1k_con_iva' => $costo1kConIva,
                'costo_gr' => $costoGr,
                'costo_frag_cf_cv' => $costoFragCfCv,
                'precio_30' => $precio30,
                'precio_50' => $precio50,
                'precio_75' => $precio75,
                'precio_100' => $precio100,
                'stock_actual' => 0,
                'stock_minimo' => 0,
                'estado' => true,
            ]);

        } catch (\Exception $e) {
            $this->errors[] = "Error en fila " . ($row['producto'] ?? 'desconocido') . ": " . $e->getMessage();
            return null;
        }
    }

    public function getImportedCount()
    {
        return $this->importedCount;
    }

    public function getErrors()
    {
        return $this->errors;
    }
}
