/**
 * MBHS 3.0 — Full 24-condition Joiner Risk Assessment Framework
 *
 * Source: "MBHS 3.0 Graphing Tool v1.0" Excel, sheet "24 possible conditions"
 *
 * Variables:
 *   Attempts    — item #29 score ≥ 1  (0 = no prior attempt, 1 = prior attempt)
 *   Fearlessness — item #25 score = 3  (0 = not elevated [0–2], 1 = elevated [3])
 *   SUI elevated — suicidal_ideation raw_score > 1
 *   ORF count   — count of elevated Other Risk Factor scales, capped at 2:
 *                   Demoralization raw_score > 3
 *                   Anhedonia raw_score > 3
 *                   Disconstraint raw_score > 3
 *                   Substance Use raw_score > 1
 *                 (Anxiety and Activation are NOT counted)
 */

export interface ItemResponse {
  item_number?: number;    // Old field name
  question_order?: number; // New field name
  score?: number;          // Old field name
  answer_value?: number;   // New field name
}

export interface ScaleResult {
  scale_name: string;
  raw_score?: number;
  percentile?: number | string;
  risk_level?: string;
}

export interface SuicideRiskInput {
  itemResponses: ItemResponse[];
  results: ScaleResult[];
  backendRisk: string;
}

// Lookup table: key = "attempts_fearlessness_sui_orf"
const RISK_TABLE: Record<string, string> = {
  "0_0_0_0": "Low",
  "0_0_0_1": "Low",
  "0_0_0_2": "Low",
  "0_0_1_0": "Low",
  "0_0_1_1": "Mild",
  "0_0_1_2": "Mild",
  "0_1_0_0": "Low",
  "0_1_0_1": "Low",
  "0_1_0_2": "Low",
  "0_1_1_0": "At Least Moderate",
  "0_1_1_1": "At Least Moderate",
  "0_1_1_2": "At Least Moderate",
  "1_0_0_0": "Mild",
  "1_0_0_1": "Mild",
  "1_0_0_2": "At Least Moderate",
  "1_0_1_0": "At Least Moderate",
  "1_0_1_1": "At Least Moderate",
  "1_0_1_2": "At Least Moderate",
  "1_1_0_0": "Mild",
  "1_1_0_1": "At Least Moderate",
  "1_1_0_2": "At Least Moderate",
  "1_1_1_0": "At Least Moderate",
  "1_1_1_1": "At Least Moderate",
  "1_1_1_2": "At Least Moderate",
};

function getScale(results: ScaleResult[], name: string): ScaleResult | undefined {
  return results.find(r => r.scale_name === name);
}

// Check elevation using raw_score if available, falling back to percentile
function isElevated(
  scale: ScaleResult | undefined,
  rawThreshold: number,
  percentileFallback: number = 66
): boolean {
  if (!scale) return false;
  if (scale.raw_score !== undefined && scale.raw_score !== null) {
    return scale.raw_score > rawThreshold;
  }
  const p = parseFloat(String(scale.percentile || "0"));
  return p >= percentileFallback;
}

export function normalizeBackendRisk(raw: string): string {
  const n = raw.toLowerCase();
  if (n.includes("at least moderate") || n.includes("atleast")) return "At Least Moderate";
  if (n.includes("high")) return "High";
  if (n.includes("moderate")) return "Moderate";
  if (n.includes("mild")) return "Mild";
  if (n.includes("low")) return "Low";
  return raw;
}

/**
 * Compute suicide risk using the full MBHS 3.0 24-condition algorithm.
 * Falls back to normalised backendRisk when Q25/Q29 item-level data is unavailable.
 */
export function computeSuicideRisk(input: SuicideRiskInput): string {
  const { itemResponses, results, backendRisk } = input;

  const q29 = itemResponses.find(i => (i.item_number ?? i.question_order) === 29);
  const q25 = itemResponses.find(i => (i.item_number ?? i.question_order) === 25);

  // Need at least one of Q25/Q29 to run the algorithm
  if (!q29 && !q25) return normalizeBackendRisk(backendRisk);

  const attempts = q29 ? ((q29.score ?? q29.answer_value ?? 0) >= 1 ? 1 : 0) : 0;
  const fearlessness = q25 ? ((q25.score ?? q25.answer_value ?? 0) === 3 ? 1 : 0) : 0;

  const siScale = getScale(results, "suicidal_ideation");
  const suiElevated = isElevated(siScale, 1) ? 1 : 0;

  let orfCount = 0;
  if (isElevated(getScale(results, "demoralization"), 3)) orfCount++;
  if (isElevated(getScale(results, "anhedonia"), 3)) orfCount++;
  if (isElevated(getScale(results, "disconstraint"), 3)) orfCount++;
  if (isElevated(getScale(results, "substance_use_problems"), 1)) orfCount++;
  const orf = Math.min(orfCount, 2);

  const key = `${attempts}_${fearlessness}_${suiElevated}_${orf}`;
  return RISK_TABLE[key] ?? normalizeBackendRisk(backendRisk);
}
