// ============================================================
// i18n — idioma do plano (pt-BR · pt-PT · en-US).
// Traduz os RÓTULOS FIXOS (capítulos, campos, status, cabeçalhos
// e nomes de biomarcadores). O texto livre digitado pela médica
// NÃO é traduzido automaticamente — ela escreve no idioma do paciente.
//
// Carregado tanto no editor (index.html) quanto no PDF
// (Plano de Ação - PDF.html), por isso fica em window.*
// ============================================================

const LANGS = [
  { code: 'pt-BR', label: 'Português (Brasil)',   flag: '🇧🇷' },
  { code: 'pt-PT', label: 'Português (Portugal)', flag: '🇵🇹' },
  { code: 'en-US', label: 'English (US)',          flag: '🇺🇸' },
];

// Dicionário base = pt-BR. pt-PT herda e ajusta poucas palavras.
// en-US é tradução completa.
const _PT_BR = {
  // Passos / capítulos
  'step.carta': 'Paciente',
  'step.resultado': 'Bio Age e Exame',
  'step.objetivos': 'Objetivos de saúde',
  'step.biomarcadores': 'Biomarcadores em foco',
  'step.recmedicas': 'Recomendações médicas',
  'step.medicamentos': 'Medicamentos',
  'step.suplementacao': 'Suplementação',
  'step.estilo': 'Estilo de vida',
  'step.recomendacoes': 'Health Coach',
  'step.proximos': 'Próximos passos',
  'step.observacoes': 'Observações finais',

  // Subtítulos de capítulo (editor)
  'sub.resultado': 'Informe a idade biológica calculada e importe o PDF do exame. A IA identifica os biomarcadores e classifica cada um pela medicina funcional, considerando idade e gênero. Você revisa e ajusta.',
  'sub.objetivos': 'Defina até 3 objetivos principais para guiar o plano de ação.',
  'sub.biomarcadores': 'Busque o biomarcador, informe o valor e a unidade do laudo e classifique o status. A tabela aparece no plano do paciente.',
  'sub.recmedicas': 'Conduta clínica priorizada por alvo para este ciclo.',
  'sub.medicamentos': 'Prescrição contínua que o paciente já toma ou que será iniciada.',
  'sub.suplementacao': 'Lista priorizada por horário. O paciente recebe lembretes via app.',
  'sub.estilo': 'Pilares de Nutrição, Atividade Física, Sono e Bem-estar emocional.',
  'sub.recomendacoes': 'Bloco em destaque com a leitura humana do plano.',
  'sub.proximos': 'O que o paciente fará nas próximas semanas — vira agenda e tarefas no app.',
  'sub.observacoes': 'Observações finais e disclaimers que aparecem no fim do PDF.',

  // Status de biomarcador
  'status.otimo': 'Ótimo',
  'status.normal': 'Normal',
  'status.atencao': 'Atenção',

  // Toolbar
  'tb.historico': 'Histórico',
  'tb.modelo': 'Modelo',
  'tb.novo': 'Novo',
  'tb.salvarPlano': 'Salvar plano',
  'tb.exportarPdf': 'Exportar PDF',
  'tb.idioma': 'Idioma do plano',

  // PDF — capa
  'pdf.cover.label': 'Plano de Cuidado Personalizado',
  'pdf.cover.h1': 'Um plano\npara {name}.',
  'pdf.cover.paciente': 'Paciente',
  'pdf.cover.planoPersonalizado': 'Plano personalizado',
  'pdf.cover.medico': 'Médico responsável',
  'pdf.cover.emitido': 'Emitido em',
  'pdf.cover.ciclo': 'Ciclo atual',
  'pdf.header.brand': 'Plano de Cuidado',

  // PDF — Bio Age e Exame
  'pdf.res.title': 'Idade Biológica',
  'pdf.res.sub': 'A sua idade biológica reflete como o seu corpo está envelhecendo a nível celular e molecular, determinando o risco de doenças relacionadas à idade, como doenças cardiovasculares e declínio cognitivo. Ao contrário da idade cronológica, que corresponde ao número de anos vividos, a idade biológica é reversível e pode ser otimizada. Ela é calculada com base no risco de mortalidade e na idade fenotípica, determinada por diversos biomarcadores sanguíneos e parâmetros de metilação do DNA. Embora, por si só, a idade biológica possa parecer uma métrica superficial, quando combinada com mais de 100 biomarcadores sanguíneos, ela oferece um parâmetro de referência para o monitoramento da saúde e da longevidade.',
  'pdf.res.biomarkers': 'Biomarcadores',
  'pdf.res.eyebrow': 'Bio Age e Exame · {n} biomarcadores',
  'pdf.res.scoreEyebrow': 'Classificação do exame · {n} biomarcadores',
  'pdf.res.scoreEyebrowDate': 'Classificação do exame · {n} biomarcadores · laudo de {date}',
  'pdf.res.comentario': 'Comentário.',

  // Bio Age
  'bioage.label': 'Idade biológica',
  'bioage.unit': 'anos',
  'bioage.younger': '{y} mais novo que a idade cronológica',
  'bioage.older': '{y} mais velho que a idade cronológica',
  'bioage.same': 'igual à idade cronológica',
  'bioage.yearsOne': '{n} ano',
  'bioage.yearsMany': '{n} anos',
  'bioage.examDate': 'Data do exame: {date}',
  'bioage.chrono': 'Idade cronológica: {n} anos',
  'bioage.editLabel': 'Idade biológica calculada',
  'bioage.editHint': '· calculada externamente (ex.: PhenoAge / metilação)',

  // Editor — Bio Age e Exame (UI)
  'res.importTitle': 'Importar exame',
  'res.importRight': 'PDF com texto selecionável',
  'res.dropTitle': 'Arraste o PDF do exame aqui ou clique para escolher',
  'res.dropSub': 'A análise é feita por IA com base nas faixas ótimas da medicina funcional.',
  'res.analyzingTitle': 'Analisando exame',
  'res.analyzingMsg': 'Lendo o PDF e classificando os biomarcadores…',
  'res.fmPrefix': 'Medicina funcional · considerando',
  'res.sexUnknown': 'sexo não informado',
  'res.chunk': 'trecho {cur}/{total}',
  'res.examImported': 'Exame importado',
  'res.reimport': 'Reimportar',
  'res.reimportTitle': 'Importar outro PDF',
  'res.clearTitle': 'Limpar exame',
  'res.file': 'Arquivo',
  'res.lab': 'Laboratório',
  'res.all': 'Todos',
  'res.addManual': 'Adicionar biomarcador manualmente',
  'res.noCategory': 'Sem categoria',
  'res.optimal': 'ótimo',
  'res.removeBio': 'Remover biomarcador',
  'res.chronoFromPatient': 'Idade cronológica vem do capítulo Paciente',
  'res.bioCountOne': '{n} biomarcador',
  'res.bioCountMany': '{n} biomarcadores',

  // PDF — Objetivos
  'pdf.obj.title': 'Objetivos de saúde',
  'pdf.obj.sub': 'Resultados que vamos perseguir neste ciclo do plano.',
  'pdf.obj.eyebrow': 'Objetivos de saúde',
  'pdf.obj.item': 'Objetivo {i}',
  'pdf.obj.empty': 'Nenhum objetivo definido ainda.',

  // PDF — Biomarcadores
  'pdf.bio.title': 'Biomarcadores em foco',
  'pdf.bio.sub': 'Marcadores que serão acompanhados de perto neste ciclo.',
  'pdf.bio.subLaudo': ' Valores e status vêm do laudo de {date}.',
  'pdf.bio.eyebrow': 'Biomarcadores em foco · {n} marcadores',
  'pdf.bio.comentario': 'Comentário da médica.',
  'pdf.bio.empty': 'Nenhum biomarcador em foco selecionado.',
  'pdf.bio.colBiomarcador': 'Biomarcador',
  'pdf.bio.colValor': 'Valor',
  'pdf.bio.colUnidade': 'Unidade',
  'pdf.bio.colStatus': 'Status',

  // PDF — Recomendações médicas
  'pdf.rec.title': 'Recomendações médicas',
  'pdf.rec.titleCont': 'Recomendações médicas (cont.)',
  'pdf.rec.sub': 'Conduta clínica priorizada por alvo para este ciclo.',
  'pdf.rec.eyebrow': 'Recomendações médicas',
  'pdf.rec.eyebrowAlvos': 'Recomendações médicas · {n} alvos',
  'pdf.rec.colAlvo': 'Alvo',
  'pdf.rec.colRec': 'Recomendação',

  // PDF — Medicamentos / Rx
  'pdf.med.title': 'Medicamentos',
  'pdf.med.titleCont': 'Medicamentos (cont.)',
  'pdf.med.sub': 'Prescrição contínua que o paciente já toma ou que será iniciada neste ciclo.',
  'pdf.med.eyebrow': 'Medicamentos',
  'pdf.med.eyebrowN': 'Medicamentos · {n} prescrições',
  'rx.dose': 'Dose',
  'rx.periodo': 'Período',
  'rx.duracao': 'Duração',
  'rx.quantidade': 'Quantidade',
  'rx.tomarCom': 'Tomar com',
  'rx.comoTomar': 'Como tomar',
  'rx.objetivo': 'Objetivo',
  'rx.biomarcadores': 'Biomarcadores',
  'rx.ondeComprar': 'Onde comprar',
  'rx.medicamento': 'Medicamento',
  'rx.suplemento': 'Suplemento',

  // PDF — Peptídeos
  'pdf.pept.title': 'Peptide Therapy',
  'pdf.pept.sub': 'Terapia peptídica · dose, frequência e via de administração.',
  'pdf.pept.eyebrow': 'Peptide Therapy',
  'pdf.pept.eyebrowMed': 'Medicamentos · Peptide Therapy',
  'pdf.pept.colPeptideo': 'Peptídeo',
  'pdf.pept.colDose': 'Dose',
  'pdf.pept.colFreq': 'Frequência / Via',

  // PDF — Suplementação
  'pdf.sup.title': 'Suplementação',
  'pdf.sup.titleCont': 'Suplementação (cont.)',
  'pdf.sup.sub': 'Lista priorizada por horário. O paciente recebe lembretes via app a partir destas regras.',
  'pdf.sup.eyebrow': 'Suplementação',
  'pdf.sup.summary': '{n} protocolos · {m} manhã · {l} almoço · {no} noite',

  // PDF — Estilo de vida
  'pdf.est.title': 'Estilo de vida',
  'pdf.est.eyebrow': 'Estilo de vida',
  'pdf.est.eyebrowN': 'Estilo de vida · {n} pilares',
  'lf.direcionamentos': 'Direcionamentos',
  'lf.recomendados': 'Alimentos recomendados',
  'lf.evite': 'Evite',
  'lf.bio': 'Biomarcadores relacionados',
  'lf.medicao': 'Medição',

  // PDF — Health Coach
  'pdf.coach.title': 'Health Coach',
  'pdf.coach.sub': 'A leitura humana do plano. Acompanhamento semanal via app, com chamadas mensais.',
  'pdf.coach.eyebrow': 'Health Coach',
  'pdf.coach.motivacao': 'Motivação pessoal',
  'pdf.coach.compromisso': 'Compromisso pessoal',

  // PDF — Próximos passos
  'pdf.prox.title': 'Próximos passos',
  'pdf.prox.titleCont': 'Próximos passos (cont.)',
  'pdf.prox.sub': 'O que o paciente fará nas próximas semanas. As tarefas aparecem como agenda e lembretes no app.',
  'pdf.prox.eyebrow': 'Próximos passos',
  'pdf.prox.eyebrowN': 'Próximos passos · {e} exames · {a} biomarcadores',
  'pdf.prox.exames': 'Exames adicionais',
  'pdf.prox.acomp': 'Acompanhamento de biomarcadores',
  'pdf.prox.biomarcador': 'Biomarcador',
  'pdf.prox.revisar': 'Revisar',

  // PDF — Observações finais
  'pdf.obs.title': 'Observações finais',
  'pdf.obs.sub': 'Notas finais da equipe médica.',
  'pdf.obs.eyebrow': 'Observações finais',

  // Períodos
  'period.manha': 'Manhã',
  'period.almoco': 'Almoço',
  'period.noite': 'Noite',

  'common.cont': ' (cont.)',
};

