/**
 * Moteur d'analyse du Bilan Prévention.
 * Portage fidèle des règles validées dans le prototype HTML d'origine
 * (Bilan de Prévention.html, fonction generateAnalysis()).
 */

export type PriorityLevel = "high" | "med" | "low";

export interface Priority {
  level: PriorityLevel;
  theme: string;
  priority: string;
  frein: string;
  conseil: string;
  ressource: string;
  suivi: string;
}

export interface BilanAnswers {
  nom?: string;
  prenom?: string;
  age?: string;
  sexe?: string;
  medecin_traitant?: "oui" | "non" | "ns" | "";
  famille?: string[];
  conditions_penibles?: "oui" | "non" | "nc" | "";
  entourage?: "oui" | "non" | "ns" | "";

  pathologies?: string[];
  antecedents_famille?: "oui" | "non" | "ns" | "";
  biologie?: "moins6" | "plus6" | "ns" | "";
  traitement?: "oui" | "non" | "";
  nb_medicaments?: string | number;
  difficulte_traitement?: "non" | "parfois" | "oui" | "";
  oubli_traitement?: "jamais" | "rarement" | "parfois" | "souvent" | "tres_souvent" | "";
  doute_prise?: "non" | "oui" | "regulier" | "";

  poids?: string | number;
  taille?: string | number;

  fruits_legumes?: "quotidien" | "parfois" | "rare" | "";
  sucre?: "rare" | "parfois" | "souvent" | "";
  activite?: "ok" | "insuffisant" | "aucune" | "";
  sedentarite?: "faible" | "moderee" | "forte" | "";
  tabac?: "non" | "ancien" | "oui" | "";
  alcool_semaine?: string | number;
  jours_sans_alcool?: string | number;
  cannabis?: "non" | "oui" | "";
  sommeil?: "bon" | "moyen" | "mauvais" | "";

  mental_interet?: string | number;
  mental_triste?: string | number;
  mental_anxiete?: string | number;
  mental_inquietude?: string | number;

  dentaire?: "moins1" | "plus1" | "douleur" | "";
  vaccins?: "oui" | "non" | "ns" | "";
  depistages?: "ok" | "non" | "ns" | "";
  audition?: "ok" | "difficulte" | "bruit" | "";
  droits?: "oui" | "non" | "ns" | "";
  violences?: "oui" | "non" | "prefere_pas" | "";

  // Bloc conditionnel 60-65 / 70-75 ans (autonomie, d'après l'autoquestionnaire officiel)
  autonomie_difficultes?: string[];

  // Bloc conditionnel 18-25 ans (santé sexuelle, d'après l'autoquestionnaire officiel)
  contraception?: "oui" | "non" | "nc" | "";
  depistage_ist?: "oui" | "non" | "ns" | "";

  commentaire?: string;
}

export interface ImcResult {
  value: number | null;
  categorie: string;
}

export function computeImc(poids?: string | number, tailleCm?: string | number): ImcResult {
  const poidsNum = typeof poids === "string" ? parseFloat(poids) : poids;
  const tailleNum = typeof tailleCm === "string" ? parseFloat(tailleCm) : tailleCm;

  if (!poidsNum || !tailleNum || poidsNum <= 0 || tailleNum <= 0) {
    return { value: null, categorie: "À compléter" };
  }

  const m = tailleNum / 100;
  const imc = poidsNum / (m * m);

  let categorie: string;
  if (imc < 18.5) categorie = "Insuffisance pondérale";
  else if (imc < 25) categorie = "Corpulence normale";
  else if (imc < 30) categorie = "Surpoids";
  else categorie = "Obésité";

  return { value: Math.round(imc * 10) / 10, categorie };
}

function addPriority(
  list: Priority[],
  level: PriorityLevel,
  theme: string,
  priority: string,
  frein: string,
  conseil: string,
  ressource: string,
  suivi: string,
) {
  list.push({ level, theme, priority, frein, conseil, ressource, suivi });
}

export interface AnalysisResult {
  imc: ImcResult;
  priorities: Priority[];
  topPriorities: Priority[];
}

