Files
davisfe.cz/scripts/utils/calculations.ts
T

53 lines
1.5 KiB
TypeScript

export interface LakeCalculationConfig {
maxVolume?: number;
minLevel?: number;
maxLevel?: number;
storageLevel?: number;
}
export interface LakeMetrics {
capacity: number; // 0-100 percentage
volume: number; // in mil. m3
storageDiff: number; // in meters
}
export function calculateLakeMetrics(
currentLevel: number,
reportedVolume: number,
config: LakeCalculationConfig
): LakeMetrics {
let capacity = 0;
let volume = reportedVolume;
let storageDiff = 0;
// 1. Calculate capacity and volume
if (volume > 0 && config.maxVolume && config.maxVolume > 0) {
// If real volume is available, calculate capacity from volume
capacity = Math.max(0, Math.min(100, Math.round((volume / config.maxVolume) * 1000) / 10));
} else if (config.minLevel && config.maxLevel && currentLevel > 0) {
// Fallback: estimate capacity and volume from level difference
const percentage = ((currentLevel - config.minLevel) / (config.maxLevel - config.minLevel)) * 100;
capacity = Math.max(0, Math.min(100, Math.round(percentage * 10) / 10)); // Round to 1 decimal place
if (volume === 0) {
volume = Number(((capacity / 100) * (config.maxVolume || 0)).toFixed(1));
}
} else {
// Missing required config data or bad level
if (volume === 0) {
volume = config.maxVolume || 0;
}
}
// 2. Calculate storage difference
if (config.storageLevel && currentLevel > 0) {
storageDiff = Number((currentLevel - config.storageLevel).toFixed(2));
}
return {
capacity,
volume,
storageDiff
};
}