/**
 * Period-comparison diffing for the Sales report KPI strip.
 *
 * DB-free + pure so it unit-tests without a database. The route computes
 * the current-window KPIs and the prior-window KPIs (via
 * `getSalesKpis(portId, previousPeriodBounds(range))`) and hands both
 * here to produce the per-tile deltas the KpiCard renders as
 * "vs prior period" arrows.
 *
 * Only the window-derived KPIs get a delta — the point-in-time tiles
 * (Active interests, Pipeline value) have no prior-window analogue, so
 * they are intentionally absent here.
 */

// Type-only import: erased at compile time, so this module does NOT pull
// in the DB driver that `sales.service.ts` imports at runtime.
import type { SalesKpis } from '@/lib/services/reports/sales.service';

export interface SalesKpiDeltas {
  /** current - prior */
  wonInWindow: number;
  /** current - prior */
  lostInWindow: number;
  /** current - prior */
  newLeadsInWindow: number;
  /** current - prior as a fraction [-1, 1]; null when either period has
   *  no rate (denominator was 0). */
  winRate: number | null;
  /** current - prior in days; null when either period has no median
   *  (sample too small). */
  medianTimeToCloseDays: number | null;
}

function diffNullable(current: number | null, prior: number | null): number | null {
  if (current === null || prior === null) return null;
  return current - prior;
}

export function computeSalesKpiComparison(current: SalesKpis, prior: SalesKpis): SalesKpiDeltas {
  return {
    wonInWindow: current.wonInWindow - prior.wonInWindow,
    lostInWindow: current.lostInWindow - prior.lostInWindow,
    newLeadsInWindow: current.newLeadsInWindow - prior.newLeadsInWindow,
    winRate: diffNullable(current.winRate, prior.winRate),
    medianTimeToCloseDays: diffNullable(current.medianTimeToCloseDays, prior.medianTimeToCloseDays),
  };
}
