var bhutaniCache = null; export function loadBhutaniZones() { if (bhutaniCache) return Promise.resolve(bhutaniCache); return fetch('/data/calculators/bhutani-zones.json', { credentials: 'same-origin' }) .then(function(response) { if (!response.ok) throw new Error('Failed to load Bhutani zone data'); return response.json(); }) .then(function(data) { bhutaniCache = data.zones || {}; return bhutaniCache; }); } export function interpolateThreshold(table, hours) { var keys = Object.keys(table).map(Number).sort(function(a,b){return a-b;}); if (hours <= keys[0]) return table[keys[0]]; if (hours >= keys[keys.length-1]) return table[keys[keys.length-1]]; for (var i = 0; i < keys.length-1; i++) { if (hours >= keys[i] && hours <= keys[i+1]) { var t = (hours - keys[i]) / (keys[i+1] - keys[i]); return table[keys[i]] + t * (table[keys[i+1]] - table[keys[i]]); } } return table[keys[0]]; } export function classifyBhutaniRisk(zones, hours, tsb) { var p95 = interpolateThreshold(zones.p95, hours); var p75 = interpolateThreshold(zones.p75, hours); var p40 = interpolateThreshold(zones.p40, hours); if (tsb >= p95) return { zone: 'High-Risk Zone', color: '#ef4444', bg: '#fee2e2', p95: p95, p75: p75, p40: p40 }; if (tsb >= p75) return { zone: 'High-Intermediate Zone', color: '#f97316', bg: '#ffedd5', p95: p95, p75: p75, p40: p40 }; if (tsb >= p40) return { zone: 'Low-Intermediate Zone', color: '#f59e0b', bg: '#fef3c7', p95: p95, p75: p75, p40: p40 }; return { zone: 'Low-Risk Zone', color: '#10b981', bg: '#d1fae5', p95: p95, p75: p75, p40: p40 }; }