public with sharing class PdfApiController { @AuraEnabled public static Map generatePreview(String template, String propertyName, String propertyType, String location, String price, String bedrooms, String bathrooms, String area, String description) { try { // Prepare data for Python API with all required fields Map previewData = new Map{ 'template' => template, 'propertyName' => propertyName, 'propertyType' => propertyType, 'location' => location, 'price' => price, 'bedrooms' => bedrooms, 'bathrooms' => bathrooms, 'area' => area, 'description' => description }; String jsonBody = JSON.serialize(previewData); // Call Python API for preview Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://salesforce.tech4biz.io/api/preview'); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json'); request.setBody(jsonBody); request.setTimeout(120000); // 2 minutes timeout HttpResponse response = http.send(request); if (response.getStatusCode() == 200) { Map result = (Map) JSON.deserializeUntyped(response.getBody()); if (result.containsKey('success') && (Boolean) result.get('success')) { // Extract the preview data from the nested structure Map preview = (Map) result.get('preview'); return new Map{ 'success' => true, 'preview_html' => preview.get('preview_html'), 'template_info' => preview.get('template_info'), 'property_data' => preview.get('property_data'), 'message' => 'Preview generated successfully' }; } else { String errorMessage = result.get('message') != null ? (String) result.get('message') : 'Preview generation failed'; return new Map{ 'success' => false, 'error' => errorMessage }; } } else { return new Map{ 'success' => false, 'error' => 'HTTP ' + response.getStatusCode() + ': ' + response.getBody() }; } } catch (Exception e) { return new Map{ 'success' => false, 'error' => 'Exception: ' + e.getMessage() }; } } @AuraEnabled public static Map generatePdf(String templateName, String propertyName, String propertyType, String location, String price, String bedrooms, String bathrooms, String area, String description) { try { Map propertyData = new Map{ 'template' => templateName, 'propertyName' => propertyName, 'propertyType' => propertyType, 'location' => location, 'price' => price, 'bedrooms' => bedrooms, 'bathrooms' => bathrooms, 'area' => area, 'description' => description }; Map requestData = new Map{ 'template_name' => templateName, 'property_data' => propertyData }; String jsonBody = JSON.serialize(requestData); Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://salesforce.tech4biz.io/api/generate-pdf'); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json'); request.setBody(jsonBody); request.setTimeout(120000); HttpResponse response = http.send(request); if (response.getStatusCode() == 200) { Map result = (Map) JSON.deserializeUntyped(response.getBody()); if (result.containsKey('success') && (Boolean) result.get('success')) { // Try to fetch the actual PDF content if (result.containsKey('pdf_url')) { String pdfUrl = (String) result.get('pdf_url'); System.debug('PDF URL received: ' + pdfUrl); System.debug('Full API response: ' + JSON.serialize(result)); // Make a GET request to fetch the actual PDF content HttpRequest pdfRequest = new HttpRequest(); pdfRequest.setEndpoint('https://salesforce.tech4biz.io' + pdfUrl); pdfRequest.setMethod('GET'); pdfRequest.setTimeout(120000); HttpResponse pdfResponse = http.send(pdfRequest); System.debug('PDF fetch response status: ' + pdfResponse.getStatusCode()); System.debug('PDF fetch response headers: ' + pdfResponse.getHeaderKeys()); System.debug('PDF fetch response body length: ' + pdfResponse.getBody().length()); if (pdfResponse.getStatusCode() == 200) { // Successfully got PDF content Blob pdfBlob = pdfResponse.getBodyAsBlob(); String base64Pdf = EncodingUtil.base64Encode(pdfBlob); System.debug('PDF blob size: ' + pdfBlob.size()); System.debug('Base64 PDF length: ' + base64Pdf.length()); // Extract filename from URL or create one String filename = 'property_report_' + propertyName + '_' + templateName + '.pdf'; if (pdfUrl.contains('/')) { String[] urlParts = pdfUrl.split('/'); if (urlParts.size() > 0) { String lastPart = urlParts[urlParts.size() - 1]; if (lastPart.endsWith('.pdf')) { filename = lastPart; } } } System.debug('Final filename: ' + filename); return new Map{ 'success' => true, 'message' => 'PDF generated successfully', 'pdf_data' => base64Pdf, 'filename' => filename, 'content_type' => 'application/pdf' }; } else { System.debug('Failed to fetch PDF content: HTTP ' + pdfResponse.getStatusCode()); System.debug('PDF fetch error response: ' + pdfResponse.getBody()); // If PDF fetch fails, try to get preview content as fallback return getPreviewContentAsFallback(templateName, propertyName, propertyType, location, price, bedrooms, bathrooms, area, description); } } else { System.debug('No pdf_url in response, falling back to preview'); System.debug('Available keys in result: ' + result.keySet()); return getPreviewContentAsFallback(templateName, propertyName, propertyType, location, price, bedrooms, bathrooms, area, description); } } else { String errorMessage = result.get('message') != null ? (String) result.get('message') : 'PDF generation failed'; return new Map{ 'success' => false, 'error' => errorMessage }; } } else { return new Map{ 'success' => false, 'error' => 'HTTP ' + response.getStatusCode() + ': ' + response.getBody() }; } } catch (Exception e) { return new Map{ 'success' => false, 'error' => 'Exception: ' + e.getMessage() }; } } @AuraEnabled public static Map generatePdfDirect(String templateName, String propertyData, String htmlContent) { Map result = new Map(); try { System.debug('=== PDF GENERATION STARTED ==='); System.debug('Template Name: ' + templateName); System.debug('Property Data: ' + propertyData); System.debug('HTML Content Length: ' + (htmlContent != null ? htmlContent.length() : 0)); // Parse property data Map propertyMap = (Map) JSON.deserializeUntyped(propertyData); // Create a simple PDF using Visualforce and render as PDF String pageName = createPdfPage(templateName, propertyMap, htmlContent); if (pageName != null) { // Generate PDF URL String pdfUrl = '/apex/' + pageName + '?id=' + EncodingUtil.urlEncode(htmlContent, 'UTF-8'); result.put('success', true); result.put('pdfUrl', pdfUrl); result.put('message', 'PDF generated successfully'); System.debug('PDF generated successfully: ' + pdfUrl); } else { result.put('success', false); result.put('error', 'Failed to create PDF page'); System.debug('Failed to create PDF page'); } } catch (Exception e) { System.debug('Error in generatePdfDirect: ' + e.getMessage()); System.debug('Stack trace: ' + e.getStackTraceString()); result.put('success', false); result.put('error', 'PDF generation failed: ' + e.getMessage()); } return result; } private static String createPdfPage(String templateName, Map propertyData, String htmlContent) { try { // Create a unique page name String pageName = 'PropertyPdf_' + DateTime.now().getTime() + '_' + Math.random(); // Create Visualforce page content String pageContent = createVisualforcePageContent(templateName, propertyData, htmlContent); // For now, return a simple approach - we'll use a different method return null; } catch (Exception e) { System.debug('Error creating PDF page: ' + e.getMessage()); return null; } } private static String createVisualforcePageContent(String templateName, Map propertyData, String htmlContent) { // This would create a Visualforce page, but for now we'll use a simpler approach return ''; } // Helper method to get preview content as fallback private static Map getPreviewContentAsFallback(String templateName, String propertyName, String propertyType, String location, String price, String bedrooms, String bathrooms, String area, String description) { try { Map previewData = new Map{ 'template' => templateName, 'propertyName' => propertyName, 'propertyType' => propertyType, 'location' => location, 'price' => price, 'bedrooms' => bedrooms, 'bathrooms' => bathrooms, 'area' => area, 'description' => description }; String previewJsonBody = JSON.serialize(previewData); Http http = new Http(); HttpRequest previewRequest = new HttpRequest(); previewRequest.setEndpoint('https://salesforce.tech4biz.io/api/preview-simple'); previewRequest.setMethod('POST'); previewRequest.setHeader('Content-Type', 'application/json'); previewRequest.setBody(previewJsonBody); previewRequest.setTimeout(120000); HttpResponse previewResponse = http.send(previewRequest); if (previewResponse.getStatusCode() == 200) { Map previewResult = (Map) JSON.deserializeUntyped(previewResponse.getBody()); Map preview = (Map) previewResult.get('preview'); return new Map{ 'success' => true, 'message' => 'PDF generation failed, but preview content is available. Use this to create your PDF manually.', 'preview_html' => preview.get('preview_html'), 'template_info' => preview.get('template_info'), 'property_data' => preview.get('property_data'), 'note' => 'The PDF download endpoint is currently unavailable. Use the preview content to create your PDF manually or contact support.', 'fallback' => true }; } else { return new Map{ 'success' => false, 'error' => 'Failed to get preview content: HTTP ' + previewResponse.getStatusCode() }; } } catch (Exception e) { return new Map{ 'success' => false, 'error' => 'Exception getting preview content: ' + e.getMessage() }; } } @AuraEnabled public static Map generatePdfServerSide(String templateName, String propertyData, String htmlContent) { Map result = new Map(); try { System.debug('=== SERVER-SIDE PDF GENERATION STARTED ==='); System.debug('Template Name: ' + templateName); System.debug('Property Data: ' + propertyData); System.debug('HTML Content Length: ' + (htmlContent != null ? htmlContent.length() : 0)); // Parse property data Map propertyMap = (Map) JSON.deserializeUntyped(propertyData); // Create a unique identifier for this PDF generation String pdfId = 'PDF_' + DateTime.now().getTime() + '_' + Math.random(); // Store the data temporarily (you might want to use a custom object for this) // For now, we'll create a simple approach // Create PDF using Visualforce approach String pdfUrl = createPdfFromVisualforce(templateName, propertyMap, htmlContent, pdfId); if (pdfUrl != null) { result.put('success', true); result.put('pdfUrl', pdfUrl); result.put('message', 'PDF generated successfully on server side'); result.put('pdfId', pdfId); System.debug('Server-side PDF generated successfully: ' + pdfUrl); } else { result.put('success', false); result.put('error', 'Failed to create PDF from Visualforce'); System.debug('Failed to create PDF from Visualforce'); } } catch (Exception e) { System.debug('Error in generatePdfServerSide: ' + e.getMessage()); System.debug('Stack trace: ' + e.getStackTraceString()); result.put('success', false); result.put('error', 'Server-side PDF generation failed: ' + e.getMessage()); } return result; } private static String createPdfFromVisualforce(String templateName, Map propertyData, String htmlContent, String pdfId) { try { // Create a Visualforce page name String pageName = 'PropertyPdf_' + pdfId.replaceAll('[^a-zA-Z0-9]', ''); // For now, return a simple approach - we'll implement the full Visualforce solution // This is a placeholder that will be replaced with actual Visualforce generation // Return a success response indicating server-side generation return '/apex/PropertyPdfGenerator?template=' + EncodingUtil.urlEncode(templateName, 'UTF-8') + '&propertyData=' + EncodingUtil.urlEncode(JSON.serialize(propertyData), 'UTF-8') + '&htmlContent=' + EncodingUtil.urlEncode(htmlContent, 'UTF-8') + '&pdfId=' + pdfId; } catch (Exception e) { System.debug('Error creating PDF from Visualforce: ' + e.getMessage()); return null; } } }