<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UnidadConversionesSeeder extends Seeder
{
    public function run()
    {
        // Cargar los datos desde el archivo JSON
        $jsonPath = database_path('data/catalogo_sat_unidad_de_conversiones.json');

        // Comprobar si el archivo JSON existe
        if (!file_exists($jsonPath)) {
            return;
        }

        $data = json_decode(file_get_contents($jsonPath), true);

        // Comprobar si el JSON se cargó correctamente
        if (json_last_error() !== JSON_ERROR_NONE) {
            return;
        }

        // Cargar todas las unidades existentes
        $unidadesExistentes = DB::table('sat_clave_unidad')->get()->keyBy('c_clave_unidad');

        // Un array para almacenar las nuevas unidades que vamos a insertar
        $nuevasUnidades = [];

        // Insertar o actualizar las unidades de medida
        foreach ($data['units'] as $unidad) {
            if (!isset($unidad['c_clave_unidad']) || trim($unidad['c_clave_unidad']) == '') {
                continue; // Ignorar si 'c_clave_unidad' es nulo o vacío
            }

            // Verificamos si la unidad ya existe
            if (!isset($unidadesExistentes[$unidad['c_clave_unidad']])) {
                $nuevasUnidades[] = [
                    'c_clave_unidad' => $unidad['c_clave_unidad'],
                    'nombre' => $unidad['nombre'],
                    'simbolo' => $unidad['simbolo'] ?? null,
                    'categoria' => $unidad['categoria'] ?? null,
                    'is_base' => false,  // Define la lógica para is_base
                    'created_at' => now(),
                    'updated_at' => now(),
                ];
            }
        }

        // Insertar todas las nuevas unidades en un solo paso
        if (!empty($nuevasUnidades)) {
            DB::table('sat_clave_unidad')->insert($nuevasUnidades);
        }

        // Volver a cargar las unidades existentes para las conversiones
        $unidadesExistentes = DB::table('sat_clave_unidad')->get()->keyBy('c_clave_unidad');

        // Preparar un array para las conversiones a insertar
        $nuevasConversiones = [];

        // Asegúrate de que 'conversions' existe en $data
        if (isset($data['conversions'])) {
            foreach ($data['conversions'] as $conversion) {
                $origen = $unidadesExistentes[$conversion['from_unit']] ?? null;
                $destino = $unidadesExistentes[$conversion['to_unit']] ?? null;

                // Solo insertar si ambos IDs existen
                if ($origen && $destino) {
                    $nuevasConversiones[] = [
                        'clave_unidad_origen_id' => $origen->id,
                        'clave_unidad_destino_id' => $destino->id,
                        'conversion_factor' => $conversion['factor'],
                        'created_at' => now(),
                        'updated_at' => now(),
                    ];
                }
            }

            // Insertar todas las conversiones en un solo paso
            if (!empty($nuevasConversiones)) {
                DB::table('sat_clave_unidad_conversiones')->insert($nuevasConversiones);
            }
        }
    }
}
