<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, interactive-widget=resizes-content">
<title>Gestão de Rebanho</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
  :root {
    color-scheme: light dark;
    --bg: #FAF8F2;
    --surface: #FFFFFF;
    --surface-2: #F1EEE4;
    --border: #E2DCC9;
    --text: #292620;
    --text-muted: #736C5C;
    --primary: #2F4A2C;
    --primary-hover: #24391F;
    --primary-contrast: #FFFFFF;
    --accent: #8C6A3F;
    --accent-soft: #F0E6D2;
    --danger: #A3352B;
    --danger-soft: #F6E4E1;
    --warn: #93690F;
    --warn-soft: #F5E9C8;
    --focus-ring: #7A9B6E;
    --radius-sm: 8px;
    --radius-md: 14px;
    --shadow: 0 1px 2px rgba(41,38,32,0.06), 0 4px 14px rgba(41,38,32,0.06);
  }
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
      --bg: #171912; --surface: #20231A; --surface-2: #262A1E; --border: #383C2D;
      --text: #EDEAE0; --text-muted: #A5A08D; --primary: #6E9A5F; --primary-hover: #7EAD6E;
      --primary-contrast: #0F140C; --accent: #C7A46B; --accent-soft: #33301F;
      --danger: #E08579; --danger-soft: #3A2320; --warn: #E0BF5A; --warn-soft: #3A3220;
      --focus-ring: #6E9A5F; --shadow: 0 1px 2px rgba(0,0,0,0.3), 0 4px 14px rgba(0,0,0,0.35);
    }
  }
  :root[data-theme="dark"] {
    --bg: #171912; --surface: #20231A; --surface-2: #262A1E; --border: #383C2D;
    --text: #EDEAE0; --text-muted: #A5A08D; --primary: #6E9A5F; --primary-hover: #7EAD6E;
    --primary-contrast: #0F140C; --accent: #C7A46B; --accent-soft: #33301F;
    --danger: #E08579; --danger-soft: #3A2320; --warn: #E0BF5A; --warn-soft: #3A3220;
    --focus-ring: #6E9A5F; --shadow: 0 1px 2px rgba(0,0,0,0.3), 0 4px 14px rgba(0,0,0,0.35);
  }

  * { box-sizing: border-box; }
  html, body { margin: 0; padding: 0; overscroll-behavior-y: contain; }
  body {
    background: var(--bg); color: var(--text);
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    line-height: 1.45; min-height: 100vh;
    overscroll-behavior-y: contain;
  }
  .wrap { max-width: 780px; margin: 0 auto; padding: 16px; }
  @media (min-width: 640px) { .wrap { padding: 28px 24px; } }

  header.app-header {
    background: var(--primary); color: var(--primary-contrast);
    border-radius: var(--radius-md); padding: 18px 20px;
    display: flex; justify-content: space-between; align-items: center;
    gap: 12px; margin-bottom: 20px; box-shadow: var(--shadow);
  }
  header.app-header h1 { margin: 0; font-size: 1.25rem; font-weight: 700; letter-spacing: -0.01em; }
  header.app-header p { margin: 2px 0 0; font-size: 0.75rem; opacity: 0.8; }
  .badge-local {
    font-size: 0.7rem; font-weight: 600; white-space: nowrap;
    background: rgba(255,255,255,0.14); border: 1px solid rgba(255,255,255,0.28);
    padding: 5px 10px; border-radius: 999px;
  }

  nav.tabs {
    display: flex; gap: 4px; margin-bottom: 20px;
    border-bottom: 1px solid var(--border);
    overflow-x: auto; -webkit-overflow-scrolling: touch;
  }
  nav.tabs::-webkit-scrollbar { display: none; }
  .tab-btn {
    appearance: none; border: none; background: none; cursor: pointer;
    font-family: inherit; font-size: 0.85rem; font-weight: 600;
    color: var(--text-muted); padding: 10px 14px; white-space: nowrap;
    border-bottom: 2px solid transparent; margin-bottom: -1px;
    transition: color 0.15s ease, border-color 0.15s ease;
    display: inline-flex; align-items: center; gap: 6px;
  }
  .tab-btn:hover { color: var(--text); }
  .tab-btn.active { color: var(--primary); border-bottom-color: var(--primary); }
  .tab-count {
    background: var(--danger); color: #fff; font-size: 0.68rem; font-weight: 700;
    min-width: 17px; height: 17px; border-radius: 999px; display: inline-flex;
    align-items: center; justify-content: center; padding: 0 4px;
  }

  .panel { display: none; }
  .panel.visible { display: block; }

  .card {
    background: var(--surface); border: 1px solid var(--border);
    border-radius: var(--radius-md); padding: 18px; box-shadow: var(--shadow);
  }
  .card h2 { margin: 0 0 4px; font-size: 1.05rem; color: var(--primary); }
  .card > p.hint { color: var(--text-muted); font-size: 0.85rem; margin: 0 0 14px; }

  .toolbar {
    display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
    justify-content: space-between; margin-bottom: 16px;
  }
  .search-group { display: flex; gap: 8px; flex: 1; min-width: 220px; }
  .search-group input { flex: 1; }
  .count-tag { font-size: 0.82rem; color: var(--text-muted); white-space: nowrap; font-weight: 500; }

  label { display: block; font-size: 0.78rem; font-weight: 600; color: var(--text-muted); margin-bottom: 5px; }
  input[type="text"], input[type="date"], input[type="number"], select, textarea {
    width: 100%; font-family: inherit; font-size: 0.92rem; color: var(--text);
    background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-sm);
    padding: 10px 12px; transition: border-color 0.15s ease, box-shadow 0.15s ease;
  }
  input:focus, select:focus, textarea:focus {
    outline: none; border-color: var(--focus-ring);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--focus-ring) 30%, transparent);
  }
  textarea { font-family: 'SFMono-Regular', Consolas, monospace; font-size: 0.82rem; resize: vertical; }
  .field-note { font-size: 0.75rem; color: var(--text-muted); margin-top: 5px; }

  .field-grid { display: grid; grid-template-columns: 1fr; gap: 14px; margin-bottom: 18px; }
  @media (min-width: 640px) { .field-grid { grid-template-columns: 1fr 1fr; } }

  .btn {
    appearance: none; border: none; cursor: pointer; font-family: inherit;
    font-size: 0.85rem; font-weight: 600; border-radius: var(--radius-sm);
    padding: 10px 18px; display: inline-flex; align-items: center; gap: 6px;
    transition: background 0.15s ease, opacity 0.15s ease;
  }
  .btn-primary { background: var(--primary); color: var(--primary-contrast); }
  .btn-primary:hover { background: var(--primary-hover); }
  .btn-secondary { background: var(--surface-2); color: var(--text); }
  .btn-secondary:hover { opacity: 0.85; }
  .btn-danger { background: var(--danger-soft); color: var(--danger); }
  .btn-danger:hover { opacity: 0.85; }
  .btn-sm { padding: 6px 12px; font-size: 0.78rem; }
  .btn-icon {
    width: 42px; height: 42px; padding: 0; flex-shrink: 0;
    display: flex; align-items: center; justify-content: center; font-size: 1.1rem;
    border-radius: var(--radius-sm);
  }
  .form-actions { display: flex; justify-content: flex-end; gap: 10px; padding-top: 4px; }

  .list { display: flex; flex-direction: column; gap: 10px; }
  .animal-card {
    background: var(--surface); border: 1px solid var(--border); border-left: 3px solid var(--primary);
    border-radius: var(--radius-sm); padding: 14px 16px;
    display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; flex-wrap: wrap;
  }
  .animal-name { font-weight: 700; font-size: 0.98rem; margin-right: 6px; }
  .tag {
    display: inline-block; font-size: 0.72rem; font-weight: 600; font-family: monospace;
    background: var(--accent-soft); color: var(--accent); padding: 2px 8px; border-radius: 6px;
  }
  .animal-meta { color: var(--text-muted); font-size: 0.8rem; margin-top: 4px; }
  .animal-meta b { color: var(--text); font-weight: 600; }
  .animal-actions { display: flex; gap: 8px; flex-shrink: 0; }
  .empty-state {
    text-align: center; color: var(--text-muted); padding: 32px 16px;
    background: var(--surface); border: 1px dashed var(--border); border-radius: var(--radius-md);
  }

  .badge-alerta {
    display: inline-flex; align-items: center; gap: 5px; font-size: 0.72rem; font-weight: 600;
    padding: 3px 9px; border-radius: 999px; margin: 3px 4px 0 0;
  }
  .badge-alerta.alto { background: var(--danger-soft); color: var(--danger); }
  .badge-alerta.medio { background: var(--warn-soft); color: var(--warn); }
  .badge-alerta.ok { background: var(--accent-soft); color: var(--accent); }

  #resultado-gta {
    background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm);
    padding: 14px; font-family: monospace; font-size: 0.85rem; white-space: pre-line; overflow-x: auto;
  }
  .msg { font-size: 0.85rem; margin-top: 10px; }
  .msg.ok { color: var(--primary); }
  .msg.err { color: var(--danger); }

  section.stack { display: flex; flex-direction: column; gap: 20px; }
  .divider { border: none; border-top: 1px solid var(--border); margin: 4px 0; }

  .subsection { margin-top: 8px; padding-top: 18px; border-top: 1px solid var(--border); }
  .subsection h3 { margin: 0 0 4px; font-size: 0.9rem; color: var(--text); }
  .subsection p.hint { margin: 0 0 10px; }
  .subrow { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; align-items: center; }
  .subrow input[type="text"], .subrow input[type="number"] { flex: 2; min-width: 140px; }
  .subrow input[type="date"] { flex: 1; min-width: 140px; }
  .subitem-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
  .subitem {
    display: flex; justify-content: space-between; align-items: center;
    background: var(--surface-2); border-radius: 8px; padding: 7px 12px; font-size: 0.82rem;
  }
  .subitem button {
    background: none; border: none; color: var(--danger); cursor: pointer;
    font-size: 1rem; line-height: 1; padding: 2px 6px;
  }
  .subitem-empty { color: var(--text-muted); font-size: 0.8rem; font-style: italic; }

  .peso-resumo { display: flex; align-items: center; gap: 10px; margin-top: 4px; }
  .peso-resumo svg { display: block; }

  .alerta-item {
    display: flex; justify-content: space-between; align-items: center; gap: 10px;
    background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
    padding: 12px 14px; flex-wrap: wrap;
  }
  .alerta-item.alto { border-left: 3px solid var(--danger); }
  .alerta-item.medio { border-left: 3px solid var(--warn); }
  .alerta-texto { font-size: 0.88rem; }
  .alerta-texto b { display: block; font-size: 0.92rem; margin-bottom: 2px; }
