<?php
include 'conexion.php';
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;

if ($_FILES["archivo_excel"]["error"] == 0) {
    $file_name = $_FILES["archivo_excel"]["tmp_name"];
    $spreadsheet = IOFactory::load($file_name);
    $sheet = $spreadsheet->getActiveSheet();
    $data = $sheet->toArray();

    $headers = array_map(fn($h) => is_string($h) ? strtolower($h) : '', $data[0]);

    $required_columns = ['valida_cod_pedido', 'cliente', 'dni', 'direccion', 'cto1', 'cto2', 'cto3', 'tipo de validaciones', 'paquete', 'estado', 'gestion diaria', 'distrito', 'fecha_registro', 'tecnico'];

    $missing_columns = [];
    $indices = [];

    foreach ($required_columns as $column) {
        $index = array_search($column, $headers);
        if ($index === false) {
            $missing_columns[] = $column;
        } else {
            $indices[$column] = $index;
        }
    }

    if (!empty($missing_columns)) {
        echo json_encode(["status" => "error", "message" => "Faltan las siguientes columnas en el archivo: " . implode(", ", $missing_columns)]);
        exit;
    }

    unset($data[0]);

    $fecha_registro = date('Y-m-d H:i:s');
    $conn->begin_transaction();

    try {
        $nuevos_registros = 0;
        $registros_omitidos = 0;

        // Verificar si las columnas cto1, cto2, cto3 existen en la base de datos, si no, agregarlas
        $columns_check = ["cto1", "cto2", "cto3"];
        foreach ($columns_check as $column) {
            $result = $conn->query("SHOW COLUMNS FROM trabajos LIKE '$column'");
            if ($result->num_rows == 0) {
                $conn->query("ALTER TABLE trabajos ADD $column VARCHAR(255) DEFAULT 'N/A'");
            }
        }

        $fecha_hoy = date('Y-m-d'); // Obtiene la fecha actual en formato YYYY-MM-DD

        foreach ($data as $row) {
            if (!empty($row[$indices['valida_cod_pedido']])) {
                $valida_cod_pedido = $row[$indices['valida_cod_pedido']];

// Obtener si ya existe un registro con el misma 'valida_cod_pedido' y la fecha de hoy
$stmt_check = $conn->prepare("SELECT 1 FROM trabajos WHERE valida_cod_pedido = ? AND DATE(fecha_registro) = ? LIMIT 1");
$stmt_check->bind_param("ss", $valida_cod_pedido, $fecha_hoy);
$stmt_check->execute();
$stmt_check->store_result();

if ($stmt_check->num_rows > 0) {
    // Si se encuentra un registro con la fecha de hoy, lo omitimos
    $registros_omitidos++;
    error_log("Omitido: " . $valida_cod_pedido . " debido a que ya existe con la fecha de hoy ($fecha_hoy).");
    $stmt_check->close();
    continue; // Omitir la inserción de este registro
}
$stmt_check->close();

                // Permitir solo ciertos estados
                $estado_value = strtolower($row[$indices['estado']]);
                $estados_permitidos = ["finalizado", "iniciada", "en camino"];
                if (!in_array($estado_value, $estados_permitidos)) {
                    continue;
                }

                // Tomar los valores de los campos cto1, cto2 y cto3 con valores por defecto si están vacíos
                $cto1_value = !empty($row[$indices['cto1']]) ? $row[$indices['cto1']] : 'N/A';
                $cto2_value = !empty($row[$indices['cto2']]) ? $row[$indices['cto2']] : 'N/A';
                $cto3_value = !empty($row[$indices['cto3']]) ? $row[$indices['cto3']] : 'N/A';

                $paquete_value = !empty($row[$indices['paquete']]) ? $row[$indices['paquete']] : 'N/A';
                $tipo_servicio_value = !empty($row[$indices['tipo de validaciones']]) ? $row[$indices['tipo de validaciones']] : 'Sin especificar';
                $distrito_value = !empty($row[$indices['distrito']]) ? $row[$indices['distrito']] : 'No especificado';
                $tecnico_value = !empty($row[$indices['tecnico']]) ? $row[$indices['tecnico']] : 'N/A';

                // Procesar la fecha de programación
                $programacion_value = null;
                if (!empty($row[$indices['gestion diaria']])) {
                    $fecha_raw = trim($row[$indices['gestion diaria']]);
                    $pos_anio = strpos($fecha_raw, '年');

                    if ($pos_anio !== false) {
                        preg_match('/\d{4}年\d{1,2}月\d{1,2}日/', $fecha_raw, $matches);
                        if (!empty($matches[0])) {
                            $fecha_japonesa = $matches[0];
                            $fecha_limpia = str_replace(['年', '月'], '-', $fecha_japonesa);
                            $fecha_limpia = str_replace('日', '', $fecha_limpia);
                            $fecha_obj = DateTime::createFromFormat('Y-m-d', $fecha_limpia);
                            $programacion_value = $fecha_obj ? $fecha_obj->format('Y-m-d') : $fecha_raw;
                        } else {
                            $programacion_value = $fecha_raw;
                        }
                    } else {
                        $programacion_value = $fecha_raw;
                    }
                }

 $estado_values = "Pendiente";
                // Preparar la consulta de inserción
                $sql = "INSERT INTO trabajos (valida_cod_pedido, cliente, dni, direccion, cto, cto1, cto2, cto3, tipo_servicio, paquete, estado, programacion, distrito, fecha_registro, tecnico)
                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

                $stmt = $conn->prepare($sql);
                $stmt->bind_param("sssssssssssssss",
                    $valida_cod_pedido,
                    $row[$indices['cliente']],
                    $row[$indices['dni']],
                    $row[$indices['direccion']],
                    $cto_value,
                    $cto1_value,
                    $cto2_value,
                    $cto3_value,
                    $tipo_servicio_value,
                    $paquete_value,
                    $estado_values,
                    $programacion_value,
                    $distrito_value,
                    $fecha_registro,
                    $tecnico_value
                );

                if ($stmt->execute()) {
                    $nuevos_registros++;
                } else {
                    error_log("Error al insertar el registro con valida_cod_pedido: " . $valida_cod_pedido);
                }

                $stmt->close();
            }
        }

        $conn->commit();

        echo json_encode([
            "status" => "success",
            "message" => "Se insertaron $nuevos_registros registros nuevos. Se omitieron $registros_omitidos registros duplicados."
        ]);

    } catch (Exception $e) {
        $conn->rollback();
        echo json_encode(["status" => "error", "message" => "Error al procesar los datos: " . $e->getMessage()]);
    }
} else {
    echo json_encode(["status" => "error", "message" => "Error al subir el archivo."]);
}

$conn->close();
?>
