export interface FeatureFactor { label: string; delta: number }

export const RISK_MULTIPLIERS: Record<string, number> = {
  low: 0.9,
  medium: 1.0,
  high: 1.2,
  critical: 1.4,
};

export const RISK_LABELS: Record<string, string> = {
  low: 'Low (−10%)',
  medium: 'Medium (baseline)',
  high: 'High (+20%)',
  critical: 'Critical (+40%)',
};

/**
 * Compute per-feature token adjustment factors from project config.
 * Each factor's delta is the *additional* fraction on top of the base estimate.
 * Sum all deltas + 1.0 to get the full feature multiplier.
 */
export function computeFeatureFactors(cfg: Record<string, unknown>): FeatureFactor[] {
  const factors: FeatureFactor[] = [];

  factors.push({ label: 'Pipeline overhead (scaffold, sandbox & validation)', delta: 0.30 });

  const generateTests = cfg.generateTests === true;
  const addTests = cfg.addTests !== false;
  if (generateTests) factors.push({ label: 'Unit & integration test generation', delta: 0.35 });
  else if (addTests) factors.push({ label: 'Test scaffolding', delta: 0.18 });

  if (cfg.addDocs !== false) factors.push({ label: 'Documentation generation', delta: 0.08 });
  if (cfg.addLinter !== false) factors.push({ label: 'Linting configuration', delta: 0.03 });
  if (cfg.useRepair !== false) factors.push({ label: 'AI auto-repair loop (multi-pass)', delta: 0.30 });

  const maxIter = typeof cfg.maxIterations === 'number' ? cfg.maxIterations : 3;
  if (maxIter > 3) {
    const extra = maxIter - 3;
    factors.push({ label: `Extra iterations (${maxIter} total)`, delta: extra * 0.10 });
  }

  const ql = typeof cfg.qualityLevel === 'number' ? cfg.qualityLevel : 0;
  if (ql === 2) factors.push({ label: 'Idiomatic quality gate (Q2)', delta: 0.18 });
  if (ql === 3) factors.push({ label: 'Production quality gate (Q3)', delta: 0.38 });

  return factors;
}

/** Collapse factor list to a single multiplier (1.0 + sum of deltas). */
export function featureMultiplierFromFactors(factors: FeatureFactor[]): number {
  return factors.reduce((acc, f) => acc + f.delta, 1.0);
}
