<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\{Proveedor, Insumo, Receta, InsumoStock, Kardex};

class GastronomiaSeeder extends Seeder
{
    public function run(): void
    {
        DB::transaction(function () {
            // 1. Insertar Proveedores
            $proveedoresData = [
                [
                    "razon_social" => "ACOMARE",
                    "ruc" => "20456789012",
                    "telefono" => "054-234567",
                    "contacto_nombre" => "Luis Quispe",
                    "email" => "ventas@acomare.pe",
                    "direccion" => "Mercado Mayorista Río Seco, Arequipa",
                    "tipo" => "distribuidor",
                    "notas" => "Proveedor principal de carnes y pollo"
                ],
                [
                    "razon_social" => "Distribuidora Sur Andina SAC",
                    "ruc" => "20601234567",
                    "telefono" => "054-345678",
                    "contacto_nombre" => "María Torres",
                    "email" => "ventas@surandina.pe",
                    "direccion" => "Av. Kennedy 1200, Paucarpata",
                    "tipo" => "distribuidor",
                    "notas" => "Abarrotes y lácteos"
                ],
                [
                    "razon_social" => "Mercado San Camilo Puesto 45",
                    "ruc" => "10456789123",
                    "telefono" => "987654321",
                    "contacto_nombre" => "Juan Mamani",
                    "email" => null,
                    "direccion" => "Mercado San Camilo, Arequipa",
                    "tipo" => "mercado",
                    "notas" => "Verduras frescas"
                ],
                [
                    "razon_social" => "AgroFresh Arequipa",
                    "ruc" => "20607891234",
                    "telefono" => "054-456789",
                    "contacto_nombre" => "Carlos Delgado",
                    "email" => "contacto@agrofresh.pe",
                    "direccion" => "Cerro Colorado, Arequipa",
                    "tipo" => "distribuidor",
                    "notas" => "Frutas y verduras premium"
                ],
                [
                    "razon_social" => "Pesquera Misti SAC",
                    "ruc" => "20604561234",
                    "telefono" => "054-567890",
                    "contacto_nombre" => "Rosa Cárdenas",
                    "email" => "ventas@pesqueramisti.pe",
                    "direccion" => "Mollendo - Arequipa",
                    "tipo" => "distribuidor",
                    "notas" => "Pescados frescos diarios"
                ],
                [
                    "razon_social" => "Bodega Don Pepe",
                    "ruc" => "10234567891",
                    "telefono" => "945678123",
                    "contacto_nombre" => "José Huamán",
                    "email" => null,
                    "direccion" => "José Luis Bustamante y Rivero",
                    "tipo" => "mercado",
                    "notas" => "Compras rápidas"
                ]
            ];

            foreach ($proveedoresData as $provData) {
                Proveedor::firstOrCreate(
                    ['ruc' => $provData['ruc']],
                    $provData
                );
            }

            // 2. Insertar Insumos y vincularlos a su proveedor
            $insumosData = [
                ["nombre"=>"Pollo entero","marca"=>"ACOMARE","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>12.50,"activo"=>1],
                ["nombre"=>"Carne de res (lomo)","marca"=>"ACOMARE","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>28.00,"activo"=>1],
                ["nombre"=>"Pescado fresco","marca"=>"Pesquera Misti SAC","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>18.00,"activo"=>1],
                ["nombre"=>"Papa amarilla","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"unidad","factor_conversion"=>10,"costo_unitario"=>3.50,"activo"=>1],
                ["nombre"=>"Papa rosada","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"unidad","factor_conversion"=>10,"costo_unitario"=>3.20,"activo"=>1],
                ["nombre"=>"Cebolla","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>2.80,"activo"=>1],
                ["nombre"=>"Ajo","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>6.00,"activo"=>1],
                ["nombre"=>"Tomate","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>4.00,"activo"=>1],
                ["nombre"=>"Pimiento","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>5.00,"activo"=>1],
                ["nombre"=>"Zanahoria","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>2.50,"activo"=>1],
                ["nombre"=>"Alberja","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>4.50,"activo"=>1],
                ["nombre"=>"Limón","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"unidad","factor_conversion"=>20,"costo_unitario"=>5.00,"activo"=>1],
                ["nombre"=>"Ají mirasol molido","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>15.00,"activo"=>1],
                ["nombre"=>"Ají limo","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>12.00,"activo"=>1],
                ["nombre"=>"Pan francés","marca"=>"Local","unidad_compra"=>"unidad","unidad_uso"=>"unidad","factor_conversion"=>1,"costo_unitario"=>0.30,"activo"=>1],
                ["nombre"=>"Leche entera","marca"=>"Gloria","unidad_compra"=>"lata","unidad_uso"=>"ml","factor_conversion"=>400,"costo_unitario"=>4.50,"activo"=>1],
                ["nombre"=>"Queso parmesano","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>45.00,"activo"=>1],
                ["nombre"=>"Apio","marca"=>"Local","unidad_compra"=>"unidad","unidad_uso"=>"g","factor_conversion"=>500,"costo_unitario"=>1.50,"activo"=>1],
                ["nombre"=>"Cilantro","marca"=>"Local","unidad_compra"=>"atado","unidad_uso"=>"g","factor_conversion"=>100,"costo_unitario"=>1.00,"activo"=>1],
                ["nombre"=>"Jengibre","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>8.00,"activo"=>1],
                ["nombre"=>"Sal","marca"=>"Emsal","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>1.80,"activo"=>1],
                ["nombre"=>"Pimienta","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>20.00,"activo"=>1],
                ["nombre"=>"Comino","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>18.00,"activo"=>1],
                ["nombre"=>"Orégano","marca"=>"Local","unidad_compra"=>"kg","unidad_uso"=>"g","factor_conversion"=>1000,"costo_unitario"=>12.00,"activo"=>1],
                ["nombre"=>"Vino tinto","marca"=>"Tabernero","unidad_compra"=>"botella","unidad_uso"=>"ml","factor_conversion"=>750,"costo_unitario"=>18.00,"activo"=>1],
                ["nombre"=>"Aceite vegetal","marca"=>"Primor","unidad_compra"=>"litro","unidad_uso"=>"ml","factor_conversion"=>1000,"costo_unitario"=>9.00,"activo"=>1],
            ];

            $insumosMap = [];

            foreach ($insumosData as $insData) {
                $insumo = Insumo::firstOrCreate(
                    ['nombre' => $insData['nombre']],
                    $insData
                );
                
                $insumosMap[$insumo->nombre] = $insumo;

                // Relacionar con proveedor
                $proveedor = Proveedor::where('razon_social', $insData['marca'])->first();
                if ($proveedor) {
                    $insumo->proveedores()->syncWithoutDetaching([
                        $proveedor->id => [
                            'precio' => $insumo->costo_unitario,
                            'unidad' => $insumo->unidad_compra,
                            'ultima_actualizacion' => now()
                        ]
                    ]);
                }
            }

            // 3. Insertar Recetas e Ingredientes
            $recetasData = [
                [
                    "nombre" => "Ají de gallina",
                    "porciones" => 1,
                    "ingredientes" => [
                        ["insumo"=>"Pollo entero","cantidad"=>250],
                        ["insumo"=>"Pan francés","cantidad"=>1],
                        ["insumo"=>"Leche entera","cantidad"=>80],
                        ["insumo"=>"Ají mirasol molido","cantidad"=>15],
                        ["insumo"=>"Queso parmesano","cantidad"=>20],
                        ["insumo"=>"Cebolla","cantidad"=>50],
                        ["insumo"=>"Aceite vegetal","cantidad"=>15],
                    ]
                ],
                [
                    "nombre" => "Ceviche",
                    "porciones" => 1,
                    "ingredientes" => [
                        ["insumo"=>"Pescado fresco","cantidad"=>200],
                        ["insumo"=>"Limón","cantidad"=>6],
                        ["insumo"=>"Cebolla","cantidad"=>50],
                        ["insumo"=>"Ají limo","cantidad"=>5, "tipo"=>"accesorio"],
                        ["insumo"=>"Cilantro","cantidad"=>5],
                    ]
                ],
                [
                    "nombre" => "Estofado de pollo",
                    "porciones" => 1,
                    "ingredientes" => [
                        ["insumo"=>"Pollo entero","cantidad"=>220],
                        ["insumo"=>"Papa amarilla","cantidad"=>1],
                        ["insumo"=>"Zanahoria","cantidad"=>50],
                        ["insumo"=>"Tomate","cantidad"=>40],
                        ["insumo"=>"Cebolla","cantidad"=>40],
                        ["insumo"=>"Vino tinto","cantidad"=>50],
                        ["insumo"=>"Aceite vegetal","cantidad"=>20],
                    ]
                ],
                [
                    "nombre" => "Lomo saltado",
                    "porciones" => 1,
                    "ingredientes" => [
                        ["insumo"=>"Carne de res (lomo)","cantidad"=>200],
                        ["insumo"=>"Papa rosada","cantidad"=>2],
                        ["insumo"=>"Tomate","cantidad"=>80],
                        ["insumo"=>"Cebolla","cantidad"=>80],
                        ["insumo"=>"Aceite vegetal","cantidad"=>30],
                    ]
                ]
            ];

            foreach ($recetasData as $rData) {
                $receta = Receta::firstOrCreate(
                    ['nombre' => $rData['nombre']],
                    [
                        'user_id' => 1, 
                        'porciones' => $rData['porciones'], 
                        'activa' => true,
                        'costo_esperado' => 0 
                    ]
                );

                $costoIdealGenerado = 0;

                foreach ($rData['ingredientes'] as $ing) {
                    $insumo = $insumosMap[$ing['insumo']] ?? Insumo::firstOrCreate(
                        ['nombre' => $ing['insumo']],
                        [
                            'unidad_compra' => 'Utd', 'unidad_uso' => 'Utd', 'factor_conversion' => 1,
                            'costo_unitario' => 0.00, 'activo' => 1
                        ]
                    );

                    // Calculo inteligente del costo con conversiones
                    $costoIngrediente = ($insumo->factor_conversion > 0) 
                                        ? ($insumo->costo_unitario / $insumo->factor_conversion) * $ing['cantidad'] 
                                        : ($insumo->costo_unitario * $ing['cantidad']);
                    
                    $costoIdealGenerado += $costoIngrediente;

                    $receta->ingredientes()->updateOrCreate(
                        ['insumo_id' => $insumo->id],
                        [
                            'cantidad' => $ing['cantidad'],
                            'tipo' => $ing['tipo'] ?? 'principal'
                        ]
                    );
                }

                if ($receta->costo_esperado == 0) {
                    // Margen de Venta Implicito: Fijamos el Costo Ideal inflado artificialmente por 0.5 o solo el Base para demostrar Margen!
                    // Simularemos que el Ideal (Meta) esta +15% de holgura por mermas. 
                    $costoConMerma = round($costoIdealGenerado * 1.15, 2);
                    $receta->update(['costo_esperado' => $costoConMerma]);
                }
            }

            // 4. Sembrado Fuerte de Almacén (InsumoStock) para Cayma (1) y Central (2)
            $sucursales = [1, 2];

            foreach ($sucursales as $sucId) {
                foreach ($insumosMap as $insumo) {
                    // Le damos suficiente stock inicial a cada sucursal para operar fuertemente 
                    // Ej: 15 Ajíes de gallina x 250g de pollo = 3750g. Le inyectamos 10000g (10 kilos) de base.
                    
                    $cantidadAInyectar = $insumo->factor_conversion * rand(8, 20); // Entre 8 a 20 Unidades de Cajas/Sacos/Kilos base

                    InsumoStock::updateOrCreate(
                        ['insumo_id' => $insumo->id, 'sucursal_id' => $sucId],
                        [
                            'cantidad_actual' => $cantidadAInyectar,
                            'cantidad_minima' => $insumo->factor_conversion * 2, // 2 cajas/kilos minimos
                        ]
                    );

                    // Historial Kardex
                    Kardex::create([
                        'insumo_id' => $insumo->id,
                        'sucursal_id' => $sucId,
                        'tipo' => 'entrada',
                        'cantidad' => $cantidadAInyectar,
                        'saldo_anterior' => 0,
                        'saldo_posterior' => $cantidadAInyectar,
                        'motivo' => 'Inventario Inicial Configurado (Sistema)',
                        'user_id' => 1
                    ]);
                }
            }

        });
    }
}
