false, 'error' => 'Método no permitido']); exit; } try { $input = json_decode(file_get_contents('php://input'), true); $userId = intval($input['user_id'] ?? 0); $phoneNumber = trim($input['phone_number'] ?? ''); if (!$userId || empty($phoneNumber)) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Se requiere user_id y phone_number']); exit; } $db = Database::getInstance(); // Verificar que el usuario existe $user = $db->fetch("SELECT id, phone_number, name FROM users WHERE id = ?", [$userId]); if (!$user) { http_response_code(404); echo json_encode(['success' => false, 'error' => 'Usuario no encontrado']); exit; } // Usar el teléfono de la BD si no se proporcionó $phone = !empty($phoneNumber) ? $phoneNumber : $user['phone_number']; // Verificar si hay una solicitud pendiente activa (no expirada) $existing = $db->fetch( "SELECT id, token, expires_at FROM file_requests WHERE user_id = ? AND status = 'pending' AND expires_at > NOW() ORDER BY created_at DESC LIMIT 1", [$userId] ); if ($existing) { // Reutilizar solicitud existente — reenviar enlace $token = $existing['token']; $requestId = $existing['id']; } else { // Generar nuevo token único (48 caracteres alfanuméricos) $token = bin2hex(random_bytes(24)); // Operador que solicita $requestedBy = $_SESSION['user_id'] ?? null; // Crear solicitud — expira en 24 horas $expiresAt = date('Y-m-d H:i:s', strtotime('+24 hours')); $requestId = $db->insert('file_requests', [ 'token' => $token, 'user_id' => $userId, 'phone_number' => $phone, 'requested_by' => $requestedBy, 'status' => 'pending', 'max_file_size' => 52428800, // 50MB 'allowed_types' => 'image,document', 'expires_at' => $expiresAt, ]); } // Construir URL de carga $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $appUrl = $protocol . '://' . $_SERVER['HTTP_HOST']; $uploadUrl = $appUrl . '/upload.php?token=' . $token; // Enviar mensaje por WhatsApp con el enlace $whatsapp = new WhatsAppService(); // Mensaje amigable con el enlace $message = "📎 *Enlace para enviar archivos grandes*\n\n" . "Hola" . ($user['name'] ? ", " . $user['name'] : "") . ".\n\n" . "Le enviamos este enlace seguro para que pueda subir archivos de gran tamaño (hasta 50 MB):\n\n" . "👉 " . $uploadUrl . "\n\n" . "✅ Puede subir imágenes o documentos.\n" . "🔒 El enlace es seguro y exclusivo para usted.\n" . "⏰ Válido por 24 horas.\n\n" . "_Si tiene alguna duda, estamos aquí para ayudarle._"; $sendResult = $whatsapp->sendTextMessage($phone, $message, [ 'context_type' => 'file_request', 'file_request_id' => $requestId, ]); // Guardar ID del mensaje enviado if ($sendResult && isset($sendResult['messages'][0]['id'])) { $messageId = $sendResult['messages'][0]['id']; $db->update('file_requests', ['message_sent_id' => $messageId], 'id = ?', [$requestId] ); } // Crear notificación para el log $db->insert('notifications', [ 'user_id' => $userId, 'type' => 'file_request_sent', 'message' => 'Se envió enlace de carga de archivos a ' . ($user['name'] ?: $phone), 'data' => json_encode([ 'request_id' => $requestId, 'token' => $token, 'upload_url' => $uploadUrl, ]), 'is_read' => 0, ]); echo json_encode([ 'success' => true, 'request_id' => $requestId, 'token' => $token, 'upload_url' => $uploadUrl, 'expires_at' => $existing ? $existing['expires_at'] : $expiresAt, 'message' => 'Enlace enviado al cliente por WhatsApp', ]); } catch (Exception $e) { $errorDetail = date('[Y-m-d H:i:s] ') . 'request_large_file ERROR: ' . $e->getMessage() . "\n" . $e->getTraceAsString() . "\n\n"; error_log('Error en request_large_file: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString()); @file_put_contents(__DIR__ . '/../logs/app_errors.log', $errorDetail, FILE_APPEND); http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error interno: ' . $e->getMessage()]); }