53 lines
1.5 KiB
TypeScript
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
|
|
};
|
|
}
|