// pt-PT — herda pt-BR, ajusta vocabulário/ortografia de Portugal.
const _PT_PT = Object.assign({}, _PT_BR, {
  'sub.resultado': 'Informe a idade biológica calculada e importe o PDF da análise. A IA identifica os biomarcadores e classifica cada um pela medicina funcional, considerando idade e género. Pode rever e ajustar.',
  'pdf.res.sub': 'A sua idade biológica reflete como o seu corpo está a envelhecer a nível celular e molecular, determinando o risco de doenças relacionadas com a idade, como doenças cardiovasculares e declínio cognitivo. Ao contrário da idade cronológica, que corresponde ao número de anos vividos, a idade biológica é reversível e pode ser otimizada. É calculada com base no risco de mortalidade e na idade fenotípica, determinada por diversos biomarcadores sanguíneos e parâmetros de metilação do ADN. Embora, por si só, a idade biológica possa parecer uma métrica superficial, quando combinada com mais de 100 biomarcadores sanguíneos, oferece um parâmetro de referência para a monitorização da saúde e da longevidade.',
  'pdf.obs.sub': 'Notas finais da equipa médica.',
  'res.file': 'Ficheiro',
  'res.dropSub': 'A análise é feita por IA com base nas faixas ótimas da medicina funcional.',
  'pdf.coach.sub': 'A leitura humana do plano. Acompanhamento semanal pela app, com chamadas mensais.',
  'sub.suplementacao': 'Lista priorizada por horário. O paciente recebe lembretes pela app.',
  'sub.proximos': 'O que o paciente fará nas próximas semanas — passa a agenda e tarefas na app.',
});

