const User = require('../models/User'); const getRecommendations = async (req, res) => { try { const { budget, lat, lng, specialty } = req.query; // 1. Fetch photographers with matching specialty let query = { role: 'photographer' }; if (specialty) { query.specialty = { $regex: specialty, $options: 'i' }; } const photographers = await User.find(query).select('-password'); // 2. Scoring Algorithm const scoredPhotographers = photographers.map(pg => { let score = 0; // Rating Score (0-40 points) score += (pg.rating || 0) * 8; // rating 5.0 -> 40 points // Budget Score (0-30 points) if (budget) { const userBudget = parseFloat(budget); if (pg.price <= userBudget) { score += 30; // Within budget } else if (pg.price <= userBudget * 1.5) { score += 15; // Slightly over budget } } else { score += 20; // Default budget score } // Proximity Score (0-30 points) - Placeholder for now // In a real app, use geodist or similar if (lat && lng && pg.location && pg.location.coordinates) { const dist = Math.sqrt( Math.pow(pg.location.coordinates[1] - parseFloat(lat), 2) + Math.pow(pg.location.coordinates[0] - parseFloat(lng), 2) ); if (dist < 0.1) score += 30; // Very close else if (dist < 1) score += 15; // Moderately close } else { score += 15; // Default proximity score } return { ...pg.toObject(), recommendationScore: score }; }); // 3. Sort by score and return top results const sorted = scoredPhotographers.sort((a, b) => b.recommendationScore - a.recommendationScore); res.json(sorted.slice(0, 5)); } catch (error) { res.status(500).json({ message: error.message }); } }; module.exports = { getRecommendations };