<!doctype html>
<html lang="es">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
    <meta name="color-scheme" content="light dark" />
    <link rel="icon" href="data:," />
    <title>Presupuesto de Yeraly</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=Fraunces:opsz,wght@9..144,500;9..144,600;9..144,700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
    <style>
      :root {
        --bg: #faf6f0;
        --card: #ffffff;
        --ink: #2e2620;
        --ink-soft: #6f6156;
        --accent: #c96f4a;
        --accent-dark: #a85636;
        --accent-soft: #f7e8df;
        --line: #eadfd2;
        --green: #2e7d4f;
        --green-soft: #e6f3ea;
        --green-line: #bfe0cc;
        --gray-chip: #efe9e2;
        --danger: #b3402e;
        --shadow: 0 1px 3px rgba(90, 60, 35, .07), 0 4px 14px rgba(90, 60, 35, .05);
      }
      @media (prefers-color-scheme: dark) {
        :root {
          --bg: #221b16;
          --card: #2e2620;
          --ink: #f3ece4;
          --ink-soft: #b8a894;
          --accent: #d98a63;
          --accent-dark: #e09a76;
          --accent-soft: #3d2c22;
          --line: #453a30;
          --green: #7cc79b;
          --green-soft: #22352a;
          --green-line: #37594a;
          --gray-chip: #3a3129;
          --danger: #e08a76;
          --shadow: 0 1px 3px rgba(0, 0, 0, .35), 0 4px 14px rgba(0, 0, 0, .25);
        }
      }
      * { box-sizing: border-box; }
      html { -webkit-text-size-adjust: 100%; }
      body {
        margin: 0;
        background: var(--bg);
        color: var(--ink);
        font-family: 'Inter', system-ui, -apple-system, sans-serif;
        font-size: 16px;
        line-height: 1.45;
      }
      .num { font-variant-numeric: tabular-nums; }
      button { font-family: inherit; cursor: pointer; }
      input { font-family: inherit; }

      .wrap { max-width: 660px; margin: 0 auto; padding: 20px 16px 56px; }

      /* ---------- Candado ---------- */
      #lockView {
        min-height: 100dvh;
        display: flex; align-items: center; justify-content: center;
        padding: 24px 16px;
      }
      .lock-card {
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: 20px;
        box-shadow: var(--shadow);
        padding: 36px 28px 30px;
        width: 100%; max-width: 360px;
        text-align: center;
      }
      .lock-emoji { font-size: 44px; line-height: 1; }
      .lock-card h1 {
        font-family: 'Fraunces', Georgia, serif;
        font-size: 28px; font-weight: 600;
        margin: 14px 0 6px;
      }
      .lock-card p { color: var(--ink-soft); margin: 0 0 20px; font-size: 15px; }
      .lock-card input[type="password"] {
        width: 100%;
        padding: 13px 14px;
        font-size: 17px;
        border: 1.5px solid var(--line);
        border-radius: 12px;
        background: var(--bg);
        color: var(--ink);
        text-align: center;
        outline: none;
      }
      .lock-card input[type="password"]:focus { border-color: var(--accent); }
      .lock-error { color: var(--danger); font-size: 14px; min-height: 20px; margin: 10px 0 4px; }
      .btn-primary {
        background: var(--accent);
        color: #fff;
        border: none;
        border-radius: 12px;
        padding: 13px 22px;
        font-size: 16px; font-weight: 600;
        transition: background .15s ease;
      }
      .btn-primary:hover { background: var(--accent-dark); }
      .lock-card .btn-primary { width: 100%; margin-top: 6px; }

      /* ---------- Encabezado ---------- */
      header { text-align: center; margin-bottom: 6px; }
      header h1 {
        font-family: 'Fraunces', Georgia, serif;
        font-size: clamp(28px, 7vw, 36px);
        font-weight: 600;
        margin: 6px 0 14px;
        letter-spacing: .2px;
      }
      .month-nav {
        display: flex; align-items: center; justify-content: center; gap: 14px;
      }
      .month-nav .mname {
        font-family: 'Fraunces', Georgia, serif;
        font-size: 20px; font-weight: 600;
        min-width: 180px; text-align: center;
        text-transform: capitalize;
      }
      .nav-btn {
        width: 40px; height: 40px;
        border-radius: 50%;
        border: 1px solid var(--line);
        background: var(--card);
        color: var(--accent);
        font-size: 16px;
        box-shadow: var(--shadow);
        display: inline-flex; align-items: center; justify-content: center;
      }
      .nav-btn:active { transform: scale(.94); }
      .nav-btn:disabled { opacity: .35; cursor: default; box-shadow: none; }
      .nav-btn:disabled:active { transform: none; }

      .btn-edit {
        display: block;
        width: 100%; max-width: 420px;
        margin: 18px auto 20px;
        background: var(--accent);
        color: #fff;
        border: none;
        border-radius: 14px;
        padding: 14px 22px;
        font-size: 16px; font-weight: 600;
        box-shadow: var(--shadow);
        transition: background .15s ease;
      }
      .btn-edit:hover { background: var(--accent-dark); }
      .btn-edit:disabled { opacity: .6; cursor: default; }

      /* ---------- Resumen ---------- */
      .summary {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 10px;
        margin-bottom: 14px;
      }
      .sum-box {
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: 16px;
        box-shadow: var(--shadow);
        padding: 14px 10px 12px;
        text-align: center;
      }
      .sum-box .label {
        font-size: 11.5px; font-weight: 600;
        letter-spacing: .04em; text-transform: uppercase;
        color: var(--ink-soft);
        margin-bottom: 5px;
      }
      .sum-box .value {
        font-family: 'Fraunces', Georgia, serif;
        font-size: clamp(16px, 4.6vw, 21px);
        font-weight: 600;
        white-space: nowrap;
      }
      .sum-box.sobra .value { color: var(--accent-dark); }
      .sum-box.sobra.neg .value { color: var(--danger); }

      .progress-wrap {
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: 16px;
        box-shadow: var(--shadow);
        padding: 14px 16px;
        margin-bottom: 20px;
      }
      .progress-text { font-size: 14px; color: var(--ink-soft); margin-bottom: 9px; }
      .progress-text strong { color: var(--ink); font-weight: 600; }
      .bar {
        height: 10px; border-radius: 99px;
        background: var(--gray-chip);
        overflow: hidden;
      }
      .bar > div {
        height: 100%; width: 0%;
        background: var(--green);
        border-radius: 99px;
        transition: width .45s ease;
      }

      /* ---------- Tarjetas de gastos ---------- */
      .gasto {
        background: var(--card);
        border: 1.5px solid var(--line);
        border-radius: 16px;
        box-shadow: var(--shadow);
        padding: 15px 16px;
        margin-bottom: 10px;
        display: flex; align-items: center; gap: 12px;
        transition: background .2s ease, border-color .2s ease;
      }
      .gasto.clickable { cursor: pointer; }
      .gasto.clickable:active { transform: scale(.995); }
      .gasto.pagado { background: var(--green-soft); border-color: var(--green-line); }
      .gasto .g-main { flex: 1 1 auto; min-width: 0; }
      .gasto .g-name { font-weight: 600; font-size: 16px; }
      .gasto .g-detalle { font-size: 13px; color: var(--ink-soft); margin-top: 1px; }
      .gasto .g-right { text-align: right; flex: 0 0 auto; }
      .gasto .g-monto {
        font-family: 'Fraunces', Georgia, serif;
        font-size: 19px; font-weight: 600;
        white-space: nowrap;
      }
      .chip {
        display: inline-block;
        margin-top: 5px;
        font-size: 12px; font-weight: 600;
        padding: 3px 10px;
        border-radius: 99px;
        background: var(--gray-chip);
        color: var(--ink-soft);
        white-space: nowrap;
      }
      .chip.pagado { background: var(--green); color: #fff; }
      @media (prefers-color-scheme: dark) {
        .chip.pagado { color: #12241a; }
      }

      .btn-del {
        margin-top: 8px;
        background: none;
        border: 1px solid var(--line);
        color: var(--danger);
        border-radius: 9px;
        padding: 5px 10px;
        font-size: 13px; font-weight: 600;
      }

      /* Campos de edición compactos */
      .edit-input {
        font-variant-numeric: tabular-nums;
        font-size: clamp(14px, 4vw, 17px);
        font-weight: 600;
        color: var(--ink);
        background: var(--accent-soft);
        border: 1.5px solid var(--accent);
        border-radius: 8px;
        padding: 3px 6px;
        text-align: right;
        outline: none;
        max-width: 100%;
      }
      .edit-input.small { font-size: clamp(13px, 3.8vw, 15px); }

      /* ---------- Tarjeta Sueldo Total ---------- */
      .sueldo-card {
        background: var(--card);
        border: 1.5px solid var(--line);
        border-radius: 18px;
        box-shadow: var(--shadow);
        padding: 20px 18px 16px;
        margin-top: 22px;
      }
      .sueldo-card h2 {
        font-family: 'Fraunces', Georgia, serif;
        font-size: 20px; font-weight: 600;
        margin: 0 0 4px;
      }
      .sueldo-big {
        font-family: 'Fraunces', Georgia, serif;
        font-size: clamp(30px, 8vw, 38px);
        font-weight: 700;
        color: var(--accent-dark);
        margin: 2px 0 14px;
      }
      .sueldo-line {
        display: flex; align-items: center; justify-content: space-between; gap: 10px;
        padding: 9px 0;
        border-top: 1px solid var(--line);
        font-size: 15px;
      }
      .sueldo-line .s-label { color: var(--ink-soft); }
      .sueldo-line .s-val { font-weight: 600; white-space: nowrap; }
      .sueldo-line.neto { font-size: 16px; }
      .sueldo-line.neto .s-label { color: var(--ink); font-weight: 600; }
      .sueldo-line.neto .s-val { color: var(--accent-dark); font-size: 18px; }

      /* ---------- Tarjeta Deuda del vehículo ---------- */
      .prestamo-card {
        background: var(--card);
        border: 1.5px solid var(--line);
        border-radius: 18px;
        box-shadow: var(--shadow);
        padding: 20px 18px 16px;
        margin-top: 22px;
      }
      .prestamo-card h2 {
        font-family: 'Fraunces', Georgia, serif;
        font-size: 20px; font-weight: 600;
        margin: 0 0 4px;
      }
      .prestamo-saldo-label {
        font-size: 11.5px; font-weight: 600;
        letter-spacing: .04em; text-transform: uppercase;
        color: var(--ink-soft);
        margin-top: 8px;
      }
      .prestamo-big {
        font-family: 'Fraunces', Georgia, serif;
        font-size: clamp(30px, 8vw, 38px);
        font-weight: 700;
        color: var(--accent-dark);
        margin: 2px 0 14px;
      }
      .prestamo-card .bar { margin: 4px 0 6px; }

      .alcance { display: flex; gap: 8px; flex-wrap: wrap; margin: 8px 0 2px; }
      .alcance .chip-opt {
        border: 1.5px solid var(--line);
        background: var(--card);
        color: var(--ink-soft);
        border-radius: 99px;
        padding: 6px 13px;
        font-size: 13px; font-weight: 600;
      }
      .alcance .chip-opt.sel {
        background: var(--accent);
        border-color: var(--accent);
        color: #fff;
      }

      /* ---------- Estados ---------- */
      .estado {
        text-align: center;
        color: var(--ink-soft);
        padding: 44px 16px;
        font-size: 16px;
      }
      .estado .btn-primary { margin-top: 16px; width: auto; }

      /* ---------- Indicador de guardado ---------- */
      #saveToast {
        position: fixed;
        left: 50%; bottom: 22px;
        transform: translateX(-50%) translateY(16px);
        background: var(--ink);
        color: var(--bg);
        font-size: 14px; font-weight: 600;
        padding: 9px 18px;
        border-radius: 99px;
        opacity: 0; pointer-events: none;
        transition: opacity .25s ease, transform .25s ease;
        z-index: 60;
        white-space: nowrap;
      }
      #saveToast.show { opacity: 1; transform: translateX(-50%) translateY(0); }

      /* ---------- Confirmación de eliminar ---------- */
      #confirmOverlay {
        position: fixed; inset: 0;
        background: rgba(40, 28, 20, .45);
        display: none;
        align-items: center; justify-content: center;
        padding: 20px;
        z-index: 80;
      }
      #confirmOverlay.open { display: flex; }
      .confirm-card {
        background: var(--card);
        border-radius: 18px;
        padding: 24px 22px 20px;
        max-width: 360px; width: 100%;
        box-shadow: var(--shadow);
      }
      .confirm-card p { margin: 0 0 20px; font-size: 16px; line-height: 1.5; }
      .confirm-btns { display: flex; gap: 10px; justify-content: flex-end; }
      .btn-cancel {
        background: var(--gray-chip);
        color: var(--ink);
        border: none; border-radius: 11px;
        padding: 11px 16px; font-size: 15px; font-weight: 600;
      }
      .btn-danger {
        background: var(--danger);
        color: #fff;
        border: none; border-radius: 11px;
        padding: 11px 16px; font-size: 15px; font-weight: 600;
      }

      [hidden] { display: none !important; }
    </style>
  </head>
  <body>

    <!-- Pantalla de bloqueo -->
    <div id="lockView">
      <form class="lock-card" id="lockForm">
        <div class="lock-emoji" aria-hidden="true">🔒</div>
        <h1>Presupuesto</h1>
        <p>Escribe la clave para entrar</p>
        <input type="password" id="claveInput" autocomplete="current-password" aria-label="Clave" />
        <div class="lock-error" id="lockError"></div>
        <button type="submit" class="btn-primary" id="btnEntrar">Entrar</button>
      </form>
    </div>

    <!-- Aplicación -->
    <div id="appView" class="wrap" hidden>
      <header>
        <h1>Presupuesto de Yeraly</h1>
        <div class="month-nav">
          <button class="nav-btn" id="btnPrev" aria-label="Mes anterior">◀</button>
          <div class="mname" id="monthName">—</div>
          <button class="nav-btn" id="btnNext" aria-label="Mes siguiente">▶</button>
        </div>
      </header>

      <button class="btn-edit" id="btnEditTop">Editar</button>

      <div id="mainArea">
        <div class="estado" id="loadingState">Cargando…</div>

        <div id="errorState" class="estado" hidden>
          <div>No se pudieron cargar los datos.</div>
          <button class="btn-primary" id="btnRetry">Reintentar</button>
        </div>

        <div id="content" hidden>
          <section class="summary" aria-label="Resumen del mes">
            <div class="sum-box">
              <div class="label">Sueldo mensual</div>
              <div class="value num" id="sumNeto">—</div>
            </div>
            <div class="sum-box">
              <div class="label">Comprometido</div>
              <div class="value num" id="sumComp">—</div>
            </div>
            <div class="sum-box sobra" id="sobraBox">
              <div class="label">Te sobra</div>
              <div class="value num" id="sumSobra">—</div>
            </div>
          </section>

          <div class="progress-wrap">
            <div class="progress-text" id="progressText">—</div>
            <div class="bar"><div id="progressFill"></div></div>
          </div>

          <div id="gastosList"></div>

          <section class="sueldo-card" aria-label="Sueldo total">
            <h2>Sueldo Total</h2>
            <div class="sueldo-big num" id="sueldoBig">—</div>

            <div class="sueldo-line">
              <span class="s-label">Sueldo bruto</span>
              <span class="s-val num" id="brutoVal">—</span>
              <span id="brutoEdit" hidden>
                <input class="edit-input" id="brutoInput" type="number" inputmode="decimal" min="0" step="any" aria-label="Sueldo bruto" />
              </span>
            </div>
            <div class="alcance" id="alcanceRow" hidden>
              <button type="button" class="chip-opt sel" id="alcPeriodo">Solo este mes</button>
              <button type="button" class="chip-opt" id="alcDesde">Todos los meses desde aquí</button>
            </div>

            <div class="sueldo-line">
              <span class="s-label">AFP</span>
              <span class="s-val num" id="afpVal">—</span>
              <span class="desc-edit" hidden><input class="edit-input small" id="afpInput" type="number" inputmode="decimal" min="0" step="any" aria-label="AFP" /></span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">ARS</span>
              <span class="s-val num" id="arsVal">—</span>
              <span class="desc-edit" hidden><input class="edit-input small" id="arsInput" type="number" inputmode="decimal" min="0" step="any" aria-label="ARS" /></span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">ISR</span>
              <span class="s-val num" id="isrVal">—</span>
              <span class="desc-edit" hidden><input class="edit-input small" id="isrInput" type="number" inputmode="decimal" min="0" step="any" aria-label="ISR" /></span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">Seguro de Vida (INAVI)</span>
              <span class="s-val num" id="inaviVal">—</span>
              <span class="desc-edit" hidden><input class="edit-input small" id="inaviInput" type="number" inputmode="decimal" min="0" step="any" aria-label="Seguro de Vida (INAVI)" /></span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">CMD (Colegio Médico Dominicano)</span>
              <span class="s-val num" id="cmdVal">—</span>
              <span class="desc-edit" hidden><input class="edit-input small" id="cmdInput" type="number" inputmode="decimal" min="0" step="any" aria-label="CMD (Colegio Médico Dominicano)" /></span>
            </div>
            <div class="sueldo-line neto">
              <span class="s-label">Neto del mes</span>
              <span class="s-val num" id="netoVal">—</span>
            </div>
          </section>

          <section class="prestamo-card" id="prestamoCard" aria-label="Deuda del vehículo" hidden>
            <h2>Deuda del vehículo</h2>
            <div class="prestamo-saldo-label">Saldo restante</div>
            <div class="prestamo-big num" id="prestamoSaldo">—</div>

            <div class="sueldo-line">
              <span class="s-label">Total de la deuda</span>
              <span class="s-val num" id="prestamoTotal">—</span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">Aportado</span>
              <span class="s-val num" id="prestamoAportado">—</span>
            </div>
            <div class="bar"><div id="prestamoFill"></div></div>
            <div class="sueldo-line">
              <span class="s-label">Aportado por Santos</span>
              <span class="s-val num" id="prestamoAportSantos">—</span>
            </div>
            <div class="sueldo-line">
              <span class="s-label">Aportado por Yeraly</span>
              <span class="s-val num" id="prestamoAportYeraly">—</span>
            </div>
          </section>

          <button class="btn-edit" id="btnEditBottom" hidden>Listo</button>
        </div>
      </div>
    </div>

    <div id="saveToast" role="status" aria-live="polite"></div>

    <div id="confirmOverlay">
      <div class="confirm-card">
        <p id="confirmText"></p>
        <div class="confirm-btns">
          <button class="btn-cancel" id="btnConfirmCancel">Cancelar</button>
          <button class="btn-danger" id="btnConfirmDelete">Sí, eliminar</button>
        </div>
      </div>
    </div>

    <script>
      (function () {
        'use strict';

        var PUENTE = 'https://script.google.com/macros/s/AKfycbzwYNkM6VkWH-ZINb57nh6NBM2rWuCsjl5v5XFzPTvwKlVFlCN48iShU2osj5IAFVip/exec';
        var CLAVE_KEY = 'py_clave';
        var PERIODO_MAX = '2028-06'; // Junio de 2028: fin de la residencia, último mes navegable
        var MESES = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];

        // ---------- Estado ----------
        var clave = '';
        try { clave = localStorage.getItem(CLAVE_KEY) || ''; } catch (e) { clave = ''; }

        var hoy = new Date();
        var periodo = hoy.getFullYear() + '-' + String(hoy.getMonth() + 1).padStart(2, '0');

        var data = null;          // Respuesta del puente para el mes visible
        var editing = false;
        var sueldoAlcance = 'PERIODO';
        var pendingDelete = null; // concepto a eliminar
        var toastTimer = null;

        // ---------- Elementos ----------
        function el(id) { return document.getElementById(id); }
        var lockView = el('lockView'), appView = el('appView');
        var lockForm = el('lockForm'), claveInput = el('claveInput'), lockError = el('lockError');
        var loadingState = el('loadingState'), errorState = el('errorState'), content = el('content');
        var gastosList = el('gastosList');

        // ---------- Utilidades ----------
        function fmt(n) {
          var v = Number(n) || 0;
          var opts = { maximumFractionDigits: 2 };
          if (Math.abs(v % 1) > 0.000001) opts.minimumFractionDigits = 2;
          return 'RD$' + v.toLocaleString('es-DO', opts);
        }
        function num(v) {
          var n = parseFloat(v);
          return isNaN(n) ? 0 : n;
        }
        function monthLabel(p) {
          var partes = p.split('-');
          return MESES[Number(partes[1]) - 1] + ' ' + partes[0];
        }
        function shiftPeriodo(p, delta) {
          var partes = p.split('-');
          var d = new Date(Number(partes[0]), Number(partes[1]) - 1 + delta, 1);
          return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0');
        }
        function actualizarNav() {
          // Sin límite hacia atrás; hacia adelante, tope en PERIODO_MAX (2028-06)
          el('btnNext').disabled = periodo >= PERIODO_MAX;
        }
        function toast(msg, largo) {
          var t = el('saveToast');
          t.textContent = msg;
          t.classList.add('show');
          if (toastTimer) clearTimeout(toastTimer);
          toastTimer = setTimeout(function () { t.classList.remove('show'); }, largo ? 2600 : 1500);
        }
        function sizeInput(input) {
          var len = String(input.value || '').length;
          input.style.width = Math.max(4, len + 1.5) + 'ch';
        }

        // ---------- Comunicación con el puente ----------
        function manejarClaveInvalida() {
          clave = '';
          try { localStorage.removeItem(CLAVE_KEY); } catch (e) {}
          editing = false;
          data = null;
          appView.hidden = true;
          lockView.hidden = false;
          lockError.textContent = 'Clave incorrecta, intenta de nuevo';
          claveInput.value = '';
          claveInput.focus();
        }

        function leer() {
          var url = PUENTE + '?clave=' + encodeURIComponent(clave) + '&periodo=' + encodeURIComponent(periodo);
          return fetch(url).then(function (r) { return r.json(); }).then(function (j) {
            if (!j || j.ok !== true) {
              if (j && j.error === 'clave') { manejarClaveInvalida(); throw new Error('clave'); }
              throw new Error('lectura');
            }
            return j;
          });
        }

        function enviar(payload) {
          payload.clave = clave;
          return fetch(PUENTE, {
            method: 'POST',
            headers: { 'Content-Type': 'text/plain' },
            body: JSON.stringify(payload)
          }).then(function (r) { return r.json(); }).then(function (j) {
            if (!j || j.ok !== true) {
              if (j && j.error === 'clave') { manejarClaveInvalida(); throw new Error('clave'); }
              throw new Error('escritura');
            }
            return j;
          });
        }

        // ---------- Cálculos ----------
        function montoEfectivo(g) {
          if (data.ajustes && data.ajustes[g.concepto] != null) return Number(data.ajustes[g.concepto]) || 0;
          return Number(g.total) || 0;
        }
        function brutoActual() {
          if (editing) return num(el('brutoInput').value);
          return Number(data.sueldoBruto) || 0;
        }
        function descuentosActuales() {
          if (editing) {
            return { afp: num(el('afpInput').value), ars: num(el('arsInput').value), isr: num(el('isrInput').value), inavi: num(el('inaviInput').value), cmd: num(el('cmdInput').value) };
          }
          var c = data.config || {};
          return { afp: Number(c.DescAFP) || 0, ars: Number(c.DescARS) || 0, isr: Number(c.DescISR) || 0, inavi: Number(c.DescINAVI) || 0, cmd: Number(c.DescCMD) || 0 };
        }
        function netoActual() {
          var d = descuentosActuales();
          return brutoActual() - d.afp - d.ars - d.isr - d.inavi - d.cmd;
        }
        function comprometidoActual() {
          var total = 0;
          data.gastos.forEach(function (g) {
            if (editing) {
              var inp = gastosList.querySelector('input[data-concepto="' + CSS.escape(g.concepto) + '"]');
              total += inp ? num(inp.value) : montoEfectivo(g);
            } else {
              total += montoEfectivo(g);
            }
          });
          return total;
        }
        function pagadoActual() {
          var total = 0;
          data.gastos.forEach(function (g) {
            if (data.pagos && data.pagos[g.concepto] === 'PAGADO') {
              if (editing) {
                var inp = gastosList.querySelector('input[data-concepto="' + CSS.escape(g.concepto) + '"]');
                total += inp ? num(inp.value) : montoEfectivo(g);
              } else {
                total += montoEfectivo(g);
              }
            }
          });
          return total;
        }

        // ---------- Préstamo del carro (compartido) ----------
        function esGastoPrestamo(concepto) {
          var c = String(concepto || '').toLowerCase();
          return c.indexOf('préstamo') !== -1 || c.indexOf('prestamo') !== -1;
        }
        // Aplica (delta > 0) o revierte (delta < 0) el aporte de Yeraly en la tarjeta, al instante
        function aplicarDeltaPrestamo(delta) {
          if (!data || !data.prestamo || !delta) return;
          var p = data.prestamo;
          p.aportadoYeraly = (Number(p.aportadoYeraly) || 0) + delta;
          if (p.aportadoTotal != null) p.aportadoTotal = (Number(p.aportadoTotal) || 0) + delta;
          p.deudaSaldo = Math.max(0, (Number(p.deudaSaldo) || 0) - delta);
        }
        function refreshPrestamo() {
          var card = el('prestamoCard');
          if (!card) return;
          if (!data || !data.prestamo) { card.hidden = true; return; }
          var p = data.prestamo;
          var total = Number(p.deudaTotal) || 0;
          var saldo = Number(p.deudaSaldo) || 0;
          var aportado = total - saldo;
          card.hidden = false;
          el('prestamoSaldo').textContent = fmt(saldo);
          el('prestamoTotal').textContent = fmt(total);
          el('prestamoAportado').textContent = fmt(aportado);
          el('prestamoAportSantos').textContent = fmt(p.aportadoSantos);
          el('prestamoAportYeraly').textContent = fmt(p.aportadoYeraly);
          var pct = total > 0 ? Math.max(0, Math.min(100, (aportado / total) * 100)) : 0;
          el('prestamoFill').style.width = pct + '%';
        }

        // Actualiza solo las cifras (sin re-renderizar, para no perder el foco al editar)
        function refreshCifras() {
          if (!data) return;
          var neto = netoActual();
          var comp = comprometidoActual();
          var pag = pagadoActual();
          el('sumNeto').textContent = fmt(neto);
          el('sumComp').textContent = fmt(comp);
          var sobra = neto - comp;
          el('sumSobra').textContent = fmt(sobra);
          el('sobraBox').classList.toggle('neg', sobra < 0);
          var pct = comp > 0 ? Math.round((pag / comp) * 100) : 0;
          el('progressText').innerHTML = 'Pagado <strong class="num">' + fmt(pag) + '</strong> de <strong class="num">' + fmt(comp) + '</strong> comprometidos (' + pct + '%)';
          el('progressFill').style.width = pct + '%';
          el('sueldoBig').textContent = fmt(brutoActual());
          el('netoVal').textContent = fmt(neto);
          refreshPrestamo();
        }

        // ---------- Render ----------
        function render() {
          el('monthName').textContent = monthLabel(periodo);
          actualizarNav();
          gastosList.innerHTML = '';

          data.gastos.forEach(function (g) {
            var card = document.createElement('div');
            var pagado = data.pagos && data.pagos[g.concepto] === 'PAGADO';
            card.className = 'gasto' + (pagado ? ' pagado' : '') + (editing ? '' : ' clickable');
            card.dataset.concepto = g.concepto;

            var main = document.createElement('div');
            main.className = 'g-main';
            var name = document.createElement('div');
            name.className = 'g-name';
            name.textContent = g.concepto;
            main.appendChild(name);
            if (g.detalle) {
              var det = document.createElement('div');
              det.className = 'g-detalle';
              det.textContent = g.detalle;
              main.appendChild(det);
            }
            if (editing) {
              var del = document.createElement('button');
              del.type = 'button';
              del.className = 'btn-del';
              del.textContent = '🗑 Eliminar';
              del.addEventListener('click', function (ev) {
                ev.stopPropagation();
                pedirEliminar(g.concepto);
              });
              main.appendChild(del);
            }
            card.appendChild(main);

            var right = document.createElement('div');
            right.className = 'g-right';
            if (editing) {
              var inp = document.createElement('input');
              inp.className = 'edit-input';
              inp.type = 'number';
              inp.inputMode = 'decimal';
              inp.min = '0';
              inp.step = 'any';
              inp.value = montoEfectivo(g);
              inp.dataset.concepto = g.concepto;
              inp.setAttribute('aria-label', 'Monto de ' + g.concepto);
              sizeInput(inp);
              inp.addEventListener('input', function () { sizeInput(inp); refreshCifras(); });
              inp.addEventListener('click', function (ev) { ev.stopPropagation(); });
              right.appendChild(inp);
            } else {
              var monto = document.createElement('div');
              monto.className = 'g-monto num';
              monto.textContent = fmt(montoEfectivo(g));
              right.appendChild(monto);
              var chip = document.createElement('span');
              chip.className = 'chip' + (pagado ? ' pagado' : '');
              chip.textContent = pagado ? '✓ Pagado' : 'Pendiente';
              right.appendChild(chip);
              card.addEventListener('click', function () { alternarPago(g.concepto); });
            }
            card.appendChild(right);
            gastosList.appendChild(card);
          });

          // Tarjeta de sueldo
          var c = data.config || {};
          el('brutoVal').textContent = fmt(data.sueldoBruto);
          el('afpVal').textContent = '−' + fmt(c.DescAFP);
          el('arsVal').textContent = '−' + fmt(c.DescARS);
          el('isrVal').textContent = '−' + fmt(c.DescISR);
          el('inaviVal').textContent = '−' + fmt(c.DescINAVI);
          el('cmdVal').textContent = '−' + fmt(c.DescCMD);

          el('brutoVal').hidden = editing;
          el('brutoEdit').hidden = !editing;
          el('alcanceRow').hidden = !editing;
          var descEdits = document.querySelectorAll('.desc-edit');
          var descVals = [el('afpVal'), el('arsVal'), el('isrVal'), el('inaviVal'), el('cmdVal')];
          descEdits.forEach(function (s, i) {
            s.hidden = !editing;
            descVals[i].hidden = editing;
          });

          if (editing) {
            el('brutoInput').value = Number(data.sueldoBruto) || 0;
            el('afpInput').value = Number(c.DescAFP) || 0;
            el('arsInput').value = Number(c.DescARS) || 0;
            el('isrInput').value = Number(c.DescISR) || 0;
            el('inaviInput').value = Number(c.DescINAVI) || 0;
            el('cmdInput').value = Number(c.DescCMD) || 0;
            [el('brutoInput'), el('afpInput'), el('arsInput'), el('isrInput'), el('inaviInput'), el('cmdInput')].forEach(sizeInput);
            sueldoAlcance = 'PERIODO';
            el('alcPeriodo').classList.add('sel');
            el('alcDesde').classList.remove('sel');
          }

          el('btnEditTop').textContent = editing ? 'Listo' : 'Editar';
          el('btnEditBottom').hidden = !editing;

          refreshCifras();
        }

        // ---------- Carga ----------
        function cargar() {
          loadingState.hidden = false;
          errorState.hidden = true;
          content.hidden = true;
          el('monthName').textContent = monthLabel(periodo);
          actualizarNav();
          leer().then(function (j) {
            data = j;
            if (!data.gastos) data.gastos = [];
            if (!data.pagos) data.pagos = {};
            if (!data.ajustes) data.ajustes = {};
            if (!data.config) data.config = {};
            loadingState.hidden = true;
            content.hidden = false;
            render();
          }).catch(function (err) {
            if (err && err.message === 'clave') return; // ya volvió al candado
            loadingState.hidden = true;
            errorState.hidden = false;
          });
        }

        // ---------- Pagos ----------
        function alternarPago(concepto) {
          if (editing || !data) return;
          var actual = data.pagos[concepto] === 'PAGADO' ? 'PAGADO' : 'PENDIENTE';
          var nuevo = actual === 'PAGADO' ? 'PENDIENTE' : 'PAGADO';
          // Si es el abono al préstamo del carro, su monto entra o sale de la deuda al instante
          var deltaPrestamo = 0;
          if (esGastoPrestamo(concepto) && data.prestamo) {
            var gPrestamo = null;
            data.gastos.forEach(function (x) { if (x.concepto === concepto) gPrestamo = x; });
            if (gPrestamo) {
              var montoPrestamo = montoEfectivo(gPrestamo);
              deltaPrestamo = nuevo === 'PAGADO' ? montoPrestamo : -montoPrestamo;
            }
          }
          data.pagos[concepto] = nuevo;
          if (deltaPrestamo) aplicarDeltaPrestamo(deltaPrestamo);
          render();
          toast('Guardando…', true);
          enviar({ action: 'setPago', periodo: periodo, concepto: concepto, estado: nuevo })
            .then(function () { toast('✓ Guardado'); })
            .catch(function (err) {
              if (err && err.message === 'clave') return;
              data.pagos[concepto] = actual;
              if (deltaPrestamo) aplicarDeltaPrestamo(-deltaPrestamo);
              render();
              toast('No se pudo guardar');
            });
        }

        // ---------- Modo edición ----------
        function entrarEdicion() {
          editing = true;
          render();
          window.scrollTo({ top: 0, behavior: 'smooth' });
        }

        function salirEdicion() {
          var promesas = [];

          // Ajustes de gastos del mes
          var inputs = gastosList.querySelectorAll('input[data-concepto]');
          inputs.forEach(function (inp) {
            var concepto = inp.dataset.concepto;
            var g = null;
            data.gastos.forEach(function (x) { if (x.concepto === concepto) g = x; });
            if (!g) return;
            var nuevo = num(inp.value);
            var efectivoAntes = montoEfectivo(g);
            if (nuevo !== efectivoAntes) {
              var montoEnviar = (nuevo === (Number(g.total) || 0)) ? null : nuevo;
              promesas.push(enviar({ action: 'setAjuste', periodo: periodo, concepto: concepto, monto: montoEnviar })
                .then(function () {
                  if (montoEnviar === null) delete data.ajustes[concepto];
                  else data.ajustes[concepto] = montoEnviar;
                }));
            }
          });

          // Sueldo bruto
          var brutoNuevo = num(el('brutoInput').value);
          if (brutoNuevo !== (Number(data.sueldoBruto) || 0)) {
            promesas.push(enviar({ action: 'setSueldo', periodo: periodo, alcance: sueldoAlcance, monto: brutoNuevo })
              .then(function () { data.sueldoBruto = brutoNuevo; }));
          }

          // Descuentos
          var c = data.config || {};
          var afp = num(el('afpInput').value), ars = num(el('arsInput').value), isr = num(el('isrInput').value);
          var inavi = num(el('inaviInput').value), cmd = num(el('cmdInput').value);
          if (afp !== (Number(c.DescAFP) || 0) || ars !== (Number(c.DescARS) || 0) || isr !== (Number(c.DescISR) || 0) || inavi !== (Number(c.DescINAVI) || 0) || cmd !== (Number(c.DescCMD) || 0)) {
            promesas.push(enviar({ action: 'setDescuentos', afp: afp, ars: ars, isr: isr, inavi: inavi, cmd: cmd })
              .then(function () {
                data.config.DescAFP = afp;
                data.config.DescARS = ars;
                data.config.DescISR = isr;
                data.config.DescINAVI = inavi;
                data.config.DescCMD = cmd;
              }));
          }

          function terminar() {
            editing = false;
            render();
          }
          if (promesas.length) {
            toast('Guardando…', true);
            Promise.all(promesas).then(function () {
              terminar();
              toast('✓ Guardado');
            }).catch(function (err) {
              if (err && err.message === 'clave') return;
              terminar();
              toast('Algunos cambios no se guardaron');
            });
          } else {
            terminar();
          }
        }

        function toggleEdicion() {
          if (!data) return;
          if (editing) salirEdicion(); else entrarEdicion();
        }

        // ---------- Eliminar gasto ----------
        function pedirEliminar(concepto) {
          pendingDelete = concepto;
          el('confirmText').textContent = '¿Eliminar «' + concepto + '» para siempre? Se borra de todos los meses y no se puede deshacer.';
          el('confirmOverlay').classList.add('open');
        }
        function cerrarConfirm() {
          pendingDelete = null;
          el('confirmOverlay').classList.remove('open');
        }
        el('btnConfirmCancel').addEventListener('click', cerrarConfirm);
        el('confirmOverlay').addEventListener('click', function (ev) {
          if (ev.target === el('confirmOverlay')) cerrarConfirm();
        });
        el('btnConfirmDelete').addEventListener('click', function () {
          var concepto = pendingDelete;
          if (!concepto) return;
          cerrarConfirm();
          toast('Guardando…', true);
          enviar({ action: 'eliminarGasto', concepto: concepto }).then(function () {
            data.gastos = data.gastos.filter(function (g) { return g.concepto !== concepto; });
            delete data.pagos[concepto];
            delete data.ajustes[concepto];
            var card = gastosList.querySelector('.gasto[data-concepto="' + CSS.escape(concepto) + '"]');
            if (card) card.remove();
            refreshCifras();
            toast('✓ Guardado');
          }).catch(function (err) {
            if (err && err.message === 'clave') return;
            toast('No se pudo eliminar');
          });
        });

        // ---------- Eventos ----------
        lockForm.addEventListener('submit', function (ev) {
          ev.preventDefault();
          var escrita = claveInput.value.trim();
          if (!escrita) return;
          clave = escrita;
          lockError.textContent = '';
          el('btnEntrar').disabled = true;
          leer().then(function (j) {
            try { localStorage.setItem(CLAVE_KEY, clave); } catch (e) {}
            data = j;
            if (!data.gastos) data.gastos = [];
            if (!data.pagos) data.pagos = {};
            if (!data.ajustes) data.ajustes = {};
            if (!data.config) data.config = {};
            lockView.hidden = true;
            appView.hidden = false;
            loadingState.hidden = true;
            errorState.hidden = true;
            content.hidden = false;
            render();
          }).catch(function (err) {
            if (!(err && err.message === 'clave')) {
              lockError.textContent = 'No se pudo conectar, intenta de nuevo';
            }
          }).then(function () {
            el('btnEntrar').disabled = false;
          });
        });

        el('btnPrev').addEventListener('click', function () {
          if (editing) return;
          periodo = shiftPeriodo(periodo, -1);
          cargar();
        });
        el('btnNext').addEventListener('click', function () {
          if (editing) return;
          if (periodo >= PERIODO_MAX) return; // No avanzar más allá de junio de 2028
          periodo = shiftPeriodo(periodo, 1);
          if (periodo > PERIODO_MAX) periodo = PERIODO_MAX;
          cargar();
        });
        el('btnRetry').addEventListener('click', cargar);
        el('btnEditTop').addEventListener('click', toggleEdicion);
        el('btnEditBottom').addEventListener('click', toggleEdicion);

        el('alcPeriodo').addEventListener('click', function () {
          sueldoAlcance = 'PERIODO';
          el('alcPeriodo').classList.add('sel');
          el('alcDesde').classList.remove('sel');
        });
        el('alcDesde').addEventListener('click', function () {
          sueldoAlcance = 'DESDE';
          el('alcDesde').classList.add('sel');
          el('alcPeriodo').classList.remove('sel');
        });

        [el('brutoInput'), el('afpInput'), el('arsInput'), el('isrInput'), el('inaviInput'), el('cmdInput')].forEach(function (inp) {
          inp.addEventListener('input', function () { sizeInput(inp); refreshCifras(); });
        });

        // ---------- Arranque ----------
        if (clave) {
          lockView.hidden = true;
          appView.hidden = false;
          cargar();
        } else {
          claveInput.focus();
        }
      })();
    </script>
  </body>
</html>
