<?php
session_start();
require_once __DIR__ . '/../config/db_auto.php';
require_once __DIR__ . '/validation.php';
require_once __DIR__ . '/db_utils.php';
require_once __DIR__ . '/enhanced_validation.php';
require_once __DIR__ . '/import_result_manager.php';
require_once __DIR__ . '/csv_pre_validator.php';
require_once __DIR__ . '/system_logger.php';

use function App\Utils\validarRUN;
use function App\DB\upsert;
use App\Utils\ImportValidator;
use App\Utils\ImportResultManager;
use App\Utils\CSVPreValidator;

// Definir el encabezado aquí para que esté disponible tanto para la validación como para la plantilla de descarga.
$expected_header = ['run', 'nombre', 'ap_paterno', 'ap_materno', 'domicilio', 'parentesco', 'telefono', 'telefono2', 'email', 'escolaridad', 'profesion', 'actividad_laboral'];

$logger = SystemLogger::getInstance();

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['csv_file'])) {
    // Verificar autenticación
    if (!isset($_SESSION['user_id'])) {
        $logger->warning('Intento de importación de familiares sin autenticación', 'IP: ' . ($_SERVER['REMOTE_ADDR'] ?? 'N/A'));
        header('Location: ../views/login.php');
        exit;
    }

    $result_manager = new ImportResultManager();
    $filename = $_FILES['csv_file']['tmp_name'];

    // Pre-validación del archivo
    $pre_validator = new CSVPreValidator();
    $pre_validation = $pre_validator->validateFile($filename, $expected_header);

    if (!empty($pre_validation['errors'])) {
        $error_html = '<h4>Errores en el archivo CSV:</h4><ul>';
        foreach ($pre_validation['errors'] as $error) {
            $error_html .= '<li>' . htmlspecialchars($error) . '</li>';
        }
        $error_html .= '</ul>';

        $_SESSION['import_message'] = $error_html;
        $_SESSION['import_status'] = 'error';
        $logger->error('Error en pre-validación de familiares', 'Archivo rechazado: ' . implode(', ', $pre_validation['errors']));
        header('Location: ../views/importacion.php?tab=familiares');
        exit;
    }

    // Mostrar advertencias si las hay
    if (!empty($pre_validation['warnings'])) {
        foreach ($pre_validation['warnings'] as $warning) {
            $result_manager->addWarning($warning);
        }
    }

    if (($handle = fopen($filename, "r")) !== FALSE) {
        $header = array_map('trim', fgetcsv($handle, 1000, ","));
        $result_manager->setTotalRows($pre_validation['stats']['total_rows']);

        $pdo->beginTransaction();
        try {
            $row_number = 1; // Para tracking de errores
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $row_number++;

                if (empty(array_filter($data))) {
                    $result_manager->incrementSkipped();
                    continue;
                }

                if (count($header) !== count($data)) {
                    $result_manager->addError(
                        "La fila tiene un número incorrecto de columnas. Se esperaban " . count($header) . " y se encontraron " . count($data) . ".",
                        $row_number
                    );
                    continue;
                }

                $familiar_data = array_combine($expected_header, $data);
                $run = $familiar_data['run'] ?? '';

                // Validaciones mejoradas
                if (!validarRUN($run)) {
                    $result_manager->addError("RUN inválido: " . htmlspecialchars($run), $row_number);
                    continue;
                }

                // Validar email si está presente
                if (!empty($familiar_data['email']) && !ImportValidator::validateEmail($familiar_data['email'])) {
                    $result_manager->addWarning("Email inválido para RUN " . htmlspecialchars($run) . ". Se omitirá el email.", $row_number);
                    unset($familiar_data['email']); // Remover email inválido pero continuar
                }

                // Validar teléfonos si están presentes
                if (!empty($familiar_data['telefono']) && !ImportValidator::validatePhone($familiar_data['telefono'])) {
                    $result_manager->addWarning("Teléfono principal inválido para RUN " . htmlspecialchars($run) . ". Se omitirá el teléfono.", $row_number);
                    unset($familiar_data['telefono']);
                }

                if (!empty($familiar_data['telefono2']) && !ImportValidator::validatePhone($familiar_data['telefono2'])) {
                    $result_manager->addWarning("Teléfono secundario inválido para RUN " . htmlspecialchars($run) . ". Se omitirá el teléfono.", $row_number);
                    unset($familiar_data['telefono2']);
                }

                // Validar parentesco si está presente
                if (!empty($familiar_data['parentesco']) && !ImportValidator::validateParentesco($familiar_data['parentesco'])) {
                    $result_manager->addWarning("Parentesco inválido para RUN " . htmlspecialchars($run) . ": " . htmlspecialchars($familiar_data['parentesco']), $row_number);
                    unset($familiar_data['parentesco']);
                }

                // Validación de seguridad para todos los campos de texto
                foreach ($familiar_data as $field => $value) {
                    if (!ImportValidator::validateSafeString($value)) {
                        $result_manager->addError("Contenido sospechoso detectado en campo '$field' para RUN " . htmlspecialchars($run), $row_number);
                        continue 2; // Saltar a la siguiente fila
                    }
                }

                $run_cleaned_for_format = preg_replace('/[^0-9kK]/', '', strtoupper($run));
                if (strlen($run_cleaned_for_format) > 1) {
                    $run_formatted = substr($run_cleaned_for_format, 0, -1) . '-' . substr($run_cleaned_for_format, -1);
                } else {
                    $run_formatted = $run_cleaned_for_format;
                }

                $data_to_save = array_filter($familiar_data, fn($value) => $value !== null && $value !== '');
                unset($data_to_save['run']);

                $result = upsert($pdo, 'familiares', $data_to_save, 'run', $run_formatted);

                if ($result === 'INSERT') {
                    $result_manager->incrementCreated();
                } elseif ($result === 'UPDATE') {
                    $result_manager->incrementUpdated();
                } else {
                    $result_manager->incrementSkipped(); // No hubo cambios
                }
            }

            $pdo->commit();
            $stats = $result_manager->getStats();
            $logger->info('Importación de familiares completada', "Procesados: {$stats['processed']}, Errores: {$stats['errors']}, Advertencias: {$stats['warnings']}");
        } catch (Throwable $e) {
            $pdo->rollBack();
            $result_manager->addError("Error crítico durante la importación: " . $e->getMessage());
            $logger->error('Error crítico en importación de familiares', $e->getMessage());
        }

        fclose($handle);

        // Generar reporte de resultados
        $report_html = $result_manager->generateReport();
        $stats = $result_manager->getStats();

        if ($stats['errors'] > 0) {
            $_SESSION['import_status'] = 'error';
        } elseif ($stats['warnings'] > 0) {
            $_SESSION['import_status'] = 'warning';
        } else {
            $_SESSION['import_status'] = 'success';
        }

        $_SESSION['import_message'] = $report_html;
    }
}

header('Location: ../views/importacion.php?tab=familiares');
exit;
