<?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;

$expected_header = ['run', 'nombre', 'ap_paterno', 'ap_materno', 'fecha_nac'];
$csv_header_string = implode(',', $expected_header);

$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 alumnos 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>';
        $error_html .= '<p>Puedes <a href="data:text/csv;charset=utf-8,' . urlencode($csv_header_string) . '" download="plantilla_alumnos.csv" class="fw-bold">descargar la plantilla correcta aquí</a>.</p>';

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

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

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

                if (!ImportValidator::validateBirthDate($fecha_nac)) {
                    $result_manager->addError(
                        "Fecha de nacimiento inválida para RUN " . htmlspecialchars($run) . " (formato esperado YYYY-MM-DD y edad entre 3-25 años).",
                        $row_number
                    );
                    continue;
                }

                // Validaciones adicionales para campos opcionales
                if (!empty($alumno_data['email']) && !ImportValidator::validateEmail($alumno_data['email'])) {
                    $result_manager->addWarning("Email inválido para RUN " . htmlspecialchars($run), $row_number);
                    unset($alumno_data['email']); // Remover email inválido
                }

                // Validación de seguridad para todos los campos de texto
                foreach ($alumno_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));
                $run_formatted = strlen($run_cleaned_for_format) > 1 ? substr($run_cleaned_for_format, 0, -1) . '-' . substr($run_cleaned_for_format, -1) : $run_cleaned_for_format;

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

                upsert($pdo, 'alumnos', $data_to_save, 'run', $run_formatted);
                $result_manager->incrementProcessed();
            }

            $pdo->commit();
            $stats = $result_manager->getStats();
            $logger->info('Importación de alumnos 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 alumnos', $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=alumnos');
exit;