</style>
</head>
<body>

<div class="wrap">
  <header class="app-header">
    <div>
      <h1>Gestão de Rebanho 🐄</h1>
      <p>Modo offline — dados salvos neste aparelho</p>
    </div>
    <span class="badge-local">100% Local</span>
  </header>

  <nav class="tabs">
    <button class="tab-btn" data-tab="animais" onclick="mudarAba('animais')">Meus Animais</button>
    <button class="tab-btn" data-tab="cadastro" onclick="iniciarNovoAnimal()">Novo Animal</button>
    <button class="tab-btn" data-tab="alertas" onclick="mudarAba('alertas')">Alertas <span class="tab-count" id="contador-alertas" style="display:none;">0</span></button>
    <button class="tab-btn" data-tab="importar" onclick="mudarAba('importar')">Importar (CSV)</button>
    <button class="tab-btn" data-tab="gta" onclick="mudarAba('gta')">Resumo GTA</button>
    <button class="tab-btn" data-tab="backup" onclick="mudarAba('backup')">Backup</button>
  </nav>

  <!-- ABA: LISTA -->
  <div id="aba-animais" class="panel">
    <section class="stack">
      <div class="card">
        <div class="toolbar">
          <div class="search-group">
            <input type="text" id="busca" placeholder="Pesquisar por brinco ou apelido..." oninput="filtrarAnimais()">
            <button type="button" class="btn btn-primary btn-icon" id="btn-microfone" onclick="buscarPorVoz()" title="Falar número do brinco">🎤</button>
          </div>
          <span class="count-tag" id="total-cabecas">Total: 0 cabeças</span>
        </div>
      </div>
      <div id="lista-animais" class="list"></div>
    </section>
  </div>

  <!-- ABA: CADASTRO -->
  <div id="aba-cadastro" class="panel">
    <div class="card">
      <h2>Cadastrar ou editar animal</h2>
      <p class="hint">Todos os campos são opcionais — preencha só o que você tiver.</p>
      <form id="form-animal" onsubmit="salvarAnimal(event)">
        <input type="hidden" id="animal-id">
        <div class="field-grid">
          <div>
            <label for="brinco">Brinco Cidasc (opcional — 15 dígitos)</label>
            <input type="text" id="brinco" maxlength="15" placeholder="Ex: 421234567890123">
          </div>
          <div>
            <label for="apelido">Nome popular (opcional)</label>
            <input type="text" id="apelido" placeholder="Ex: Mimosa">
          </div>
          <div>
            <label for="raca">Raça</label>
            <input type="text" id="raca" placeholder="Ex: Nelore, Angus...">
          </div>
          <div>
            <label for="categoria">Categoria</label>
            <select id="categoria">
              <option value="">Selecione...</option>
              <option value="Terneiro(a)">Terneiro(a)</option>
              <option value="Boi">Boi</option>
              <option value="Vaca">Vaca</option>
              <option value="Touro">Touro</option>
              <option value="Novilha">Novilha</option>
            </select>
          </div>
          <div>
            <label for="sexo">Sexo do animal</label>
            <select id="sexo" onchange="atualizarVisibilidadeCamposFemea()">
              <option value="">Selecione...</option>
              <option value="Macho">Macho</option>
              <option value="Fêmea">Fêmea</option>
            </select>
          </div>
          <div>
            <label for="data-nascimento">Data de nascimento</label>
            <input type="date" id="data-nascimento">
          </div>
          <div>
            <label for="localizacao">Localização atual</label>
            <select id="localizacao">
              <option value="Propriedade Própria">Propriedade Própria</option>
              <option value="Cooperativa - Campo Natural">Cooperativa (Campo Natural)</option>
              <option value="Cooperativa - Campo da Eira">Cooperativa (Campo da Eira)</option>
              <option value="Propriedade de Terceiro">Propriedade de Terceiro</option>
            </select>
          </div>
        </div>

        <div class="subsection">
          <h3>Sanitário: exame de Brucelose/Tuberculose</h3>
          <p class="hint">Informe a data do exame — o vencimento (60 dias) é calculado automaticamente.</p>
          <div class="field-grid" style="margin-bottom:6px;">
            <div>
              <label for="data-exame-sanitario">Data do exame</label>
              <input type="date" id="data-exame-sanitario" oninput="atualizarPreviewValidade()">
            </div>
            <div id="campo-rb51">
              <label for="rb51-data">Vacinação RB51 (fêmeas)</label>
              <input type="date" id="rb51-data">
              <p class="field-note">Faixa etária recomendada: 3 a 8 meses. Confirme o prazo exato com a Cidasc/Coopersanto.</p>
            </div>
          </div>
          <p id="preview-validade-exame" class="field-note"></p>
        </div>

        <div class="subsection">
          <h3>Histórico de medicações</h3>
          <p class="hint">Registre cada aplicação com a data.</p>
          <div class="subrow">
            <input type="text" id="med-nome" placeholder="Medicamento (ex: Vermífugo)">
            <input type="date" id="med-data">
            <button type="button" class="btn btn-secondary btn-sm" onclick="adicionarMedicacaoTemp()">Adicionar</button>
          </div>
          <ul id="lista-medicacoes-form" class="subitem-list"></ul>
        </div>

        <div class="subsection">
          <h3>Cobertura (monta)</h3>
          <p class="hint">No touro, registre a vaca coberta. Na vaca, registre o touro.</p>
          <div class="subrow">
            <input type="text" id="cob-parceiro" placeholder="Nome/brinco do touro ou tipo de sêmen utilizado">
            <input type="date" id="cob-data">
            <button type="button" class="btn btn-secondary btn-sm" onclick="adicionarCoberturaTemp()">Adicionar</button>
          </div>
          <ul id="lista-coberturas-form" class="subitem-list"></ul>
        </div>

        <div class="subsection" id="campo-reproducao">
          <h3>Reprodução</h3>
          <div class="field-grid" style="margin-bottom:10px;">
            <div>
              <label for="status-reprodutivo">Status reprodutivo atual</label>
              <select id="status-reprodutivo">
                <option value="">Selecione...</option>
                <option value="Vazia">Vazia</option>
                <option value="Em Cio">Em Cio</option>
                <option value="Inseminada/Coberta">Inseminada / Coberta</option>
                <option value="Prenhe">Prenhe</option>
              </select>
            </div>
          </div>
          <p class="hint">A previsão de parto é calculada a partir da data de cobertura/inseminação mais recente registrada acima (gestação de 285 a 290 dias).</p>
          <p id="preview-previsao-parto" class="field-note"></p>

          <h3 style="margin-top:18px;">Histórico de partos anteriores</h3>
          <div class="subrow">
            <input type="text" id="parto-obs" placeholder="Observação (ex: tranquilo, gêmeos, dificuldade)">
            <input type="date" id="parto-data">
            <button type="button" class="btn btn-secondary btn-sm" onclick="adicionarPartoTemp()">Adicionar</button>
          </div>
          <ul id="lista-partos-form" class="subitem-list"></ul>
        </div>

        <div class="subsection">
          <h3>Histórico de pesagem</h3>
          <p class="hint">Registre o peso ao longo do tempo para acompanhar a evolução.</p>
          <div class="subrow">
            <input type="number" id="peso-valor" placeholder="Peso (kg)" min="0" step="0.1">
            <input type="date" id="peso-data">
            <button type="button" class="btn btn-secondary btn-sm" onclick="adicionarPesagemTemp()">Adicionar</button>
          </div>
          <ul id="lista-pesagens-form" class="subitem-list"></ul>
        </div>

        <div class="form-actions">
          <button type="button" class="btn btn-secondary" onclick="limparFormulario(); mudarAba('animais')">Cancelar</button>
          <button type="submit" class="btn btn-primary">Salvar animal</button>
        </div>
      </form>
    </div>
  </div>

  <!-- ABA: ALERTAS -->
  <div id="aba-alertas" class="panel">
    <div class="card">
      <h2>Alertas do rebanho</h2>
      <p class="hint">Exames vencendo, vacinas pendentes e outras pendências, tudo em um só lugar.</p>
      <div id="lista-alertas" class="list"></div>
    </div>
  </div>

  <!-- ABA: IMPORTAR -->
  <div id="aba-importar" class="panel">
    <div class="card">
      <h2>Importação em massa</h2>
      <p class="hint">Cole os dados separados por vírgula, no padrão: <code>Brinco, Apelido, Raça, Categoria, Localização</code></p>
      <textarea id="texto-csv" rows="6" placeholder="Ex: 420000000000001, Mimosa, Nelore, Vaca, Propriedade Própria&#10;420000000000002, , Angus, Boi, Cooperativa - Campo Natural"></textarea>
      <div style="margin-top:14px;">
        <button class="btn btn-primary" onclick="processarImportacao()">Importar dados</button>
      </div>
      <p id="msg-importar" class="msg"></p>
    </div>
  </div>

  <!-- ABA: GTA -->
  <div id="aba-gta" class="panel">
    <div class="card">
      <h2>Resumo de lote para GTA</h2>
      <p class="hint">Selecione o local de origem para gerar a listagem de brincos para a Coopersanto.</p>
      <label for="filtro-gta-local">Filtrar por local de origem</label>
      <select id="filtro-gta-local" onchange="gerarResumoGTA()" style="max-width:340px; margin-bottom:16px;">
        <option value="Propriedade Própria">Propriedade Própria</option>
        <option value="Cooperativa - Campo Natural">Cooperativa - Campo Natural</option>
        <option value="Cooperativa - Campo da Eira">Cooperativa - Campo da Eira</option>
        <option value="Propriedade de Terceiro">Propriedade de Terceiro</option>
      </select>
      <div id="resultado-gta"></div>
    </div>
  </div>

  <!-- ABA: BACKUP -->
  <div id="aba-backup" class="panel">
    <div class="card" style="margin-bottom:16px;">
      <h2>Backup dos dados</h2>
      <p class="hint">Os dados ficam salvos só neste navegador/aparelho. Baixe um backup regularmente para não correr o risco de perder o cadastro.</p>
      <button class="btn btn-primary" onclick="exportarBackup()">Baixar backup (.json)</button>
    </div>
    <div class="card">
      <h2>Restaurar backup</h2>
      <p class="hint">Isso substitui todos os animais cadastrados atualmente pelos dados do arquivo de backup.</p>
      <input type="file" id="input-restaurar" accept="application/json" style="margin-bottom:10px;">
      <div>
        <button class="btn btn-secondary" onclick="restaurarBackup()">Restaurar</button>
      </div>
      <p id="msg-backup" class="msg"></p>
    </div>

    <div class="card" style="margin-top:16px;">
      <h2>Modelo de planilha (CSV) para cadastro em massa</h2>
      <p class="hint">Ideal para quem já tem uma lista de animais (planilha, caderno, etc.) e quer colocar tudo no app de uma vez. Baixe o modelo, preencha no Excel ou Planilhas Google só com o que você já sabe de cada animal — pode deixar qualquer coluna em branco — e depois importe o arquivo de volta aqui.</p>
      <button class="btn btn-primary" onclick="baixarModeloCSV()">Baixar modelo de CSV</button>
      <hr class="divider" style="margin:18px 0;">
      <label for="input-csv-planilha">Importar planilha preenchida (.csv)</label>
      <input type="file" id="input-csv-planilha" accept=".csv,text/csv" style="margin-bottom:10px;">
      <div>
        <button class="btn btn-secondary" onclick="importarCSVPlanilha()">Importar planilha</button>
      </div>
      <p class="field-note">Não apague a primeira linha (cabeçalho) do arquivo. Colunas vazias são importadas em branco normalmente.</p>
      <p id="msg-csv-planilha" class="msg"></p>
    </div>
  </div>