// en-US — tradução completa.
const _EN_US = {
  'step.carta': 'Patient',
  'step.resultado': 'Bio Age & Labs',
  'step.objetivos': 'Health Goals',
  'step.biomarcadores': 'Focus Biomarkers',
  'step.recmedicas': 'Medical Recommendations',
  'step.medicamentos': 'Medications',
  'step.suplementacao': 'Supplements',
  'step.estilo': 'Lifestyle',
  'step.recomendacoes': 'Health Coach',
  'step.proximos': 'Next Steps',
  'step.observacoes': 'Final Notes',

  'sub.resultado': "Enter the calculated biological age and import the lab PDF. The AI identifies the biomarkers and classifies each one by functional medicine, considering age and sex. You review and adjust.",
  'sub.objetivos': 'Set up to 3 main goals to guide the action plan.',
  'sub.biomarcadores': 'Search the biomarker, enter the value and unit from the report and classify the status. The table appears in the patient plan.',
  'sub.recmedicas': 'Clinical guidance prioritized by target for this cycle.',
  'sub.medicamentos': 'Ongoing prescription the patient already takes or will start.',
  'sub.suplementacao': 'List prioritized by time of day. The patient gets reminders via the app.',
  'sub.estilo': 'Pillars of Nutrition, Physical Activity, Sleep and Emotional Wellbeing.',
  'sub.recomendacoes': 'Highlighted block with the human reading of the plan.',
  'sub.proximos': 'What the patient will do over the next weeks — becomes schedule and tasks in the app.',
  'sub.observacoes': 'Final notes and disclaimers shown at the end of the PDF.',

  'status.otimo': 'Optimal',
  'status.normal': 'Normal',
  'status.atencao': 'Attention',

  'tb.historico': 'History',
  'tb.modelo': 'Template',
  'tb.novo': 'New',
  'tb.salvarPlano': 'Save plan',
  'tb.exportarPdf': 'Export PDF',
  'tb.idioma': 'Plan language',

  'pdf.cover.label': 'Personalized Care Plan',
  'pdf.cover.h1': 'A plan\nfor {name}.',
  'pdf.cover.paciente': 'Patient',
  'pdf.cover.planoPersonalizado': 'Personalized plan',
  'pdf.cover.medico': 'Attending physician',
  'pdf.cover.emitido': 'Issued on',
  'pdf.cover.ciclo': 'Current cycle',
  'pdf.header.brand': 'Care Plan',

  'pdf.res.title': 'Biological Age',
  'pdf.res.sub': 'Your biological age reflects how your body is aging at a cellular and molecular level, determining the risk of age related health conditions, such as cardiovascular diseases and cognitive decline. In opposite to the chronological age, that corresponds to the number of lived years, the biological age is reversible and can be optimized. It is calculated based on the mortality risk and the phenotypic age, determined by several blood biomarkers and DNA methylation parameters. Although on its own the biological age may seem to be a vanity metric, when combined with more than 100 blood biomarkers, it offers a reference mark for health and longevity monitorization.',
  'pdf.res.biomarkers': 'Biomarkers',
  'pdf.res.eyebrow': 'Bio Age & Labs · {n} biomarkers',
  'pdf.res.scoreEyebrow': 'Lab classification · {n} biomarkers',
  'pdf.res.scoreEyebrowDate': 'Lab classification · {n} biomarkers · report from {date}',
  'pdf.res.comentario': 'Comment.',

  'bioage.label': 'Biological age',
  'bioage.unit': 'years',
  'bioage.younger': '{y} younger than chronological age',
  'bioage.older': '{y} older than chronological age',
  'bioage.same': 'same as chronological age',
  'bioage.yearsOne': '{n} year',
  'bioage.yearsMany': '{n} years',
  'bioage.examDate': 'Exam date: {date}',
  'bioage.chrono': 'Chronological age: {n} years',
  'bioage.editLabel': 'Calculated biological age',
  'bioage.editHint': '· calculated externally (e.g. PhenoAge / methylation)',

  'res.importTitle': 'Import exam',
  'res.importRight': 'PDF with selectable text',
  'res.dropTitle': 'Drag the exam PDF here or click to choose',
  'res.dropSub': 'Analysis is done by AI based on functional medicine optimal ranges.',
  'res.analyzingTitle': 'Analyzing exam',
  'res.analyzingMsg': 'Reading the PDF and classifying the biomarkers…',
  'res.fmPrefix': 'Functional medicine · considering',
  'res.sexUnknown': 'sex not provided',
  'res.chunk': 'section {cur}/{total}',
  'res.examImported': 'Imported exam',
  'res.reimport': 'Re-import',
  'res.reimportTitle': 'Import another PDF',
  'res.clearTitle': 'Clear exam',
  'res.file': 'File',
  'res.lab': 'Laboratory',
  'res.all': 'All',
  'res.addManual': 'Add biomarker manually',
  'res.noCategory': 'No category',
  'res.optimal': 'optimal',
  'res.removeBio': 'Remove biomarker',
  'res.chronoFromPatient': 'Chronological age comes from the Patient chapter',
  'res.bioCountOne': '{n} biomarker',
  'res.bioCountMany': '{n} biomarkers',

  'pdf.obj.title': 'Health Goals',
  'pdf.obj.sub': 'Outcomes we will pursue in this plan cycle.',
  'pdf.obj.eyebrow': 'Health Goals',
  'pdf.obj.item': 'Goal {i}',
  'pdf.obj.empty': 'No goals defined yet.',

  'pdf.bio.title': 'Focus Biomarkers',
  'pdf.bio.sub': 'Markers that will be tracked closely in this cycle.',
  'pdf.bio.subLaudo': ' Values and status come from the report dated {date}.',
  'pdf.bio.eyebrow': 'Focus Biomarkers · {n} markers',
  'pdf.bio.comentario': "Physician's comment.",
  'pdf.bio.empty': 'No focus biomarker selected.',
  'pdf.bio.colBiomarcador': 'Biomarker',
  'pdf.bio.colValor': 'Value',
  'pdf.bio.colUnidade': 'Unit',
  'pdf.bio.colStatus': 'Status',

  'pdf.rec.title': 'Medical Recommendations',
  'pdf.rec.titleCont': 'Medical Recommendations (cont.)',
  'pdf.rec.sub': 'Clinical guidance prioritized by target for this cycle.',
  'pdf.rec.eyebrow': 'Medical Recommendations',
  'pdf.rec.eyebrowAlvos': 'Medical Recommendations · {n} targets',
  'pdf.rec.colAlvo': 'Target',
  'pdf.rec.colRec': 'Recommendation',

  'pdf.med.title': 'Medications',
  'pdf.med.titleCont': 'Medications (cont.)',
  'pdf.med.sub': 'Ongoing prescription the patient already takes or will start this cycle.',
  'pdf.med.eyebrow': 'Medications',
  'pdf.med.eyebrowN': 'Medications · {n} prescriptions',
  'rx.dose': 'Dose',
  'rx.periodo': 'Time',
  'rx.duracao': 'Duration',
  'rx.quantidade': 'Quantity',
  'rx.tomarCom': 'Take with',
  'rx.comoTomar': 'How to take',
  'rx.objetivo': 'Goal',
  'rx.biomarcadores': 'Biomarkers',
  'rx.ondeComprar': 'Where to buy',
  'rx.medicamento': 'Medication',
  'rx.suplemento': 'Supplement',

  'pdf.pept.title': 'Peptide Therapy',
  'pdf.pept.sub': 'Peptide therapy · dose, frequency and route of administration.',
  'pdf.pept.eyebrow': 'Peptide Therapy',
  'pdf.pept.eyebrowMed': 'Medications · Peptide Therapy',
  'pdf.pept.colPeptideo': 'Peptide',
  'pdf.pept.colDose': 'Dose',
  'pdf.pept.colFreq': 'Frequency / Route',

  'pdf.sup.title': 'Supplements',
  'pdf.sup.titleCont': 'Supplements (cont.)',
  'pdf.sup.sub': 'List prioritized by time of day. The patient gets reminders via the app based on these rules.',
  'pdf.sup.eyebrow': 'Supplements',
  'pdf.sup.summary': '{n} protocols · {m} morning · {l} lunch · {no} night',

  'pdf.est.title': 'Lifestyle',
  'pdf.est.eyebrow': 'Lifestyle',
  'pdf.est.eyebrowN': 'Lifestyle · {n} pillars',
  'lf.direcionamentos': 'Guidelines',
  'lf.recomendados': 'Recommended foods',
  'lf.evite': 'Avoid',
  'lf.bio': 'Related biomarkers',
  'lf.medicao': 'Measurement',

  'pdf.coach.title': 'Health Coach',
  'pdf.coach.sub': 'The human reading of the plan. Weekly follow-up via app, with monthly calls.',
  'pdf.coach.eyebrow': 'Health Coach',
  'pdf.coach.motivacao': 'Personal motivation',
  'pdf.coach.compromisso': 'Personal commitment',

  'pdf.prox.title': 'Next Steps',
  'pdf.prox.titleCont': 'Next Steps (cont.)',
  'pdf.prox.sub': 'What the patient will do over the next weeks. Tasks appear as schedule and reminders in the app.',
  'pdf.prox.eyebrow': 'Next Steps',
  'pdf.prox.eyebrowN': 'Next Steps · {e} exams · {a} biomarkers',
  'pdf.prox.exames': 'Additional exams',
  'pdf.prox.acomp': 'Biomarker follow-up',
  'pdf.prox.biomarcador': 'Biomarker',
  'pdf.prox.revisar': 'Review',

  'pdf.obs.title': 'Final Notes',
  'pdf.obs.sub': 'Final notes from the medical team.',
  'pdf.obs.eyebrow': 'Final Notes',

  'period.manha': 'Morning',
  'period.almoco': 'Lunch',
  'period.noite': 'Night',

  'common.cont': ' (cont.)',
};

