website/hub/services/static/js/price-calculator/plan-manager.js

104 lines
3.6 KiB
JavaScript

/**
* Plan Manager - Handles plan selection and matching logic
*/
class PlanManager {
constructor(pricingDataManager) {
this.pricingDataManager = pricingDataManager;
}
// Find best matching plan based on requirements
findBestMatchingPlan(cpus, memory, serviceLevel) {
const pricingData = this.pricingDataManager.getPricingData();
if (!pricingData) return null;
let bestMatch = null;
let bestScore = Infinity;
// Iterate through all groups and service levels
Object.keys(pricingData).forEach(groupName => {
const group = pricingData[groupName];
if (group[serviceLevel]) {
group[serviceLevel].forEach(plan => {
const planCpus = parseFloat(plan.vcpus);
const planMemory = parseFloat(plan.ram);
// Check if plan meets minimum requirements
if (planCpus >= cpus && planMemory >= memory) {
// Calculate efficiency score (lower is better)
const cpuOverhead = planCpus - cpus;
const memoryOverhead = planMemory - memory;
const score = cpuOverhead + memoryOverhead + plan.final_price * 0.1;
if (score < bestScore) {
bestScore = score;
bestMatch = {
...plan,
groupName: groupName
};
}
}
});
}
});
return bestMatch;
}
// Get current plan based on configuration
getCurrentPlan(domManager) {
const config = domManager.getCurrentConfiguration();
const planSelect = domManager.get('planSelect');
if (planSelect?.value) {
return JSON.parse(planSelect.value);
}
return this.findBestMatchingPlan(config.cpus, config.memory, config.serviceLevel);
}
// Populate plan dropdown based on selected service level
populatePlanDropdown(domManager) {
const planSelect = domManager.get('planSelect');
if (!planSelect) return;
const serviceLevel = domManager.getSelectedServiceLevel();
if (!serviceLevel) return;
// Clear existing options
planSelect.innerHTML = '<option value="">Auto-select best matching plan</option>';
// Get plans for the selected service level
const availablePlans = this.pricingDataManager.getPlansForServiceLevel(serviceLevel);
// Add plans to dropdown
availablePlans.forEach(plan => {
const option = document.createElement('option');
option.value = JSON.stringify(plan);
option.textContent = `${plan.compute_plan} - ${plan.vcpus} vCPUs, ${plan.ram} GB RAM`;
planSelect.appendChild(option);
});
}
// Update sliders to match selected plan
updateSlidersForPlan(plan, domManager) {
const cpuRange = domManager.get('cpuRange');
const memoryRange = domManager.get('memoryRange');
const cpuValue = domManager.get('cpuValue');
const memoryValue = domManager.get('memoryValue');
if (cpuRange && cpuValue) {
cpuRange.value = plan.vcpus;
cpuValue.textContent = plan.vcpus;
}
if (memoryRange && memoryValue) {
memoryRange.value = plan.ram;
memoryValue.textContent = plan.ram;
}
}
}
// Export for use in other modules
window.PlanManager = PlanManager;