</div>

<script>
  const CHAVE_STORAGE = 'pecuaria_animais_v2';
  const DIAS_VALIDADE_EXAME = 60;
  const IDADE_MINIMA_TERNEIRO_DIAS = 42;
  const RB51_IDADE_MIN_DIAS = 90;
  const RB51_IDADE_MAX_DIAS = 240;
  const GESTACAO_MIN_DIAS = 285;
  const GESTACAO_MAX_DIAS = 290;
  const PARTO_ALERTA_DIAS_ANTES = 15;

  let animais = [];
  let medicacoesEdicao = [];
  let coberturasEdicao = [];
  let pesagensEdicao = [];
  let partosEdicao = [];

  // ---------- Utilidades de data ----------
  function formatarDataBR(iso) {
    if (!iso) return '';
    const partes = iso.split('-');
    if (partes.length !== 3) return iso;
    return `${partes[2]}/${partes[1]}/${partes[0]}`;
  }

  function hojeISO() {
    return new Date().toISOString().slice(0, 10);
  }

  function diasEntre(dataInicioISO, dataFimISO) {
    const inicio = new Date(dataInicioISO + 'T00:00:00');
    const fim = new Date(dataFimISO + 'T00:00:00');
    return Math.round((fim - inicio) / (1000 * 60 * 60 * 24));
  }

  function somarDias(dataISO, dias) {
    const data = new Date(dataISO + 'T00:00:00');
    data.setDate(data.getDate() + dias);
    return data.toISOString().slice(0, 10);
  }

  function calcularIdadeDias(dataNascimentoISO) {
    if (!dataNascimentoISO) return null;
    return diasEntre(dataNascimentoISO, hojeISO());
  }

  // ---------- Persistência ----------
  function carregarAnimais() {
    try {
      const bruto = localStorage.getItem(CHAVE_STORAGE);
      animais = bruto ? JSON.parse(bruto) : [];
      if (!Array.isArray(animais)) animais = [];
    } catch (erro) {
      console.error('Erro ao carregar dados salvos:', erro);
      animais = [];
    }
    let precisaSalvar = false;
    animais.forEach(a => { if (!a.id) { a.id = gerarId(); precisaSalvar = true; } });
    if (precisaSalvar) salvarLista();
  }

  function gerarId() {
    return (crypto.randomUUID ? crypto.randomUUID() : 'id-' + Date.now() + '-' + Math.random().toString(36).slice(2));
  }

  function salvarLista() {
    try {
      localStorage.setItem(CHAVE_STORAGE, JSON.stringify(animais));
      return true;
    } catch (erro) {
      console.error('Erro ao salvar:', erro);
      alert('Não foi possível salvar os dados neste dispositivo. O armazenamento pode estar cheio.');
      return false;
    }
  }

  function escapeHTML(texto) {
    const div = document.createElement('div');
    div.textContent = texto == null ? '' : String(texto);
    return div.innerHTML;
  }

  // ---------- Navegação ----------
  function mudarAba(aba) {
    document.querySelectorAll('.panel').forEach(p => p.classList.remove('visible'));
    document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
    document.getElementById(`aba-${aba}`).classList.add('visible');
    document.querySelector(`.tab-btn[data-tab="${aba}"]`).classList.add('active');
    if (aba === 'gta') gerarResumoGTA();
    if (aba === 'alertas') renderAlertas();
  }

  function iniciarNovoAnimal() {
    limparFormulario();
    mudarAba('cadastro');
  }

  function atualizarVisibilidadeCamposFemea() {
    const ehFemea = document.getElementById('sexo').value === 'Fêmea';
    document.getElementById('campo-rb51').style.display = ehFemea ? 'block' : 'none';
    document.getElementById('campo-reproducao').style.display = ehFemea ? 'block' : 'none';
  }

  function atualizarPreviewPrevisaoParto() {
    const preview = document.getElementById('preview-previsao-parto');
    const comData = coberturasEdicao.filter(c => c.data);
    if (comData.length === 0) { preview.textContent = ''; return; }
    const ultimaData = comData.slice().sort((a, b) => a.data.localeCompare(b.data)).pop().data;
    const inicio = somarDias(ultimaData, GESTACAO_MIN_DIAS);
    const fim = somarDias(ultimaData, GESTACAO_MAX_DIAS);
    preview.textContent = `Previsão de parto: entre ${formatarDataBR(inicio)} e ${formatarDataBR(fim)} (base: cobertura de ${formatarDataBR(ultimaData)})`;
  }

  function atualizarPreviewValidade() {
    const dataExame = document.getElementById('data-exame-sanitario').value;
    const preview = document.getElementById('preview-validade-exame');
    if (!dataExame) { preview.textContent = ''; return; }
    const status = statusExameSanitario({ dataExameSanitario: dataExame, categoria: document.getElementById('categoria').value });
    preview.textContent = status.texto;
  }

  // ---------- Regras sanitárias ----------
  function statusExameSanitario(a) {
    if (!a.dataExameSanitario) {
      if (a.categoria === 'Touro') {
        return { nivel: 'alto', texto: 'Touro sem exame de tuberculose registrado (obrigatório)' };
      }
      return { nivel: null, texto: 'Sem exame registrado' };
    }
    const vencimento = somarDias(a.dataExameSanitario, DIAS_VALIDADE_EXAME);
    const diasRestantes = diasEntre(hojeISO(), vencimento);
    if (diasRestantes < 0) {
      return { nivel: 'alto', texto: `Exame vencido desde ${formatarDataBR(vencimento)}`, vencimento };
    }
    if (diasRestantes <= 10) {
      return { nivel: 'medio', texto: `Exame vence em ${diasRestantes} dia(s) (${formatarDataBR(vencimento)})`, vencimento };
    }
    return { nivel: 'ok', texto: `Exame válido até ${formatarDataBR(vencimento)}`, vencimento };
  }

  function statusRB51(a) {
    if (a.sexo !== 'Fêmea') return null;
    if (a.rb51Data) return { nivel: 'ok', texto: `RB51 aplicada em ${formatarDataBR(a.rb51Data)}` };
    const idade = calcularIdadeDias(a.dataNascimento);
    if (idade !== null && idade >= RB51_IDADE_MIN_DIAS && idade <= RB51_IDADE_MAX_DIAS) {
      return { nivel: 'medio', texto: 'Apta para RB51 — vacina pendente' };
    }
    return null;
  }

  function statusIdadeTerneiro(a) {
    if (a.categoria !== 'Terneiro(a)') return null;
    const idade = calcularIdadeDias(a.dataNascimento);
    if (idade === null) return null;
    if (idade < IDADE_MINIMA_TERNEIRO_DIAS) {
      return { nivel: 'medio', texto: `Ainda não apto para GTA (${idade} de ${IDADE_MINIMA_TERNEIRO_DIAS} dias)` };
    }
    return null;
  }

  function ultimaCoberturaComData(a) {
    if (!a.coberturas) return null;
    const comData = a.coberturas.filter(c => c.data);
    if (comData.length === 0) return null;
    return comData.slice().sort((x, y) => x.data.localeCompare(y.data)).pop();
  }

  function calcularPrevisaoParto(a) {
    const ultima = ultimaCoberturaComData(a);
    if (!ultima) return null;
    return {
      dataCobertura: ultima.data,
      inicio: somarDias(ultima.data, GESTACAO_MIN_DIAS),
      fim: somarDias(ultima.data, GESTACAO_MAX_DIAS)
    };
  }

  function statusPrevisaoParto(a) {
    if (a.sexo !== 'Fêmea') return null;
    const previsao = calcularPrevisaoParto(a);
    if (!previsao) return null;
    const jaPariu = (a.partos || []).some(p => p.data && p.data > previsao.dataCobertura);
    if (jaPariu) return null;

    const hoje = hojeISO();
    const diasParaFim = diasEntre(hoje, previsao.fim);
    const diasParaInicio = diasEntre(hoje, previsao.inicio);
    const textoBase = `Previsão de parto entre ${formatarDataBR(previsao.inicio)} e ${formatarDataBR(previsao.fim)}`;

    if (diasParaFim < 0) {
      return { nivel: 'alto', texto: `${textoBase} — prazo já passou, verifique a vaca`, previsao };
    }
    if (diasParaInicio <= PARTO_ALERTA_DIAS_ANTES) {
      return { nivel: 'medio', texto: textoBase, previsao };
    }
    return { nivel: null, texto: textoBase, previsao };
  }

  function calcularTendenciaPeso(pesagens) {
    if (!pesagens || pesagens.length === 0) return null;
    const validos = pesagens.filter(p => typeof p.peso === 'number' && !isNaN(p.peso));
    if (validos.length === 0) return null;
    const comData = validos.filter(p => p.data).slice().sort((a, b) => a.data.localeCompare(b.data));
    if (comData.length >= 2) {
      const primeiro = comData[0];
      const ultimo = comData[comData.length - 1];
      return {
        ultimoPeso: ultimo.peso,
        delta: ultimo.peso - primeiro.peso,
        dias: diasEntre(primeiro.data, ultimo.data),
        serie: comData
      };
    }
    const ultimo = validos[validos.length - 1];
    return { ultimoPeso: ultimo.peso, serie: validos };
  }

  function gerarSparklineSVG(serie) {
    if (!serie || serie.length < 2) return '';
    const pesos = serie.map(p => Number(p.peso));
    const min = Math.min(...pesos), max = Math.max(...pesos);
    const largura = 100, altura = 28, pad = 3;
    const pontos = pesos.map((p, i) => {
      const x = pad + (i / (pesos.length - 1)) * (largura - pad * 2);
      const y = (max === min) ? altura / 2 : altura - pad - ((p - min) / (max - min)) * (altura - pad * 2);
      return `${x.toFixed(1)},${y.toFixed(1)}`;
    }).join(' ');
    return `<svg viewBox="0 0 ${largura} ${altura}" width="${largura}" height="${altura}"><polyline points="${pontos}" style="fill:none;stroke:var(--primary);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;"/></svg>`;
  }

  // ---------- Lista de animais ----------
  function atualizarTela() {
    const lista = document.getElementById('lista-animais');
    const busca = document.getElementById('busca').value.toLowerCase();
    lista.innerHTML = '';

    const filtrados = animais.filter(a =>
      (a.brinco && a.brinco.toLowerCase().includes(busca)) ||
      (a.apelido && a.apelido.toLowerCase().includes(busca)) ||
      (a.raca && a.raca.toLowerCase().includes(busca))
    );

    document.getElementById('total-cabecas').textContent = `Total: ${animais.length} cabeças`;

    if (filtrados.length === 0) {
      lista.innerHTML = `<div class="empty-state">Nenhum animal cadastrado ou encontrado.</div>`;
      atualizarContadorAlertas();
      return;
    }

    filtrados.forEach(a => {
      const cartao = document.createElement('div');
      cartao.className = 'animal-card';

      const ultimaMedicacao = a.medicacoes && a.medicacoes.length ? a.medicacoes[a.medicacoes.length - 1] : null;
      const ultimaCobertura = a.coberturas && a.coberturas.length ? a.coberturas[a.coberturas.length - 1] : null;
      const ultimoParto = a.partos && a.partos.length ? a.partos[a.partos.length - 1] : null;
      const tendenciaPeso = calcularTendenciaPeso(a.pesagens);
      const statusExame = statusExameSanitario(a);
      const statusVacina = statusRB51(a);
      const statusIdade = statusIdadeTerneiro(a);
      const statusParto = statusPrevisaoParto(a);

      let badgesHTML = '';
      if (statusExame.nivel) badgesHTML += `<span class="badge-alerta ${statusExame.nivel}">${escapeHTML(statusExame.texto)}</span>`;
      if (statusVacina) badgesHTML += `<span class="badge-alerta ${statusVacina.nivel}">${escapeHTML(statusVacina.texto)}</span>`;
      if (statusIdade) badgesHTML += `<span class="badge-alerta ${statusIdade.nivel}">${escapeHTML(statusIdade.texto)}</span>`;
      if (statusParto && statusParto.nivel) badgesHTML += `<span class="badge-alerta ${statusParto.nivel}">${escapeHTML(statusParto.texto)}</span>`;

      let pesoHTML = '';
      if (tendenciaPeso) {
        const svg = gerarSparklineSVG(tendenciaPeso.serie);
        const deltaTxt = (tendenciaPeso.delta != null) ? ` (${tendenciaPeso.delta >= 0 ? '+' : ''}${tendenciaPeso.delta}kg em ${tendenciaPeso.dias}d)` : '';
        pesoHTML = `<div class="peso-resumo">${svg}<span class="animal-meta" style="margin-top:0;">Peso: <b>${tendenciaPeso.ultimoPeso}kg</b>${deltaTxt}</span></div>`;
      }

      cartao.innerHTML = `
        <div>
          <span class="animal-name">${escapeHTML(a.apelido) || 'Sem nome popular'}</span>
          <span class="tag">Brinco Cidasc: ${escapeHTML(a.brinco) || 'não informado'}</span>
          <p class="animal-meta">Raça: ${escapeHTML(a.raca) || 'não informada'} &middot; Categoria: ${escapeHTML(a.categoria) || 'geral'} &middot; Sexo: ${escapeHTML(a.sexo) || 'não informado'} &middot; Local: <b>${escapeHTML(a.localizacao)}</b></p>
          ${a.dataNascimento ? `<p class="animal-meta">Nascimento: ${formatarDataBR(a.dataNascimento)}</p>` : ''}
          ${ultimaMedicacao ? `<p class="animal-meta">💉 ${a.medicacoes.length} medicação(ões) — última: ${escapeHTML(ultimaMedicacao.nome)} (${formatarDataBR(ultimaMedicacao.data) || 's/ data'})</p>` : ''}
          ${ultimaCobertura ? `<p class="animal-meta">🐂 Última cobertura: ${formatarDataBR(ultimaCobertura.data) || 's/ data'} com ${escapeHTML(ultimaCobertura.parceiro)}</p>` : ''}
          ${a.statusReprodutivo ? `<p class="animal-meta">Status reprodutivo: <b>${escapeHTML(a.statusReprodutivo)}</b></p>` : ''}
          ${statusParto ? `<p class="animal-meta">🍼 ${escapeHTML(statusParto.texto)}</p>` : ''}
          ${ultimoParto ? `<p class="animal-meta">🐮 ${a.partos.length} parto(s) anterior(es) — último: ${formatarDataBR(ultimoParto.data) || 's/ data'}${ultimoParto.obs ? ' (' + escapeHTML(ultimoParto.obs) + ')' : ''}</p>` : ''}
          ${pesoHTML}
          <div>${badgesHTML}</div>
        </div>
        <div class="animal-actions">
          <button class="btn btn-secondary btn-sm btn-editar">Editar</button>
          <button class="btn btn-danger btn-sm btn-excluir">Excluir</button>
        </div>
      `;
      cartao.querySelector('.btn-editar').addEventListener('click', () => editarAnimal(a.id));
      cartao.querySelector('.btn-excluir').addEventListener('click', () => excluirAnimal(a.id));
      lista.appendChild(cartao);
    });

    atualizarContadorAlertas();
  }

  // ---------- Aba de alertas ----------
  function coletarAlertas() {
    const alertas = [];
    animais.forEach(a => {
      const nome = a.apelido || a.brinco || 'Animal sem identificação';
      const statusExame = statusExameSanitario(a);
      if (statusExame.nivel === 'alto' || statusExame.nivel === 'medio') {
        alertas.push({ nivel: statusExame.nivel, nome, id: a.id, texto: statusExame.texto });
      }
      const statusVacina = statusRB51(a);
      if (statusVacina) alertas.push({ nivel: statusVacina.nivel, nome, id: a.id, texto: statusVacina.texto });

      const statusIdade = statusIdadeTerneiro(a);
      if (statusIdade) alertas.push({ nivel: statusIdade.nivel, nome, id: a.id, texto: statusIdade.texto });

      const statusParto = statusPrevisaoParto(a);
      if (statusParto && statusParto.nivel) alertas.push({ nivel: statusParto.nivel, nome, id: a.id, texto: statusParto.texto });
    });
    const ordemNivel = { alto: 0, medio: 1 };
    alertas.sort((x, y) => ordemNivel[x.nivel] - ordemNivel[y.nivel]);
    return alertas;
  }

  function renderAlertas() {
    const lista = document.getElementById('lista-alertas');
    const alertas = coletarAlertas();
    lista.innerHTML = '';
    if (alertas.length === 0) {
      lista.innerHTML = '<div class="empty-state">Nenhum alerta pendente no momento. 🎉</div>';
      return;
    }
    alertas.forEach(al => {
      const item = document.createElement('div');
      item.className = `alerta-item ${al.nivel}`;
      item.innerHTML = `<div class="alerta-texto"><b>${escapeHTML(al.nome)}</b>${escapeHTML(al.texto)}</div>`;
      const btn = document.createElement('button');
      btn.className = 'btn btn-secondary btn-sm';
      btn.textContent = 'Ver animal';
      btn.addEventListener('click', () => editarAnimal(al.id));
      item.appendChild(btn);
      lista.appendChild(item);
    });
  }

  function atualizarContadorAlertas() {
    const total = coletarAlertas().length;
    const contador = document.getElementById('contador-alertas');
    if (total > 0) {
      contador.style.display = 'inline-flex';
      contador.textContent = total;
    } else {
      contador.style.display = 'none';
    }
  }

  // ---------- Históricos temporários (medicação / cobertura / pesagem) ----------
  function renderMedicacoesEdicao() {
    const ul = document.getElementById('lista-medicacoes-form');
    ul.innerHTML = '';
    if (medicacoesEdicao.length === 0) {
      ul.innerHTML = '<li class="subitem-empty">Nenhuma medicação registrada ainda.</li>';
      return;
    }
    medicacoesEdicao.forEach((m, i) => {
      const li = document.createElement('li');
      li.className = 'subitem';
      li.innerHTML = `<span>${escapeHTML(m.nome)} — ${formatarDataBR(m.data) || 'sem data'}</span>`;
      const btn = document.createElement('button');
      btn.type = 'button'; btn.textContent = '✕'; btn.title = 'Remover';
      btn.addEventListener('click', () => { medicacoesEdicao.splice(i, 1); renderMedicacoesEdicao(); });
      li.appendChild(btn);
      ul.appendChild(li);
    });
  }

  function adicionarMedicacaoTemp() {
    const nomeEl = document.getElementById('med-nome');
    const dataEl = document.getElementById('med-data');
    const nome = nomeEl.value.trim();
    if (!nome && !dataEl.value) return;
    medicacoesEdicao.push({ nome, data: dataEl.value });
    nomeEl.value = ''; dataEl.value = '';
    renderMedicacoesEdicao();
  }

  function renderCoberturasEdicao() {
    const ul = document.getElementById('lista-coberturas-form');
    ul.innerHTML = '';
    if (coberturasEdicao.length === 0) {
      ul.innerHTML = '<li class="subitem-empty">Nenhuma cobertura registrada ainda.</li>';
      atualizarPreviewPrevisaoParto();
      return;
    }
    coberturasEdicao.forEach((c, i) => {
      const li = document.createElement('li');
      li.className = 'subitem';
      li.innerHTML = `<span>${escapeHTML(c.parceiro)} — ${formatarDataBR(c.data) || 'sem data'}</span>`;
      const btn = document.createElement('button');
      btn.type = 'button'; btn.textContent = '✕'; btn.title = 'Remover';
      btn.addEventListener('click', () => { coberturasEdicao.splice(i, 1); renderCoberturasEdicao(); });
      li.appendChild(btn);
      ul.appendChild(li);
    });
    atualizarPreviewPrevisaoParto();
  }

  function adicionarCoberturaTemp() {
    const parceiroEl = document.getElementById('cob-parceiro');
    const dataEl = document.getElementById('cob-data');
    const parceiro = parceiroEl.value.trim();
    if (!parceiro && !dataEl.value) return;
    coberturasEdicao.push({ parceiro, data: dataEl.value });
    parceiroEl.value = ''; dataEl.value = '';
    renderCoberturasEdicao();
  }

  function renderPesagensEdicao() {
    const ul = document.getElementById('lista-pesagens-form');
    ul.innerHTML = '';
    if (pesagensEdicao.length === 0) {
      ul.innerHTML = '<li class="subitem-empty">Nenhuma pesagem registrada ainda.</li>';
      return;
    }
    pesagensEdicao.forEach((p, i) => {
      const li = document.createElement('li');
      li.className = 'subitem';
      li.innerHTML = `<span>${escapeHTML(p.peso)}kg — ${formatarDataBR(p.data) || 'sem data'}</span>`;
      const btn = document.createElement('button');
      btn.type = 'button'; btn.textContent = '✕'; btn.title = 'Remover';
      btn.addEventListener('click', () => { pesagensEdicao.splice(i, 1); renderPesagensEdicao(); });
      li.appendChild(btn);
      ul.appendChild(li);
    });
  }

  function adicionarPesagemTemp() {
    const pesoEl = document.getElementById('peso-valor');
    const dataEl = document.getElementById('peso-data');
    const peso = parseFloat(pesoEl.value);
    if ((!peso || isNaN(peso)) && !dataEl.value) return;
    pesagensEdicao.push({ peso: isNaN(peso) ? '' : peso, data: dataEl.value });
    pesoEl.value = ''; dataEl.value = '';
    renderPesagensEdicao();
  }

  function renderPartosEdicao() {
    const ul = document.getElementById('lista-partos-form');
    ul.innerHTML = '';
    if (partosEdicao.length === 0) {
      ul.innerHTML = '<li class="subitem-empty">Nenhum parto anterior registrado.</li>';
      return;
    }
    partosEdicao.forEach((p, i) => {
      const li = document.createElement('li');
      li.className = 'subitem';
      li.innerHTML = `<span>${formatarDataBR(p.data) || 'sem data'}${p.obs ? ' — ' + escapeHTML(p.obs) : ''}</span>`;
      const btn = document.createElement('button');
      btn.type = 'button'; btn.textContent = '✕'; btn.title = 'Remover';
      btn.addEventListener('click', () => { partosEdicao.splice(i, 1); renderPartosEdicao(); });
      li.appendChild(btn);
      ul.appendChild(li);
    });
  }

  function adicionarPartoTemp() {
    const obsEl = document.getElementById('parto-obs');
    const dataEl = document.getElementById('parto-data');
    if (!dataEl.value && !obsEl.value.trim()) return;
    partosEdicao.push({ data: dataEl.value, obs: obsEl.value.trim() });
    obsEl.value = ''; dataEl.value = '';
    renderPartosEdicao();
  }

  // ---------- CRUD principal ----------
  function salvarAnimal(e) {
    e.preventDefault();
    const id = document.getElementById('animal-id').value;
    const dados = {
      brinco: document.getElementById('brinco').value.trim(),
      apelido: document.getElementById('apelido').value.trim(),
      raca: document.getElementById('raca').value.trim(),
      categoria: document.getElementById('categoria').value,
      sexo: document.getElementById('sexo').value,
      dataNascimento: document.getElementById('data-nascimento').value,
      localizacao: document.getElementById('localizacao').value,
      dataExameSanitario: document.getElementById('data-exame-sanitario').value,
      rb51Data: document.getElementById('rb51-data').value,
      statusReprodutivo: document.getElementById('status-reprodutivo').value,
      medicacoes: [...medicacoesEdicao],
      coberturas: [...coberturasEdicao],
      pesagens: [...pesagensEdicao],
      partos: [...partosEdicao]
    };

    if (dados.categoria === 'Terneiro(a)' && dados.dataNascimento) {
      const idade = calcularIdadeDias(dados.dataNascimento);
      if (idade < IDADE_MINIMA_TERNEIRO_DIAS) {
        const continuar = confirm(`Este terneiro tem ${idade} dia(s) — a idade mínima para movimentação/GTA é ${IDADE_MINIMA_TERNEIRO_DIAS} dias. Deseja salvar o cadastro mesmo assim?`);
        if (!continuar) return;
      }
    }

    if (id) {
      const existente = animais.find(a => a.id === id);
      if (existente) Object.assign(existente, dados);
    } else {
      animais.push({ id: gerarId(), ...dados });
    }

    if (salvarLista()) {
      limparFormulario();
      mudarAba('animais');
      atualizarTela();
    }
  }

  function editarAnimal(id) {
    const a = animais.find(a => a.id === id);
    if (!a) return;
    document.getElementById('animal-id').value = a.id;
    document.getElementById('brinco').value = a.brinco || '';
    document.getElementById('apelido').value = a.apelido || '';
    document.getElementById('raca').value = a.raca || '';
    document.getElementById('categoria').value = a.categoria || '';
    document.getElementById('sexo').value = a.sexo || '';
    document.getElementById('data-nascimento').value = a.dataNascimento || '';
    document.getElementById('localizacao').value = a.localizacao || 'Propriedade Própria';
    document.getElementById('data-exame-sanitario').value = a.dataExameSanitario || '';
    document.getElementById('rb51-data').value = a.rb51Data || '';
    document.getElementById('status-reprodutivo').value = a.statusReprodutivo || '';
    atualizarVisibilidadeCamposFemea();
    atualizarPreviewValidade();
    medicacoesEdicao = a.medicacoes ? [...a.medicacoes] : [];
    coberturasEdicao = a.coberturas ? [...a.coberturas] : [];
    pesagensEdicao = a.pesagens ? [...a.pesagens] : [];
    partosEdicao = a.partos ? [...a.partos] : [];
    renderMedicacoesEdicao();
    renderCoberturasEdicao();
    renderPesagensEdicao();
    renderPartosEdicao();
    mudarAba('cadastro');
  }

  function excluirAnimal(id) {
    const a = animais.find(a => a.id === id);
    if (!a) return;
    if (confirm(`Excluir o animal "${a.apelido || a.brinco || 'sem identificação'}"?`)) {
      animais = animais.filter(x => x.id !== id);
      if (salvarLista()) atualizarTela();
    }
  }

  function limparFormulario() {
    document.getElementById('form-animal').reset();
    document.getElementById('animal-id').value = '';
    medicacoesEdicao = [];
    coberturasEdicao = [];
    pesagensEdicao = [];
    partosEdicao = [];
    renderMedicacoesEdicao();
    renderCoberturasEdicao();
    renderPesagensEdicao();
    renderPartosEdicao();
    atualizarVisibilidadeCamposFemea();
    document.getElementById('preview-validade-exame').textContent = '';
  }

  function filtrarAnimais() { atualizarTela(); }

  function processarImportacao() {
    const texto = document.getElementById('texto-csv').value;
    const linhas = texto.split('\n');
    let importados = 0;

    linhas.forEach(linha => {
      if (linha.trim() !== '') {
        const partes = linha.split(',').map(p => p.trim());
        animais.push({
          id: gerarId(),
          brinco: partes[0] || '',
          apelido: partes[1] || '',
          raca: partes[2] || '',
          categoria: partes[3] || '',
          localizacao: partes[4] || 'Propriedade Própria',
          dataExameSanitario: '',
          medicacoes: [], coberturas: [], pesagens: []
        });
        importados++;
      }
    });

    const msg = document.getElementById('msg-importar');
    if (importados === 0) {
      msg.textContent = 'Nenhuma linha válida encontrada para importar.';
      msg.className = 'msg err';
      return;
    }

    if (salvarLista()) {
      msg.textContent = `${importados} registro(s) importado(s) com sucesso!`;
      msg.className = 'msg ok';
      document.getElementById('texto-csv').value = '';
      mudarAba('animais');
      atualizarTela();
    }
  }

  function gerarResumoGTA() {
    const localSelecionado = document.getElementById('filtro-gta-local').value;
    const filtrados = animais.filter(a => a.localizacao === localSelecionado);

    let resultado = `RELATÓRIO PARA SOLICITAÇÃO DE GTA\n`;
    resultado += `Local de Origem: ${localSelecionado}\n`;
    resultado += `Quantidade de Animais: ${filtrados.length}\n`;
    resultado += `--------------------------------------------------\n`;
    resultado += `NÚMEROS DOS BRINCOS (15 Dígitos):\n`;

    filtrados.forEach((a, i) => {
      resultado += `${i + 1}. ${a.brinco || 'Sem brinco'} ${a.apelido ? '(' + a.apelido + ')' : ''}\n`;
    });

    document.getElementById('resultado-gta').textContent = resultado;
  }

  const CABECALHO_CSV = ['Brinco', 'Nome Popular', 'Raça', 'Categoria', 'Sexo', 'Data de Nascimento', 'Localização', 'Data do Exame Sanitário', 'Data RB51', 'Status Reprodutivo'];

  function baixarModeloCSV() {
    const conteudo = '\uFEFF' + CABECALHO_CSV.join(';') + '\r\n';
    const blob = new Blob([conteudo], { type: 'text/csv;charset=utf-8;' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'modelo-importacao-rebanho.csv';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }

  function parseDataFlexivel(texto) {
    if (!texto) return '';
    const valor = texto.trim();
    if (/^\d{4}-\d{2}-\d{2}$/.test(valor)) return valor;
    const partesBR = valor.split('/');
    if (partesBR.length === 3) {
      const [dia, mes, ano] = partesBR;
      if (dia && mes && ano && ano.length === 4) {
        return `${ano}-${mes.padStart(2, '0')}-${dia.padStart(2, '0')}`;
      }
    }
    return '';
  }

  function dividirLinhaCSV(linha, delimitador) {
    return linha.split(delimitador).map(c => c.trim().replace(/^"(.*)"$/, '$1'));
  }

  function importarCSVPlanilha() {
    const arquivo = document.getElementById('input-csv-planilha').files[0];
    const msg = document.getElementById('msg-csv-planilha');
    if (!arquivo) {
      msg.textContent = 'Selecione um arquivo .csv primeiro.';
      msg.className = 'msg err';
      return;
    }
    const leitor = new FileReader();
    leitor.onload = (evento) => {
      try {
        let texto = evento.target.result.replace(/^\uFEFF/, '');
        const linhas = texto.split(/\r?\n/).filter(l => l.trim() !== '');
        if (linhas.length <= 1) throw new Error('arquivo sem dados');

        const delimitador = (linhas[0].split(';').length >= linhas[0].split(',').length) ? ';' : ',';
        let importados = 0;

        linhas.slice(1).forEach(linha => {
          const c = dividirLinhaCSV(linha, delimitador);
          animais.push({
            id: gerarId(),
            brinco: c[0] || '',
            apelido: c[1] || '',
            raca: c[2] || '',
            categoria: c[3] || '',
            sexo: c[4] || '',
            dataNascimento: parseDataFlexivel(c[5] || ''),
            localizacao: c[6] || '',
            dataExameSanitario: parseDataFlexivel(c[7] || ''),
            rb51Data: parseDataFlexivel(c[8] || ''),
            statusReprodutivo: c[9] || '',
            medicacoes: [], coberturas: [], pesagens: [], partos: []
          });
          importados++;
        });

        if (importados === 0) {
          msg.textContent = 'Nenhuma linha de dados encontrada no arquivo.';
          msg.className = 'msg err';
          return;
        }

        if (salvarLista()) {
          msg.textContent = `${importados} animal(is) importado(s) da planilha com sucesso!`;
          msg.className = 'msg ok';
          document.getElementById('input-csv-planilha').value = '';
          mudarAba('animais');
          atualizarTela();
        }
      } catch (erro) {
        msg.textContent = 'Não foi possível ler este arquivo. Confirme que é um .csv válido, exportado do modelo baixado.';
        msg.className = 'msg err';
      }
    };
    leitor.readAsText(arquivo, 'UTF-8');
  }

  function exportarBackup() {
    const blob = new Blob([JSON.stringify(animais, null, 2)], { type: 'application/json' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    const data = new Date().toISOString().slice(0, 10);
    a.href = url;
    a.download = `backup-rebanho-${data}.json`;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }

  function restaurarBackup() {
    const arquivo = document.getElementById('input-restaurar').files[0];
    const msg = document.getElementById('msg-backup');
    if (!arquivo) {
      msg.textContent = 'Selecione um arquivo de backup (.json) primeiro.';
      msg.className = 'msg err';
      return;
    }
    const leitor = new FileReader();
    leitor.onload = (evento) => {
      try {
        const dados = JSON.parse(evento.target.result);
        if (!Array.isArray(dados)) throw new Error('formato inválido');
        dados.forEach(a => { if (!a.id) a.id = gerarId(); });
        if (!confirm(`Isso vai substituir os ${animais.length} animal(is) atual(is) por ${dados.length} do backup. Continuar?`)) return;
        animais = dados;
        if (salvarLista()) {
          msg.textContent = 'Backup restaurado com sucesso!';
          msg.className = 'msg ok';
          atualizarTela();
        }
      } catch (erro) {
        msg.textContent = 'Arquivo inválido. Selecione um backup gerado por este app.';
        msg.className = 'msg err';
      }
    };
    leitor.readAsText(arquivo);
  }

  // ---------- Teclado / acessibilidade ----------
  document.addEventListener('focusin', (evento) => {
    const tag = evento.target.tagName;
    if (['INPUT', 'SELECT', 'TEXTAREA'].includes(tag)) {
      setTimeout(() => { evento.target.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 300);
      setTimeout(() => { evento.target.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 600);
    }
  });

  // Bloqueia o gesto de "puxar para atualizar" do navegador mobile
  let toqueInicialY = 0;
  document.addEventListener('touchstart', (evento) => {
    toqueInicialY = evento.touches[0].clientY;
  }, { passive: true });
  document.addEventListener('touchmove', (evento) => {
    const noTopo = window.scrollY <= 0;
    const puxandoParaBaixo = evento.touches[0].clientY > toqueInicialY;
    if (noTopo && puxandoParaBaixo) {
      evento.preventDefault();
    }
  }, { passive: false });

  // ---------- Busca por voz ----------
  const SpeechRecognitionAPI = window.SpeechRecognition || window.webkitSpeechRecognition;

  function buscarPorVoz() {
    if (!SpeechRecognitionAPI) {
      alert('Busca por voz não é suportada neste navegador. Funciona melhor no Chrome para Android.');
      return;
    }
    const botao = document.getElementById('btn-microfone');
    const reconhecimento = new SpeechRecognitionAPI();
    reconhecimento.lang = 'pt-BR';
    reconhecimento.continuous = false;
    reconhecimento.interimResults = false;

    botao.textContent = '🔴';
    botao.title = 'Ouvindo...';

    reconhecimento.onresult = (evento) => {
      const falado = evento.results[0][0].transcript;
      const somenteNumeros = falado.replace(/\D/g, '');
      const buscaInput = document.getElementById('busca');
      buscaInput.value = somenteNumeros || falado.trim();
      filtrarAnimais();
    };

    reconhecimento.onerror = (evento) => {
      if (evento.error === 'not-allowed' || evento.error === 'permission-denied') {
        alert('Permita o uso do microfone no navegador para usar a busca por voz.');
      } else if (evento.error !== 'no-speech') {
        alert('Não entendi, tenta falar de novo.');
      }
    };

    reconhecimento.onend = () => {
      botao.textContent = '🎤';
      botao.title = 'Falar número do brinco';
    };

    reconhecimento.start();
  }

  // ---------- Inicialização ----------
  carregarAnimais();
  mudarAba('animais');
  atualizarTela();
  renderMedicacoesEdicao();
  renderCoberturasEdicao();
  renderPesagensEdicao();
  renderPartosEdicao();
  atualizarVisibilidadeCamposFemea();
</script>
</body>
</html>