export function analyzeBilan(d: BilanAnswers): AnalysisResult {
  const priorities: Priority[] = [];
  const imc = computeImc(d.poids, d.taille);
  const imcValue = imc.value ?? 0;

  if (imcValue && imcValue < 18.5) {
    addPriority(
      priorities, "med", "Alimentation / poids",
      "IMC bas : repérer un risque nutritionnel ou une perte de poids.",
      "Appétit, isolement, budget, fatigue ou difficultés à cuisiner.",
      "Faire le point sur l'alimentation, les apports protéiques, le poids récent et l'appétit.",
      "Médecin traitant, diététicien, dispositifs d'aide alimentaire si besoin.",
      "Recontrôle du poids et point nutrition dans 1 à 3 mois.",
    );
  }
  if (imcValue >= 25 && imcValue < 30) {
    addPriority(
      priorities, "med", "Alimentation / activité physique",
      "Surpoids : travailler une priorité réaliste sur alimentation et mouvement.",
      "Temps disponible, habitudes alimentaires, sédentarité, stress.",
      "Objectif simple : réduire boissons sucrées/grignotage, augmenter légumes et marche quotidienne.",
      "Médecin traitant, diététicien, applications nutrition, programme local d'activité physique.",
      "Suivi à 3 mois avec poids, tour de taille et objectif d'activité.",
    );
  }
  if (imcValue >= 30) {
    addPriority(
      priorities, "high", "Alimentation / maladies chroniques",
      "Obésité : priorité de prévention cardio-métabolique.",
      "Freins possibles : fatigue, douleurs, habitudes, sommeil, contraintes de travail.",
      "Approche non culpabilisante : bilan médical, activité progressive, alimentation structurée.",
      "Médecin traitant, diététicien, activité physique adaptée, accompagnement pluriprofessionnel.",
      "Rendez-vous médical et suivi coordonné dans les 4 à 8 semaines.",
    );
  }

  const pathos = d.pathologies ?? [];
  if (pathos.includes("hta") || pathos.includes("diabete") || pathos.includes("cholesterol") || pathos.includes("cardio")) {
    addPriority(
      priorities, "high", "Maladies chroniques / cardiovasculaire",
      "Facteurs cardio-métaboliques déclarés : sécuriser le suivi et les bilans.",
      "Observance, compréhension du traitement, alimentation, activité physique, tabac.",
      "Vérifier suivi médical, tension, bilans biologiques, compréhension des traitements.",
      "Médecin traitant, pharmacien, infirmier, cardiologue/diabétologue selon situation.",
      "Point de suivi sous 1 à 3 mois, plus rapide si symptômes ou rupture de suivi.",
    );
  }
  if (pathos.includes("respiratoire")) {
    addPriority(
      priorities, "med", "Respiration / BPCO-asthme",
      "Maladie respiratoire déclarée : vérifier contrôle, dyspnée et exposition au tabac.",
      "Tabac, exposition professionnelle, mauvaise technique d'inhalation, oubli du traitement.",
      "Contrôler technique d'inhalation, signes d'essoufflement, activité adaptée.",
      "Médecin traitant, pneumologue, pharmacien pour éducation inhalateur.",
      "Réévaluation à 1 à 3 mois ou plus tôt si essoufflement aggravé.",
    );
  }

  if (d.biologie === "plus6" || d.biologie === "ns") {
    addPriority(
      priorities, "med", "Suivi médical",
      "Dernier bilan biologique ancien ou inconnu.",
      "Oubli, absence de prescription, difficulté d'accès au médecin.",
      "Proposer d'en parler au médecin traitant, surtout en cas de traitement ou facteur de risque.",
      "Médecin traitant, laboratoire de biologie médicale.",
      "Programmer un point médical selon profil de risque.",
    );
  }

  const nbMed = typeof d.nb_medicaments === "string" ? parseInt(d.nb_medicaments || "0", 10) : (d.nb_medicaments ?? 0);
  if (
    d.traitement === "oui" &&
    (nbMed >= 3 ||
      ["parfois", "souvent", "tres_souvent"].includes(d.oubli_traitement ?? "") ||
      ["oui", "regulier"].includes(d.doute_prise ?? "") ||
      ["oui", "parfois"].includes(d.difficulte_traitement ?? ""))
  ) {
    addPriority(
      priorities, "high", "Traitement / observance",
      "Risque d'oubli, de doute ou de difficulté d'organisation du traitement.",
      "Polymédication, horaires multiples, charge mentale, manque d'aide.",
      "Simplifier la routine, vérifier la compréhension de l'ordonnance, envisager pilulier ou PDA si adapté.",
      "Pharmacien, médecin traitant, IDEL, aidant, solution de préparation des doses à administrer.",
      "Point d'observance dans 2 à 4 semaines après mise en place de l'aide.",
    );
  }

  if (d.activite === "insuffisant" || d.activite === "aucune") {
    addPriority(
      priorities, d.activite === "aucune" ? "high" : "med", "Activité physique",
      "Activité physique inférieure aux recommandations.",
      "Douleurs, manque de temps, fatigue, peur de se blesser.",
      "Définir un objectif progressif : marche, escaliers, vélo, jardinage, 10 minutes puis augmentation.",
      "Médecin traitant, activité physique adaptée, associations locales.",
      "Objectif hebdomadaire et réévaluation à 1 mois.",
    );
  }
  if (d.sedentarite === "forte") {
    addPriority(
      priorities, "med", "Sédentarité",
      "Temps assis prolongé sans pause.",
      "Travail écran, habitudes, douleurs, fatigue.",
      "Se lever et marcher quelques minutes toutes les 90 à 120 minutes.",
      "Rappels téléphone, montre connectée, adaptation poste de travail.",
      "Suivi des pauses pendant 2 semaines.",
    );
  }

  const alcool = typeof d.alcool_semaine === "string" ? parseInt(d.alcool_semaine || "0", 10) : (d.alcool_semaine ?? 0);
  const joursSans = typeof d.jours_sans_alcool === "string" ? parseInt(d.jours_sans_alcool || "7", 10) : (d.jours_sans_alcool ?? 7);
  if (d.tabac === "oui") {
    addPriority(
      priorities, "high", "Tabac",
      "Tabagisme actif déclaré.",
      "Dépendance nicotinique, stress, environnement fumeur.",
      "Évaluer motivation, proposer réduction ou arrêt, substitution nicotinique si adaptée.",
      "Pharmacien, médecin, tabacologue, Tabac info service.",
      "Point motivationnel dans 2 à 4 semaines.",
    );
  }
  if (alcool > 10 || joursSans < 2) {
    addPriority(
      priorities, "med", "Alcool",
      "Consommation d'alcool au-dessus des repères de moindre risque ou absence de jours sans alcool.",
      "Habitudes sociales, stress, sommeil, méconnaissance des repères.",
      "Objectif : maximum 10 verres/semaine, maximum 2/jour, au moins 2 jours sans alcool.",
      "Médecin traitant, addictologue, CSAPA si besoin.",
      "Réévaluation de la consommation dans 1 mois.",
    );
  }
  if (d.cannabis === "oui") {
    addPriority(
      priorities, "med", "Addictions",
      "Consommation de cannabis ou substance psychoactive déclarée.",
      "Habitude, stress, contexte social, dépendance.",
      "Évaluer fréquence, retentissement et motivation à réduire.",
      "Médecin traitant, CSAPA, addictologue.",
      "Suivi rapproché si retentissement ou dépendance.",
    );
  }

  const toInt = (v: string | number | undefined) => (typeof v === "string" ? parseInt(v || "0", 10) : (v ?? 0));
  const mentalScore =
    toInt(d.mental_interet) + toInt(d.mental_triste) + toInt(d.mental_anxiete) + toInt(d.mental_inquietude);
  if (mentalScore >= 6) {
    addPriority(
      priorities, "high", "Bien-être mental",
      "Score de gêne psychologique élevé sur les deux dernières semaines.",
      "Stress, isolement, charge familiale/professionnelle, sommeil.",
      "Explorer le besoin d'aide, proposer une orientation médicale si retentissement important.",
      "Médecin traitant, psychologue, SOS Amitié, dispositifs locaux.",
      "Suivi rapide, surtout si aggravation ou idées noires.",
    );
  } else if (mentalScore >= 3) {
    addPriority(
      priorities, "med", "Bien-être mental",
      "Signes de stress, anxiété ou baisse de moral à surveiller.",
      "Charge mentale, isolement, sommeil, travail.",
      "Identifier un petit objectif : sommeil, activité, lien social, temps de récupération.",
      "Médecin traitant, associations, ligne d'écoute si besoin.",
      "Point dans 1 à 2 mois.",
    );
  }

  if (d.sommeil === "moyen" || d.sommeil === "mauvais") {
    addPriority(
      priorities, d.sommeil === "mauvais" ? "high" : "med", "Sommeil",
      "Sommeil insuffisant ou troubles du sommeil.",
      "Écrans, stress, horaires, douleurs, médicaments, alcool.",
      "Hygiène du sommeil : horaires réguliers, limiter écrans/caféine, activité physique adaptée.",
      "Médecin traitant, centre du sommeil si retentissement important.",
      "Agenda du sommeil et point à 1 mois.",
    );
  }

  if (d.depistages === "non" || d.depistages === "ns") {
    addPriority(
      priorities, "med", "Dépistages cancers",
      "Dépistages non à jour ou statut inconnu.",
      "Méconnaissance du calendrier, peur de l'examen, manque de temps.",
      "Vérifier les dépistages recommandés selon âge, sexe et antécédents.",
      "Médecin traitant, Assurance Maladie, centres de dépistage.",
      "Action à programmer dans les 1 à 3 mois.",
    );
  }
  if (d.dentaire === "plus1" || d.dentaire === "douleur") {
    addPriority(
      priorities, d.dentaire === "douleur" ? "high" : "med", "Santé bucco-dentaire",
      "Suivi dentaire insuffisant ou problème actuel.",
      "Coût, peur, oubli, accès au dentiste.",
      "Brossage 2 fois/jour 2 minutes, dentifrice fluoré, consultation annuelle.",
      "Chirurgien-dentiste, dispositifs 100% santé si concerné.",
      "Prendre rendez-vous dentaire.",
    );
  }
  if (d.vaccins === "non" || d.vaccins === "ns") {
    addPriority(
      priorities, "med", "Vaccinations",
      "Statut vaccinal non à jour ou inconnu.",
      "Carnet absent, hésitation vaccinale, manque d'information.",
      "Vérifier le calendrier vaccinal et mettre à jour Mon espace santé.",
      "Pharmacien vaccinateur, médecin, infirmier, vaccination-info-service.",
      "Contrôle du statut et mise à jour dans les 1 à 3 mois.",
    );
  }
  if (d.audition === "difficulte" || d.audition === "bruit") {
    addPriority(
      priorities, "med", "Santé auditive",
      "Difficulté auditive ou exposition au bruit.",
      "Âge, exposition sonore, absence de dépistage.",
      "Protéger l'audition, limiter volume/durée, réaliser un test de repérage si besoin.",
      "Médecin, ORL, audioprothésiste, application Höra.",
      "Dépistage auditif à programmer.",
    );
  }
  if (d.droits === "oui" || d.medecin_traitant === "non") {
    addPriority(
      priorities, "high", "Accès aux droits et aux soins",
      "Difficulté d'accès aux soins ou absence de médecin traitant.",
      "Démarches administratives, ressources, disponibilité médicale.",
      "Aider à déclarer un médecin traitant et vérifier droits à la Complémentaire Santé Solidaire.",
      "Assurance Maladie, compte Ameli, assistant social, CPTS.",
      "Action administrative prioritaire sous 1 mois.",
    );
  }
  if (d.entourage === "non" || (d.famille ?? []).includes("vit seul")) {
    addPriority(
      priorities, "med", "Lien social / autonomie",
      "Isolement potentiel ou soutien limité.",
      "Vie seule, éloignement familial, fatigue, perte d'autonomie.",
      "Identifier une personne ressource, dispositifs locaux, activités sociales.",
      "Mairie/CCAS, associations, dispositifs bien vieillir, Solitud'écoute si besoin.",
      "Point social dans 1 à 3 mois.",
    );
  }
  if (d.violences === "oui") {
    addPriority(
      priorities, "high", "Violences / sécurité",
      "Situation de violence ou d'insécurité déclarée.",
      "Isolement, peur, dépendance économique ou familiale.",
      "Créer un espace confidentiel, ne pas minimiser, orienter vers aide spécialisée.",
      "3919, 3977 si personne âgée/handicapée, urgences 17/112 si danger immédiat.",
      "Suivi sécurisé et orientation sans délai selon danger.",
    );
  }

  if ((d.age === "60-65" || d.age === "70-75") && (d.autonomie_difficultes ?? []).length > 0) {
    addPriority(
      priorities, "high", "Autonomie / maintien à domicile",
      "Difficultés déclarées sur un ou plusieurs gestes de la vie quotidienne.",
      "Douleurs, faiblesse musculaire, troubles de l'équilibre, environnement du domicile.",
      "Évaluer le besoin d'aide à domicile, d'aides techniques, et le risque de chute.",
      "Médecin traitant, ergothérapeute, kinésithérapeute, CCAS, CLIC, aide à domicile.",
      "Point sur l'autonomie et le domicile dans le mois.",
    );
  }

  if (d.age === "18-25" && (d.depistage_ist === "non" || d.depistage_ist === "ns")) {
    addPriority(
      priorities, "med", "Santé sexuelle",
      "Dépistage des infections sexuellement transmissibles non réalisé ou statut inconnu.",
      "Méconnaissance de l'offre, gratuité, confidentialité, appréhension.",
      "Informer sur le dépistage gratuit et sans ordonnance (IST, VIH) et la contraception si besoin.",
      "Centre de santé sexuelle (CeGIDD), pharmacien, médecin, sage-femme.",
      "Proposer un dépistage dans les prochaines semaines.",
    );
  }

  const rank: Record<PriorityLevel, number> = { high: 3, med: 2, low: 1 };
  priorities.sort((a, b) => rank[b.level] - rank[a.level]);

  return {
    imc,
    priorities,
    topPriorities: priorities.slice(0, 6),
  };
}
