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
  };
}
