<?php
session_start();
require_once '../includes/db.php';
require_once '../includes/factura_helper.php';
require_once '../includes/factura_db_helper.php'; // Añadir este require

// Agregar al inicio del archivo, después de los requires
if (!file_exists('../logs')) {
    mkdir('../logs', 0777, true);
}

if (!isset($_SESSION['usuario_id']) || $_SESSION['rol'] !== 'admin') {
    header('Location: login.php');
    exit;
}

$db = new Database();
$pdo = $db->getPDO();

if (isset($_POST['cliente_id']) && isset($_POST['venta_id'])) {
    try {
       
        // Verificar IDs válidos
        if (!is_numeric($_POST['venta_id']) || !is_numeric($_POST['cliente_id'])) {
            throw new Exception("IDs inválidos - Venta: {$_POST['venta_id']}, Cliente: {$_POST['cliente_id']}");
        }

        // Buscar las últimas ventas para debugging
        $stmtDebug = $pdo->query("SELECT venta_id FROM venta_items ORDER BY id DESC LIMIT 5");
        $ultimasVentas = $stmtDebug->fetchAll(PDO::FETCH_COLUMN);

        // Verificar que la venta existe
        $stmtVerificar = $pdo->prepare("SELECT COUNT(*) FROM venta_items WHERE venta_id = ?");
        $stmtVerificar->execute([$_POST['venta_id']]);
        $count = $stmtVerificar->fetchColumn();
        
        if (!$count) {
            throw new Exception("No se encontraron items para la venta {$_POST['venta_id']}. Por favor verifique el número de venta.");
        }

        // Obtener la configuración de facturación
        $stmtConfig = $pdo->prepare("SELECT * FROM configuracion_facturacion LIMIT 1");
        $stmtConfig->execute();
        $config = $stmtConfig->fetch(PDO::FETCH_ASSOC);

        // Generar el JSON
        $jsonData = generarJsonFactura($pdo, $_POST['cliente_id'], $_POST['venta_id'], $_SESSION['usuario_id']);
        
        // Obtener la razón social del cliente
        $stmtCliente = $pdo->prepare("SELECT razon_social FROM clientes WHERE id_cliente = ?");
        $stmtCliente->execute([$_POST['cliente_id']]);
        $cliente = $stmtCliente->fetch(PDO::FETCH_ASSOC);

        // Preparar URL asegurándose de usar HTTPS
        $url = rtrim($config['dominio'], '/');
        if (!preg_match('/^https:\/\//i', $url)) {
            $url = 'https://' . preg_replace('/^http:\/\//i', '', $url);
        }
        $url .= '/factuweb/';

        // Preparar datos para enviar
        $postData = [
            'data' => json_encode([$jsonData]),
            'cliente' => $cliente['razon_social'],
            'apiKey' => $config['api_key'],
            'tenantId' => $config['tenantid'],
            'email' => $config['email_empresa']
        ];

        // Inicializar cURL con opciones mejoradas
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS => http_build_query($postData),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true, // Seguir redirecciones
            CURLOPT_SSL_VERIFYPEER => true, // Verificar certificado SSL
            CURLOPT_SSL_VERIFYHOST => 2,    // Verificar el hostname
            CURLOPT_MAXREDIRS => 5,         // Máximo número de redirecciones
            CURLOPT_TIMEOUT => 30,          // Timeout en segundos
            CURLOPT_HEADER => true,         // Capturar headers
            CURLOPT_VERBOSE => true         // Modo verbose para debugging
        ]);

        // Crear un archivo para el log de cURL
        $verbose = fopen('php://temp', 'w+');
        curl_setopt($ch, CURLOPT_STDERR, $verbose);

        // Ejecutar la petición
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if ($response === false) {
            throw new Exception("Error de cURL: " . curl_error($ch));
        }

        // Separar headers y body
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);


        // Verificar respuesta
        if ($httpCode === 200) {
            $lineas = explode("\n", trim($body));
            $datosRespuesta = [];
            
            // Si es factura pre-impresa, el formato es diferente
            if (strpos($body, "Núm Int:") !== false) {
                error_log("Detectada factura pre-impresa");
                
                // Obtener el número actual
                $stmtConfig = $pdo->prepare("SELECT factura_numero FROM configuracion_facturacion LIMIT 1");
                $stmtConfig->execute();
                $configActual = $stmtConfig->fetch(PDO::FETCH_ASSOC);
                $numeroActual = $configActual['factura_numero'];
                               
                // Generar el número interno
                $timestamp = date("dmyHis"); // Formato: DDMMYYHHMMSS
                $numeroFormateado = str_pad($numeroActual, 4, '0', STR_PAD_LEFT); // Cambiado a 4 dígitos
                $nuevoNumeroInterno = $timestamp . "-" . $numeroFormateado;

                // Reemplazar el número interno en la respuesta
                $lineas = explode("\n", $body);
                $bodyModificado = "";
                foreach ($lineas as $linea) {
                    if (strpos($linea, "Núm Int:") !== false) {
                        // Expresión regular más específica para capturar cualquier formato de número
                        $linea = preg_replace('/Núm Int:\s*[0-9-]+/', "Núm Int: " . $nuevoNumeroInterno, $linea);
                    }
                    $bodyModificado .= $linea . "\n";
                }
                $body = $bodyModificado;
                
                $datosRespuesta['tipo'] = 'preimpresa';
                $datosRespuesta['numero'] = $numeroActual;
                $datosRespuesta['numero_interno'] = $nuevoNumeroInterno;
            } else {
                // Es una factura electrónica
                foreach ($lineas as $linea) {
                    if (strpos($linea, ':') !== false) {
                        list($clave, $valor) = array_map('trim', explode(':', $linea, 2));
                        $datosRespuesta[$clave] = $valor;
                    }
                }
            }

            // Guardar la respuesta en sesión
            $_SESSION['respuesta_servidor'] = [
                'fecha' => date('Y-m-d H:i:s'),
                'datos' => $datosRespuesta,
                'respuesta_completa' => $body
            ];

            if ((isset($datosRespuesta['CDC']) && $datosRespuesta['CDC'] !== 'No disponible') || 
                (isset($datosRespuesta['tipo']) && $datosRespuesta['tipo'] === 'preimpresa')) {
                
                // Si es factura electrónica, actualizar el número aquí
                if (!isset($datosRespuesta['tipo'])) {
                    // Actualizar el número de factura para factura electrónica
                    $stmtActualizar = $pdo->prepare("UPDATE configuracion_facturacion SET factura_numero = factura_numero + 1");
                    $stmtActualizar->execute();

                    // Obtener configuración actualizada
                    $stmtConfig = $pdo->prepare("SELECT dominio, tenantid, factura_numero FROM configuracion_facturacion LIMIT 1");
                    $stmtConfig->execute();
                    $config = $stmtConfig->fetch(PDO::FETCH_ASSOC);
                }

                // Construir URL del PDF
                $urlPDF = rtrim($config['dominio'], '/') . '/factuweb/' . 
                          $config['tenantid'] . '/factura_' . 
                          $datosRespuesta['CDC'] . '.pdf';

                // Guardar URL del PDF en sesión
                $_SESSION['pdf_url'] = $urlPDF;
                
                // Obtener el tipo de condición (contado o crédito)
                $condicionTipo = isset($_POST['condicion_tipo']) ? (int)$_POST['condicion_tipo'] : 1;
                
                // Guardar la información en la tabla facturados
                $resultadoGuardado = guardarFacturaEnBD(
                    $pdo, 
                    $_POST['cliente_id'], 
                    $_POST['venta_id'], 
                    $datosRespuesta,
                    $condicionTipo,
                    $jsonData['numero'] // Número de factura
                );
                
                if ($resultadoGuardado) {
                    $_SESSION['mensaje_exito'] = "Factura generada exitosamente y registrada en el sistema";
                } else {
                    // La factura se generó pero no se pudo guardar en la BD
                    $_SESSION['mensaje_exito'] = "Factura generada exitosamente, pero no se pudo registrar en el sistema";
                }

                // Abrir PDF en nueva ventana y redirigir a facturar.php
                echo "<script>
                      window.open('$urlPDF', '_blank');
                      window.location.href = 'facturar.php';
                      </script>";
                exit;
            } else {
                $_SESSION['mensaje_error'] = "No se pudo generar el PDF de la factura";
                header('Location: facturar.php');
                exit;
            }
        } else {
            $_SESSION['mensaje_error'] = "Error al enviar la factura. Código: $httpCode";
            header('Location: facturar.php');
            exit;
        }

        curl_close($ch);
        fclose($verbose);

        // Guardar también en archivo local (opcional)
        file_put_contents('../factura.txt', json_encode([$jsonData], JSON_PRETTY_PRINT));
        
        // Redirigir a facturar.php
        header('Location: facturar.php');
        exit;

    } catch (Exception $e) {
        $_SESSION['mensaje_error'] = "Error: " . $e->getMessage();
        header('Location: facturar.php');
        exit;
    }
} else {
    $_SESSION['mensaje_error'] = "Error: Faltan datos necesarios para generar la factura";
    header('Location: facturar.php');
    exit;
}

// Nueva sección para manejar la respuesta del servidor
if (isset($_SESSION['respuesta_servidor'])) {
    $respuesta = $_SESSION['respuesta_servidor'];
    // Aquí puedes agregar código para mostrar la respuesta en la interfaz, si es necesario
    // Por ejemplo, mostrar un modal con los detalles de la respuesta
}

// Después de ejecutar el cURL
if ($httpCode === 200) {
    // Guardar la respuesta completa en la sesión
    $_SESSION['respuesta_factura'] = $body;
    
}

header('Location: facturar.php');
exit;