<?php

namespace Koneko\SatCatalogs\Console\Commands;

use Illuminate\Console\Command;
use Koneko\SatCatalogs\Services\CsvDatabaseService;

class ImportCsvToDatabase extends Command
{
    protected $signature = 'sat:import-csv {--update}';
    protected $description = 'Importa todos los archivos CSV de los catálogos SAT a la base de datos';

    private array $csvMappings = [
            'c_formapago'       => ['table' => 'sat_forma_pago',        'columns' => ['c_forma_pago', 'descripcion', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_moneda'          => ['table' => 'sat_moneda',            'columns' => ['c_moneda', 'descripcion', 'decimales', 'porcentaje_variacion', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_codigopostal'    => ['table' => 'sat_codigo_postal',     'columns' => ['c_codigo_postal', 'c_estado', 'c_municipio', 'c_localidad', 'estimulo_franja_fronteriza', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_pais'            => ['table' => 'sat_pais',              'columns' => ['c_pais', 'descripcion', 'formato_de_codigo_postal', 'formato_de_registro_de_identidad_tributaria', 'validacion_del_registro_de_identidad_tributaria', 'agrupaciones']],
            'c_estado'          => ['table' => 'sat_estado',            'columns' => ['c_estado', 'c_pais', 'nombre_del_estado', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_municipio'       => ['table' => 'sat_municipio',         'columns' => ['c_municipio', 'c_estado', 'descripcion', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_localidad'       => ['table' => 'sat_localidad',         'columns' => ['c_localidad', 'c_estado', 'descripcion', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_colonia'         => ['table' => 'sat_colonia',           'columns' => ['c_colonia', 'c_codigo_postal', 'nombre_del_asentamiento']],
            'c_regimenfiscal'   => ['table' => 'sat_regimen_fiscal',    'columns' => ['c_regimen_fiscal', 'descripcion', 'fisica', 'moral', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_usocfdi'         => ['table' => 'sat_uso_cfdi',          'columns' => ['c_uso_cfdi', 'descripcion', 'aplica_para_tipo_persona_fisica', 'aplica_para_tipo_persona_moral', 'fecha_inicio_vigencia', 'fecha_fin_vigencia', 'regimen_fiscal_receptor']],
            'c_claveprodserv'   => ['table' => 'sat_clave_prod_serv',   'columns' => ['c_clave_prod_serv', 'descripcion', 'incluir_iva_trasladado', 'incluir_ieps_trasladado', 'complemento_que_debe_incluir', 'fecha_inicio_vigencia', 'fecha_fin_vigencia', 'estimulo_franja_fronteriza', 'palabras_similares']],
            'c_claveunidad'     => ['table' => 'sat_clave_unidad',      'columns' => ['c_clave_unidad', 'nombre', 'descripcion', 'nota', 'fecha_inicio_vigencia', 'fecha_fin_vigencia', 'simbolo']],
            'c_aduana'          => ['table' => 'sat_aduana',            'columns' => ['c_aduana', 'descripcion', 'fecha_inicio_vigencia', 'fecha_fin_vigencia']],
            'c_banco'           => ['table' => 'sat_banco',             'columns' => ['c_banco', 'descripcion', 'razon_social', 'rfc', 'status']],
            'c_deduccion'       => ['table' => 'sat_deduccion',         'columns' => ['c_deduccion', 'descripcion']],
            'c_percepcion'      => ['table' => 'sat_percepcion',        'columns' => ['c_percepcion', 'descripcion', 'gravado_exento']],
            'c_regimen_contratacion' => ['table' => 'sat_regimen_contratacion', 'columns' => ['c_tipo_regimen', 'descripcion']],
    ];

    public function handle()
    {
        $csvPath = database_path('seeders/sat_cache/');
        $updateExisting = $this->option('update');

        if (!is_dir($csvPath)) {
            $this->error("⚠️ No se encontró la carpeta: {$csvPath}");
            return;
        }

        $totalFiles = count($this->csvMappings);
        $this->info("📌 Iniciando importación de {$totalFiles} archivos CSV...\n");

        foreach ($this->csvMappings as $csvFile => $mapping) {
            $fullPath = "{$csvPath}{$csvFile}.csv";

            if (!file_exists($fullPath)) {
                $this->warn("⚠️ Archivo CSV no encontrado: {$fullPath}");

                continue;
            }

            $this->info("📂 Importando: {$csvFile}.csv → {$mapping['table']}");

            $result = CsvDatabaseService::importCsvToTable($fullPath, $mapping['table'], $mapping['columns'], $updateExisting);

            if (isset($result['error'])) {
                $this->error("❌ Error en {$csvFile}: {$result['error']}");
            } else {
                $inserted = $result['inserted'] ?? 0;

                $this->info("✅ Importación completa: {$csvFile} ({$inserted} insertados)\n");
            }
        }

        $this->info("✅ Todos los archivos CSV han sido importados correctamente.");
    }
}
