// src/lib/keywords/consensus.ts — median of SEO metrics across the sources that
// actually carry them (semrush/mangools/ahrefs + manual; gsc has no vol/kd/cpc).
import type { KeywordSource, SourceMetrics } from "./types";

// Sources comptant dans le consensus : les 3 providers SEO + la saisie manuelle
// (acte délibéré de l'utilisateur — ELEVA-54). gsc n'a pas de vol/kd/cpc.
const CONSENSUS_SOURCES: KeywordSource[] = [
  "semrush",
  "mangools",
  "ahrefs",
  "manual",
];

function median(values: number[]): number | null {
  if (values.length === 0) return null;
  const s = [...values].sort((a, b) => a - b);
  const mid = Math.floor(s.length / 2);
  return s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
}

export type ConsensusMetrics = {
  volume: number | null;
  kd: number | null;
  cpc: number | null;
};

/** Median of each metric across the consensus sources present on the keyword.
 *  0 sources → null; 1 → that value; ≥2 → median (mean of the two centre values
 *  when even). Each field is computed independently. */
export function consensusMetrics(
  metrics: Partial<Record<KeywordSource, SourceMetrics>>,
): ConsensusMetrics {
  const pick = (field: "volume" | "kd" | "cpc") =>
    median(
      CONSENSUS_SOURCES.map((s) => metrics[s]?.[field]).filter(
        (v): v is number => v != null,
      ),
    );
  return { volume: pick("volume"), kd: pick("kd"), cpc: pick("cpc") };
}