const I18N = { 'pt-BR': _PT_BR, 'pt-PT': _PT_PT, 'en-US': _EN_US };

// Tradução de chave com interpolação {var}.
function tr(key, lang, vars) {
  const dict = I18N[lang] || I18N['pt-BR'];
  let s = (dict && dict[key] != null) ? dict[key] : (I18N['pt-BR'][key] != null ? I18N['pt-BR'][key] : key);
  if (vars) Object.keys(vars).forEach(k => { s = s.split('{' + k + '}').join(vars[k]); });
  return s;
}

// ─── Tradução de nomes de biomarcadores ─────────────────────
// pt-PT e pt-BR usam o mesmo nome (português médico). Só en-US traduz.
// Mapa por nome normalizado → inglês (cobre os mais comuns; o que não
// estiver no mapa mantém o nome original).
function _nb(s) {
  return (s || '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-z0-9]+/g, ' ').trim();
}
const BIO_EN = {
  'colesterol total': 'Total Cholesterol',
  'colesterol hdl': 'HDL Cholesterol',
  'hdl colesterol': 'HDL Cholesterol',
  'colesterol ldl': 'LDL Cholesterol',
  'ldl colesterol': 'LDL Cholesterol',
  'triglicerideos': 'Triglycerides',
  'triglicerides': 'Triglycerides',
  'apolipoproteina a': 'Apolipoprotein A',
  'apolipoproteina b': 'Apolipoprotein B',
  'apo b': 'Apolipoprotein B',
  'homocisteina': 'Homocysteine',
  'pcr ultrassensivel': 'hs-CRP',
  'pcr ultra sensivel': 'hs-CRP',
  'lipoproteina a': 'Lipoprotein(a)',
  'acido urico': 'Uric Acid',
  'hemoglobina glicada': 'Hemoglobin A1c (HbA1c)',
  'hemoglobina glicada hba1c': 'Hemoglobin A1c (HbA1c)',
  'resistencia a insulina': 'Insulin Resistance',
  'glicose': 'Glucose',
  'glicemia jejum': 'Fasting Glucose',
  'insulina': 'Insulin',
  'tsh': 'TSH',
  't4 livre': 'Free T4',
  't3 livre': 'Free T3',
  'ferritina': 'Ferritin',
  'ferro serico': 'Serum Iron',
  'saturacao de transferrina': 'Transferrin Saturation',
  'hemoglobina': 'Hemoglobin',
  'hematocrito': 'Hematocrit',
  'eritrocitos': 'Red Blood Cells',
  'volume corpuscular medio': 'Mean Corpuscular Volume (MCV)',
  'vitamina b12': 'Vitamin B12',
  'vitamina b6 fosfato de piridoxal': 'Vitamin B6 (P5P)',
  'folato': 'Folate',
  '25 oh vitamina d': '25-OH Vitamin D',
  'hidroxivitamina d': '25-OH Vitamin D',
  'vitamina d': 'Vitamin D',
  'zinco': 'Zinc',
  'cobre': 'Copper',
  'magnesio': 'Magnesium',
  'magnesio eritrocitario': 'RBC Magnesium',
  'alanina aminotransferase': 'ALT',
  'aspartato aminotransferase': 'AST',
  'gama gt': 'GGT',
  'fosfatase alcalina': 'Alkaline Phosphatase',
  'bilirrubina total': 'Total Bilirubin',
  'bilirrubina direta': 'Direct Bilirubin',
  'cortisol': 'Cortisol',
  'cortisol salivar': 'Salivary Cortisol',
  'cortisol noturno': 'Night Cortisol',
  'dhea s': 'DHEA-S',
  'melatonina': 'Melatonin',
  'mercurio': 'Mercury',
  'indice omega 3': 'Omega-3 Index',
  'indice de omega 3': 'Omega-3 Index',
  'vo2 max': 'VO2 max',
  'vo2 maximo': 'VO2 max',
  'hrv': 'HRV',
  'hrv noturno': 'Night HRV',
  'fc repouso': 'Resting HR',
  'massa magra': 'Lean Mass',
  'lactato': 'Lactate',
  'ige total': 'Total IgE',
  'ige': 'IgE',
};
function trBio(name, lang) {
  if (!name || !lang || lang.indexOf('pt') === 0) return name;
  const hit = BIO_EN[_nb(name)];
  return hit || name;
}

// ─── Rótulos do editor (campos) — keyed pela string em pt-BR ──
// pt-BR devolve a própria string. pt-PT herda e ajusta poucas.
// en-US traduz tudo. Texto livre digitado NÃO entra aqui.
const _FL_EN = {
  // Paciente / médico
  'Nome do paciente': 'Patient name',
  'Data do plano': 'Plan date',
  'Gênero': 'Sex',
  '· usado na análise do exame': '· used in the lab analysis',
  'Idade': 'Age',
  'Médico responsável': 'Attending physician',
  'Saudação e data': 'Greeting and date',
  'Mensagem do Médico': "Physician's message",
  // Biomarcadores / exame
  'Valor': 'Value',
  'Unidade': 'Unit',
  'Status': 'Status',
  'Data do laudo': 'Report date',
  'Comentário do médico': "Physician's comment",
  'biomarcadores em foco': 'focus biomarkers',
  // Medicamentos / suplementos
  'Nome comercial / princípio ativo': 'Brand name / active ingredient',
  'Dose': 'Dose',
  'Período': 'Time of day',
  'Duração': 'Duration',
  'Como tomar': 'How to take',
  'Objetivo': 'Goal',
  'Biomarcadores relacionados': 'Related biomarkers',
  'Título da seção': 'Section title',
  'Quantidade': 'Quantity',
  'Tomar com': 'Take with',
  'Onde comprar (link)': 'Where to buy (link)',
  'Novo medicamento': 'New medication',
  'Adicionar medicamento': 'Add medication',
  'Adicionar suplemento': 'Add supplement',
  'Peptide Therapy': 'Peptide Therapy',
  // Estilo de vida
  'Frase-conceito do ciclo': 'Cycle concept phrase',
  'Título': 'Title',
  'Selo (badge)': 'Badge',
  'Medição (wearable)': 'Measurement (wearable)',
  'Direcionamentos': 'Guidelines',
  'Alimentos recomendados': 'Recommended foods',
  'Evite esses alimentos': 'Avoid these foods',
  // Health Coach
  'Coach responsável': 'Lead coach',
  'Nome do Health Coach': 'Health Coach name',
  'Mensagem do Coach': "Coach's message",
  'Motivações pessoais & propósito': 'Personal motivations & purpose',
  'O que faz isso importar para ele(a)': 'Why this matters to them',
  'Compromisso pessoal do paciente': "Patient's personal commitment",
  // Próximos passos
  'Tipo': 'Type',
  'Quando o paciente deve realizar': 'When the patient should do it',
  'Prioridade': 'Priority',
  'Biomarcadores que motivam a solicitação': 'Biomarkers behind the request',
  'Observação para o paciente': 'Note for the patient',
  '(opcional)': '(optional)',
  'Biomarcador a acompanhar': 'Biomarker to track',
  'Intervalo de revisão': 'Review interval',
  'Observação': 'Note',
  'Acompanhamento': 'Follow-up',
  // Observações finais
  'Observações finais': 'Final notes',
  // Care team
  'Meu Care Team': 'My Care Team',
  'Equipe atribuída': 'Assigned team',
  'Chat & contato': 'Chat & contact',
  'Texto do botão principal': 'Primary button text',
  'Canal preferencial': 'Preferred channel',
  // Botões de capítulo
  'Capítulo': 'Chapter',
  'Salvar capítulo': 'Save chapter',
  'Salvo': 'Saved',
};
const _FL_PT_PT = {
  'Gênero': 'Género',
  'Médico responsável': 'Médico responsável',
};
function fl(pt) {
  const lang = (typeof window !== 'undefined' && window.__planLang) || 'pt-BR';
  if (lang === 'pt-BR') return pt;
  if (lang === 'pt-PT') return _FL_PT_PT[pt] || pt;
  return _FL_EN[pt] != null ? _FL_EN[pt] : pt;
}

// ─── Bio Age: número parseado + frase comparativa vs idade cronológica ──
function _numBR(v) {
  if (v == null) return NaN;
  const n = parseFloat(String(v).replace(',', '.').replace(/[^0-9.\-]/g, ''));
  return isFinite(n) ? n : NaN;
}
function bioAgeNum(v) { return _numBR(v); }
function bioAgePhrase(bio, chrono, lang) {
  const b = _numBR(bio), c = _numBR(chrono);
  if (!isFinite(b) || !isFinite(c)) return '';
  const d = Math.round((c - b) * 10) / 10;
  const abs = Math.abs(d);
  if (abs < 0.05) return tr('bioage.same', lang);
  // formata número: inteiro sem casas, senão 1 casa
  const isInt = Math.abs(abs - Math.round(abs)) < 0.05;
  const numStr = isInt ? String(Math.round(abs)) : abs.toFixed(1).replace('.', lang.indexOf('pt') === 0 ? ',' : '.');
  const yKey = (isInt && Math.round(abs) === 1) ? 'bioage.yearsOne' : 'bioage.yearsMany';
  const yStr = tr(yKey, lang, { n: numStr });
  return tr(d > 0 ? 'bioage.younger' : 'bioage.older', lang, { y: yStr });
}

Object.assign(window, { LANGS, I18N, tr, trBio, fl, bioAgeNum, bioAgePhrase });
