// Helm — 提前還款試算。選一筆貸款(房貸/車貸/信貸,自動帶餘額/利率/月付)→ 每月多還 or 一次多還
//   → 省多少利息、早幾年還完。本息攤還公式。誠實提醒:低利率時投資常比提前還划算;分期/附加率不退息。
//   純前端,接 Helm 負債。欄位記憶 localStorage helm-prepay-*。
(function () {
  const NS = window.HelmDesignSystem_9613a7;
  const { Field, Input } = NS;
  function fmt(n) { return Math.round(n || 0).toLocaleString("en-US"); }
  function wan(n) { return (Math.round((n || 0) / 1e4)).toLocaleString("en-US"); }
  function num(v) { return parseFloat(String(v).replace(/,/g, "")) || 0; }
  function lsGet(k) { return window.HelmPrefs ? window.HelmPrefs.get(k) : (function () { try { return localStorage.getItem(k); } catch (e) { return null; } })(); }
  function lsSet(k, v) { if (window.HelmPrefs) window.HelmPrefs.set(k, v); else { try { localStorage.setItem(k, v); } catch (e) {} } }
  function lsDel(k) { if (window.HelmPrefs) window.HelmPrefs.del(k); else { try { localStorage.removeItem(k); } catch (e) {} } }
  function ym(months) { if (!isFinite(months) || months <= 0) return "0 月"; var m = Math.round(months); var y = Math.floor(m / 12); var mm = m % 12; return (y > 0 ? y + " 年 " : "") + mm + " 月"; }
  // 本息攤還:還清所需月數
  function payoffMonths(bal, annualRate, pay) {
    if (bal <= 0) return 0;
    var r = annualRate / 100 / 12;
    if (r <= 0) return pay > 0 ? bal / pay : Infinity;
    if (pay <= bal * r) return Infinity;     // 月付連利息都不夠 → 永遠還不完
    return -Math.log(1 - bal * r / pay) / Math.log(1 + r);
  }

  const K = { sel: "helm-prepay-sel", bal: "helm-prepay-bal", rate: "helm-prepay-rate", pay: "helm-prepay-pay", extra: "helm-prepay-extra", lump: "helm-prepay-lump" };

  function PrepayScreen({ onClose }) {
    const H = window.HELM || {};
    var loans = (H.liabilities || []).filter(function (l) { return (l.loanPay || 0) > 0; })
      .map(function (l) { return { name: l.cat || l.name || "貸款", bal: l.twd || 0, rate: l.loanRate || 0, pay: l.loanPay || 0 }; });
    if (loans.length === 0) loans = [{ name: "自訂貸款", bal: 0, rate: 2, pay: 0 }];

    const initSel = Math.min(loans.length - 1, Math.max(0, parseInt(lsGet(K.sel) || "0", 10) || 0));
    const [sel, setSel] = React.useState(initSel);
    const [bal, setBal] = React.useState(function () { return lsGet(K.bal) || String(Math.round(loans[initSel].bal)); });
    const [rate, setRate] = React.useState(function () { return lsGet(K.rate) || String(loans[initSel].rate); });
    const [pay, setPay] = React.useState(function () { return lsGet(K.pay) || String(Math.round(loans[initSel].pay)); });
    const [extra, setExtra] = React.useState(function () { return lsGet(K.extra) || "0"; });
    const [lump, setLump] = React.useState(function () { return lsGet(K.lump) || "0"; });

    function pickLoan(i) { const L = loans[i]; setSel(i); lsSet(K.sel, String(i)); var b = String(Math.round(L.bal)), rr = String(L.rate), pp = String(Math.round(L.pay)); setBal(b); lsSet(K.bal, b); setRate(rr); lsSet(K.rate, rr); setPay(pp); lsSet(K.pay, pp); }
    function persist(setter, key) { return function (e) { const v = e.target.value; setter(v); lsSet(key, v); }; }
    function resetAll() { Object.keys(K).forEach(function (k) { lsDel(K[k]); }); pickLoan(0); setExtra("0"); setLump("0"); }

    const B = num(bal), R = num(rate), P = num(pay), E = num(extra), L = num(lump);
    const n0 = payoffMonths(B, R, P);
    const interest0 = isFinite(n0) ? P * n0 - B : Infinity;
    const B1 = Math.max(0, B - L), P1 = P + E;
    const n1 = payoffMonths(B1, R, P1);
    const interest1 = isFinite(n1) ? P1 * n1 - B1 : Infinity;
    const saved = (isFinite(interest0) && isFinite(interest1)) ? Math.max(0, interest0 - interest1) : 0;
    const monthsSaved = (isFinite(n0) && isFinite(n1)) ? Math.max(0, n0 - n1) : 0;
    const hasPrepay = E > 0 || L > 0;
    const isAddOn = R <= 0;   // 車貸分期/附加率(本工具以 0 利率代入)

    // 誠實建議
    let adviceCls = "fx-advice--mid", adviceTag = "💡 提前還款", adviceTxt = "";
    if (isAddOn) {
      adviceCls = "fx-advice--mid"; adviceTag = "⚠️ 這筆別急著還";
      adviceTxt = "這筆利率帶 0(分期/附加利率),利息在借的時候就一次算進去了,提前還通常『不退息』——省不到利息。手頭的錢留著或拿去還有利息的貸款、或投資更有用。";
    } else if (!hasPrepay) {
      adviceTxt = "在下面填『每月多還』或『一次多還』,看能省多少利息、早多久還完。";
    } else if (R < 3) {
      adviceCls = "fx-advice--mid"; adviceTag = "💡 划算嗎?其實見仁見智";
      adviceTxt = "你這筆利率 " + R + "% 偏低。把多的錢拿去投資(長期預期 5%+)通常比提前還賺更多;提前還的好處是『確定、無風險的省息』+ 無債一身輕。想穩、想睡得安穩就還;想最大化資產就投資。";
    } else if (R < 5) {
      adviceCls = "fx-advice--mid"; adviceTag = "💡 中間地帶";
      adviceTxt = "利率 " + R + "% 不高不低。提前還是『確定省息』,投資是『期望較高但不確定』。看你偏好。";
    } else {
      adviceCls = "fx-advice--low"; adviceTag = "💡 優先還這筆";
      adviceTxt = "利率 " + R + "% 不低,提前還幾乎是穩賺(等於無風險賺 " + R + "%),建議優先清掉。";
    }

    return (
      <div className="fpage" role="dialog" aria-modal="true" aria-label="提前還款試算">
        <div className="fpage__panel">
          <header className="fpage__bar">
            <button className="fpage__cancel" onClick={onClose}><i className="ph ph-arrow-left" aria-hidden="true" />返回</button>
            <span className="fpage__title">提前還款試算</span>
            <span aria-hidden="true" />
          </header>
          <div className="fpage__scroll">
            <div className="fpage__body">

              {loans.length > 1 && (
                <div className="fire-seg" role="tablist">
                  {loans.map(function (l, i) {
                    return <button key={i} type="button" role="tab" aria-selected={sel === i} className={"fire-seg__btn" + (sel === i ? " is-on" : "")} onClick={function () { pickLoan(i); }}>{l.name}</button>;
                  })}
                </div>
              )}

              <section className="fpage__card">
                <div className="fpage__card-head"><span className="t-overline">{loans[sel] ? loans[sel].name : "貸款"} · 提前還款</span></div>
                <div className="fx-now"><span className="fx-now__unit">{hasPrepay && !isAddOn ? "省下利息約" : "目前總利息約"}</span><span className="fx-now__rate t-num">{fmt(hasPrepay && !isAddOn ? saved : interest0)}</span></div>
                {hasPrepay && !isAddOn && monthsSaved > 0 && <div className="goal__nums"><span className="t-num">早還 {ym(monthsSaved)}</span><span className="goal__pct t-num">本來 {ym(n0)} → {ym(n1)}</span></div>}

                <div className="tax-break">
                  <div className="tax-row"><span>目前:還清還要</span><span className="t-num">{ym(n0)}</span></div>
                  <div className="tax-row"><span>目前:剩餘總利息</span><span className="t-num">{isFinite(interest0) ? fmt(interest0) : "—"}</span></div>
                  {hasPrepay && (<div className="tax-row"><span>提前還後:還清還要</span><span className="t-num">{ym(n1)}</span></div>)}
                  {hasPrepay && (<div className="tax-row"><span>提前還後:剩餘總利息</span><span className="t-num">{isFinite(interest1) ? fmt(interest1) : "—"}</span></div>)}
                  {hasPrepay && !isAddOn && (<div className="tax-row tax-row--sum"><span>= 省下利息</span><span className="t-num">{fmt(saved)}</span></div>)}
                </div>

                <div className={"fx-advice " + adviceCls}>
                  {adviceTag && <span className="fx-advice__tag">{adviceTag}</span>}
                  <span className="fx-advice__txt">{adviceTxt}</span>
                </div>
              </section>

              <section className="fpage__card">
                <div className="fpage__card-head"><span className="t-overline">這筆貸款(自動帶入,改過會記住)</span></div>
                <div className="fpage__fields">
                  <Field label="貸款餘額" hint="預設帶你目前剩餘本金(切換貸款會更新)">
                    <Input amount affix="NT$" inputMode="decimal" value={fmt(B)} onChange={persist(setBal, K.bal)} />
                  </Field>
                  <Field label="年利率(%)" hint="車貸是分期/附加率的話填 0(利息已內含)">
                    <Input inputMode="decimal" value={rate} onChange={persist(setRate, K.rate)} />
                  </Field>
                  <Field label="目前每月還款" hint="本息月付金">
                    <Input amount affix="NT$" inputMode="decimal" value={fmt(P)} onChange={persist(setPay, K.pay)} />
                  </Field>
                </div>
              </section>

              <section className="fpage__card">
                <div className="fpage__card-head"><span className="t-overline">提前還款(改過會記住)</span></div>
                <div className="fpage__fields">
                  <Field label="每月多還" hint="每月在月付之外多繳的錢">
                    <Input amount affix="NT$" inputMode="decimal" value={fmt(E)} onChange={persist(setExtra, K.extra)} />
                  </Field>
                  <Field label="一次多還" hint="現在一次拿一筆出來還本金(例如年終獎金)">
                    <Input amount affix="NT$" inputMode="decimal" value={fmt(L)} onChange={persist(setLump, K.lump)} />
                  </Field>
                </div>
                <button type="button" className="fire-reset" onClick={resetAll}><i className="ph ph-arrow-counter-clockwise" aria-hidden="true" /> 回復預設值</button>
              </section>

              <p className="fx-disclaim">本息平均攤還估算,假設提前還款採「縮短年限、月付不變」(最省利息)。⚠️注意:有些房貸<b>前 1–3 年提前還款有違約金</b>,還之前先查合約。車貸/分期屬附加利率、利息已內含,提前還通常不退息。<b>「省下利息」是未來逐年累積的名目金額,換算成今天的購買力會少一些</b>(但那確實是你不用付的錢)。當方向參考。</p>
            </div>
          </div>
        </div>
      </div>
    );
  }

  window.PrepayScreen = PrepayScreen;
})();
