<?php

// Importación de estaciones desde un archivo CSV
// Este comando permite importar datos de estaciones desde un archivo CSV,
// incluyendo la vinculación con servicios.

// Uso: php artisan import:estaciones {ruta_del_archivo}

// El archivo CSV debe contener las siguientes columnas:
// - Nombre de la estación
// - Ciudad
// - Ubicación (en formato "latitud,longitud")
// - Dirección
// - Servicio ID (opcional, para vincular con servicios)

// Asegúrate de que el archivo CSV esté correctamente formateado y que las ciudades
// existan en la base de datos antes de ejecutar este comando.

// Nota: Si una ciudad no se encuentra, el registro correspondiente será omitido.

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Admin\Estacion;  // Asegúrate de tener el modelo
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;  // Añadir esta línea

class ImportEstaciones extends Command
{
    protected $signature = 'import:estaciones {file}';
    protected $description = 'Importar estaciones desde un archivo CSV';

    public function handle()
    {
        $filePath = $this->argument('file');

        if (!File::exists($filePath)) {
            $this->error("El archivo no existe: {$filePath}");
            return;
        }

        // Leer el archivo CSV
        $csvData = array_map('str_getcsv', file($filePath));

        // Obtener las cabeceras y eliminar la primera fila
        $headers = array_shift($csvData);

        foreach ($csvData as $row) {
            $data = array_combine($headers, $row);
        
            // Extraer la latitud y longitud de la ubicación
            $ubicacion = $this->parseUbicacion($data['ubicación']);
        
            // Obtener el id de la ciudad
            $ciudadId = $this->getCiudadId($data['Ciudad']);
        
            // Si no se encuentra la ciudad, saltar este registro
            if (is_null($ciudadId)) {
                // Opción 1: Registrar una advertencia en los logs para seguimiento
                \Log::warning("Ciudad no encontrada: {$data['Ciudad']}. Registro omitido.");
        
                // Opción 2: También puedes mostrar un mensaje en la consola
                $this->warn("Registro omitido. No se encontró la ciudad: {$data['Ciudad']}");
                
                // Omitir este registro
                continue;
            }
        
            // Obtener el servicio_id si está presente en los datos
            $servicioId = isset($data['servicio_id']) ? $data['servicio_id'] : null;
        
            // Formatear manualmente el JSON para la columna 'ubicacion'
            $ubicacionJson = json_encode([
                'lat' => $ubicacion['lat'],
                'lng' => $ubicacion['lng']
            ], JSON_NUMERIC_CHECK);
        
            // Insertar la estación en la base de datos
            $estacionId = DB::table('estaciones')->insertGetId([
                'titulo'     => $data['titulo'],
                'slug'       => str_slug($data['titulo']),
                'estado'     => 1,
                'ciudad_id'  => $ciudadId,
                'ubicacion'  => $ubicacionJson,
                'direccion'  => $data['direccion'],
                'created_at' => now(),
                'updated_at' => now(),
            ]);

            // Si hay un servicio_id, crear la relación en estaciones_servicios
            /*if ($servicioId && $servicioId !== 'no') {
                DB::table('estaciones_servicios')->insert([
                    'estacion_id' => $estacionId,
                    'servicio_id' => $servicioId,
                    'created_at'  => now(),
                    'updated_at'  => now(),
                ]);
            }*/
        }

        $this->info("Importación completada.");
    }

    private function parseUbicacion($ubicacion)
    {
        // Limpiar la ubicación y separarla en latitud y longitud
        list($lat, $lng) = explode(',', $ubicacion);

        return [
            'lat' => (float) trim($lat),
            'lng' => (float) trim($lng),
        ];
    }

    private function getCiudadId($ciudadNombre)
    {
        // Buscar la ciudad en la base de datos
        $ciudad = DB::table('ciudades')->where('nombre', $ciudadNombre)->first();

        if (!$ciudad) {
            // Si no existe, generar un log
            \Log::warning("La ciudad '{$ciudadNombre}' no se encuentra en la base de datos.");

            // Retornar null o puedes manejar el error de otra forma si es necesario
            return null;
        }

        return $ciudad->id;
    }
}
