public with sharing class PropertyTemplateController { @AuraEnabled(cacheable=true) public static List getPropertyTemplates() { try { return [SELECT Id, Name, Description__c, Preview_Image_URL__c, Tags__c, Is_Active__c, Template_Definition__c FROM Property_Template__c WHERE Is_Active__c = true ORDER BY Name]; } catch (Exception e) { throw new AuraHandledException('Error fetching templates: ' + e.getMessage()); } } @AuraEnabled(cacheable=true) public static Property_Template__c getPropertyTemplateById(String templateId) { try { return [SELECT Id, Name, Description__c, Preview_Image_URL__c, Tags__c, Is_Active__c, Template_Definition__c FROM Property_Template__c WHERE Id = :templateId AND Is_Active__c = true LIMIT 1]; } catch (Exception e) { throw new AuraHandledException('Error fetching template: ' + e.getMessage()); } } @AuraEnabled(cacheable=true) public static List getPropertyData() { try { return [SELECT Id, Name, pcrm__Property_Type__c, pcrm__Sub_Locality_Bayut_Dubizzle__c, pcrm__Sale_Price_max__c, pcrm__Rent_Price_max__c, pcrm__Bedrooms__c, pcrm__Bathrooms__c, pcrm__Size__c, pcrm__Description_English__c, pcrm__Title_English__c, pcrm__Unit_Number__c, pcrm__Completion_Status__c, pcrm__Furnished__c, pcrm__View__c, pcrm__Tower_Bayut_Dubizzle__c, pcrm__Community_Propertyfinder__c, pcrm__Sub_Community_Propertyfinder__c, pcrm__City_Propertyfinder__c, pcrm__City_Bayut_Dubizzle__c FROM pcrm__Property__c ORDER BY Name]; } catch (Exception e) { throw new AuraHandledException('Error fetching properties: ' + e.getMessage()); } } @AuraEnabled(cacheable=true) public static pcrm__Property__c getPropertyById(String propertyId) { try { return [SELECT Id, Name, pcrm__Property_Type__c, pcrm__Sub_Locality_Bayut_Dubizzle__c, pcrm__Sale_Price_max__c, pcrm__Rent_Price_max__c, pcrm__Bedrooms__c, pcrm__Bathrooms__c, pcrm__Size__c, pcrm__Description_English__c, pcrm__Title_English__c, pcrm__Unit_Number__c, pcrm__Completion_Status__c, pcrm__Furnished__c, pcrm__View__c, pcrm__Tower_Bayut_Dubizzle__c, pcrm__Community_Propertyfinder__c, pcrm__Sub_Community_Propertyfinder__c, pcrm__City_Propertyfinder__c, pcrm__City_Bayut_Dubizzle__c, pcrm__Private_Amenities__c, pcrm__Commercial_Amenities__c, pcrm__Coordinates__c, pcrm__Build_Year__c, pcrm__Stories__c, pcrm__Parking_Spaces__c, pcrm__Lot_Size__c, pcrm__Service_Charge__c FROM pcrm__Property__c WHERE Id = :propertyId LIMIT 1]; } catch (Exception e) { throw new AuraHandledException('Error fetching property: ' + e.getMessage()); } } @AuraEnabled(cacheable=true) public static Map getMarketData() { try { // For now, return default market data since you might not have Market_Analytics__c Map result = new Map(); // Default Dubai market data result.put('marketTrend', 'Rising'); result.put('roiPotential', '8.5'); result.put('avgPricePerSqft', '1200'); result.put('marketDemand', 'High'); result.put('investmentType', 'Buy-to-Rent'); result.put('rentalYield', '6.2'); result.put('investmentHighlights', 'Prime location with high rental demand and capital appreciation potential'); result.put('locationAdvantages', 'Excellent connectivity, premium amenities, and strong infrastructure'); result.put('contentModules', ['Market Analysis', 'Investment Overview', 'Location Highlights']); result.put('additionalContent', 'Dubai real estate market shows strong growth potential with government initiatives and Expo 2020 legacy'); return result; } catch (Exception e) { throw new AuraHandledException('Error fetching market data: ' + e.getMessage()); } } @AuraEnabled public static Map generatePropertyPDF(String propertyData, String templateName, Boolean generatePDF) { try { // Parse property data Map propertyMap = (Map) JSON.deserializeUntyped(propertyData); // Call external Python API for PDF generation String apiEndpoint = 'https://YOUR-ACTUAL-IP:8000/api/generate-pdf'; // TODO: Replace with your actual server IP // Prepare request body Map requestBody = new Map(); requestBody.put('property_data', propertyMap); requestBody.put('template_name', templateName); // Make HTTP callout to Python API Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint(apiEndpoint); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json'); request.setBody(JSON.serialize(requestBody)); HttpResponse response = http.send(request); if (response.getStatusCode() == 200) { Map responseMap = (Map) JSON.deserializeUntyped(response.getBody()); Map result = new Map(); result.put('success', true); result.put('pdfUrl', responseMap.get('pdf_url')); result.put('message', 'PDF generated successfully'); return result; } else { Map result = new Map(); result.put('success', false); result.put('message', 'Failed to generate PDF: ' + response.getStatus()); return result; } } catch (Exception e) { Map result = new Map(); result.put('success', false); result.put('message', 'Error: ' + e.getMessage()); return result; } } @AuraEnabled public static List searchPropertyTemplates(String searchTerm) { try { String searchQuery = '%' + searchTerm + '%'; return [SELECT Id, Name, Description__c, Preview_Image_URL__c, Tags__c, Is_Active__c, Template_Definition__c FROM Property_Template__c WHERE Is_Active__c = true AND (Name LIKE :searchQuery OR Description__c LIKE :searchQuery OR Tags__c LIKE :searchQuery) ORDER BY Name]; } catch (Exception e) { throw new AuraHandledException('Error searching templates: ' + e.getMessage()); } } }