// fop-tax.jsx — Єдиний податок ФОП (3 група, 5%, неплатник ПДВ). Квартальний розрахунок
// наростаючим підсумком за рік + 1% військового збору. ЄСВ не сплачується (директор ТОВ,
// ті самі КВЕД). Дохід — з оплачених віх ФОП-договорів (execEntity=fop). Лише розрахунок.

const FOP_EP_RATE = 0.05;   // 3 група, неплатник ПДВ
const FOP_VZ_RATE = 0.01;   // військовий збір для ФОП ЄП (з 2025)
window.FOP_EP_RATE = FOP_EP_RATE; window.FOP_VZ_RATE = FOP_VZ_RATE;

// Демо-надходження на рахунок ФОП за 2026 (на бекенді — з оплачених віх ФОП-договорів).
// Поточна системна дата — 29.05.2026: Q1 закритий, Q2 у процесі.
const FOP_RECEIPTS_2026 = [
  { date: "2026-02-18", amount: 117063.85, basis: "Договір 01/2026 · їдальня О-1 (в/ч 3014) — оплата за актом" },
  { date: "2026-05-12", amount: 64000.00,  basis: "Договір 03/2026 · авторський нагляд — виїзди квітень" },
];
window.FOP_RECEIPTS = FOP_RECEIPTS_2026;

// Дохід ФОП по кварталах: оплачені віхи fop-договорів + демо-надходження
window.fopIncomeByQuarter = function (year) {
  const y = String(year);
  const q = [0, 0, 0, 0];
  const add = (iso, amt) => { if (!iso || !iso.startsWith(y)) return; const m = +iso.slice(5, 7); q[Math.floor((m - 1) / 3)] += amt; };
  (window.DATA.CONTRACTS || []).forEach(c => {
    if (c.execEntity !== "fop") return;
    (c.schedule || []).forEach(s => { if (s.paidDate) add(s.paidDate, s.amount || 0); });
  });
  // + надходження з оплачених траншів ФОП-проєктів (грантова/проєктна діяльність ГО)
  (window.DATA.PROJECTS || []).forEach(p => {
    if (p.execEntity !== "fop") return;
    ((p.contract && p.contract.schedule) || []).forEach(s => { if (s.paidDate) add(s.paidDate, s.amount || 0); });
  });
  FOP_RECEIPTS_2026.forEach(r => add(r.date, r.amount));
  return q;
};

// Строки: декларація — 40 к.дн. після кінця кварталу; оплата — +10 к.дн.
function quarterEnd(year, qi) { return [`${year}-03-31`, `${year}-06-30`, `${year}-09-30`, `${year}-12-31`][qi]; }
function addDays(iso, n) { const d = new Date(iso + "T00:00:00"); d.setDate(d.getDate() + n); return d.toISOString().slice(0, 10); }

function FopTaxPage({ role }) {
  window.useTabel && window.useTabel(); // ререндер якщо змінились договори
  const year = 2026;
  const SYS = window.SYS_DATE || "2026-05-29";
  const m = window.formatMoney;
  const inc = window.fopIncomeByQuarter(year);

  const rows = inc.map((income, i) => {
    const ep = Math.round(income * FOP_EP_RATE * 100) / 100;
    const vz = Math.round(income * FOP_VZ_RATE * 100) / 100;
    const qEnd = quarterEnd(year, i);
    const declDue = addDays(qEnd, 40);
    const payDue = addDays(declDue, 10);
    let status;
    if (SYS <= qEnd) status = income > 0 ? "current" : "future";
    else if (SYS <= payDue) status = "due";
    else status = "paid";
    return { i, income, ep, vz, total: ep + vz, qEnd, declDue, payDue, status };
  });

  // наростаючим підсумком (для декларації)
  let cum = 0; const cumRows = rows.map(r => { cum += r.income; return cum; });
  const totalIncome = inc.reduce((s, x) => s + x, 0);
  const totalEp = Math.round(totalIncome * FOP_EP_RATE * 100) / 100;
  const totalVz = Math.round(totalIncome * FOP_VZ_RATE * 100) / 100;

  // Надходження на рахунок ФОП за рік: демо-надходження + оплачені транші ФОП-проєктів ГО
  const projReceipts = [];
  (window.DATA.PROJECTS || []).forEach(p => {
    if (p.execEntity !== "fop") return;
    ((p.contract && p.contract.schedule) || []).forEach(s => {
      if (s.paidDate && s.paidDate.startsWith(String(year)))
        projReceipts.push({ date: s.paidDate, amount: s.amount || 0, basis: `Проєкт ${p.number} · ${p.name} — ${s.stage}` });
    });
  });
  const allReceipts = [...FOP_RECEIPTS_2026, ...projReceipts].sort((a, b) => a.date.localeCompare(b.date));

  // поточний квартал
  const curIdx = rows.findIndex(r => r.status === "current" || r.status === "due");
  const cur = curIdx >= 0 ? rows[curIdx] : rows[rows.length - 1];

  const QN = ["I квартал", "II квартал", "III квартал", "IV квартал"];
  const ST = {
    paid:    { label: "Сплачено",    tone: "live" },
    due:     { label: "До сплати",   tone: "amber" },
    current: { label: "Поточний",    tone: "blue" },
    future:  { label: "Майбутній",   tone: "neutral" },
  };

  return (
    <div className="page">
      <div className="page-head">
        <h1 className="page-h1">Єдиний податок · ФОП</h1>
        <div className="page-sub">
          <span>ФОП Підкапка М.І. · 3 група · 5%</span>
          <span className="dot"></span>
          <span>неплатник ПДВ</span>
          <span className="dot"></span>
          <span>декларація наростаючим за {year}</span>
        </div>
      </div>

      <div className="kpi-row" style={{ gridTemplateColumns: "repeat(4, 1fr)" }}>
        <div className="kpi">
          <div className="kpi-label">Дохід · {QN[cur.i]}</div>
          <div className="kpi-value">{m(cur.income)} <span style={{ fontSize: 15, color: "var(--ink-3)" }}>₴</span></div>
          <div className="kpi-sub">надходження на рахунок</div>
        </div>
        <div className="kpi">
          <div className="kpi-label">Єдиний податок 5%</div>
          <div className="kpi-value">{m(cur.ep)} <span style={{ fontSize: 15, color: "var(--ink-3)" }}>₴</span></div>
          <div className="kpi-sub">за {QN[cur.i].toLowerCase()}</div>
        </div>
        <div className="kpi">
          <div className="kpi-label">Військовий збір 1%</div>
          <div className="kpi-value">{m(cur.vz)} <span style={{ fontSize: 15, color: "var(--ink-3)" }}>₴</span></div>
          <div className="kpi-sub">за {QN[cur.i].toLowerCase()}</div>
        </div>
        <div className="kpi">
          <div className="kpi-label">Разом до сплати</div>
          <div className="kpi-value" style={{ color: "var(--accent-ink)" }}>{m(cur.total)} <span style={{ fontSize: 15, color: "var(--ink-3)" }}>₴</span></div>
          <div className="kpi-sub">строк: {window.formatDate(cur.payDue)}</div>
        </div>
      </div>

      {/* Найближчі строки */}
      <div className="vat-alerts" style={{ marginTop: 22 }}>
        <div className="vat-alert tone-amber">
          <span className="vat-alert-ic"><window.Ico name="calendar" /></span>
          <div className="vat-alert-text">
            <div className="vat-alert-title">{QN[cur.i]} {year}: подати декларацію до {window.formatDate(cur.declDue)}, сплатити до {window.formatDate(cur.payDue)}</div>
            <div className="vat-alert-sub">Декларація платника єдиного податку — ФО-П подається наростаючим підсумком (за {year} рік). Подача — через Електронний кабінет ДПС (поза ERP).</div>
          </div>
        </div>
      </div>

      {/* Поквартальна таблиця */}
      <table className="data-table" style={{ marginTop: 22 }}>
        <thead>
          <tr>
            <th>Період</th>
            <th className="num-col">Дохід за квартал</th>
            <th className="num-col">Наростаючим</th>
            <th className="num-col">ЄП 5%</th>
            <th className="num-col">ВЗ 1%</th>
            <th className="num-col">Разом</th>
            <th>Декларація до</th>
            <th>Сплата до</th>
            <th>Статус</th>
          </tr>
        </thead>
        <tbody>
          {rows.map((r, idx) => (
            <tr key={r.i}>
              <td><b>{QN[r.i]}</b></td>
              <td className="num-col">{m(r.income)}</td>
              <td className="num-col" style={{ color: "var(--ink-3)" }}>{m(cumRows[idx])}</td>
              <td className="num-col">{m(r.ep)}</td>
              <td className="num-col">{m(r.vz)}</td>
              <td className="num-col num-bold">{m(r.total)}</td>
              <td className="td-mono" style={{ fontSize: 12, color: "var(--ink-2)" }}>{window.formatDate(r.declDue)}</td>
              <td className="td-mono" style={{ fontSize: 12, color: "var(--ink-2)" }}>{window.formatDate(r.payDue)}</td>
              <td><span className={`status-tag tone-${ST[r.status].tone}`}>{ST[r.status].label}</span></td>
            </tr>
          ))}
        </tbody>
        <tfoot>
          <tr>
            <td><b>За {year} рік</b></td>
            <td className="num-col"><b>{m(totalIncome)}</b></td>
            <td className="num-col"></td>
            <td className="num-col"><b>{m(totalEp)}</b></td>
            <td className="num-col"><b>{m(totalVz)}</b></td>
            <td className="num-col"><b>{m(totalEp + totalVz)}</b></td>
            <td colSpan={3}></td>
          </tr>
        </tfoot>
      </table>

      {/* Джерело доходу */}
      <section className="section" style={{ marginTop: 26 }}>
        <div className="section-head">
          <h2 className="section-h2">Надходження на рахунок · {year}</h2>
          <span className="section-sub">з оплачених ФОП-договорів</span>
        </div>
        <table className="data-table">
          <thead><tr><th>Дата</th><th>Підстава</th><th className="num-col">Сума</th></tr></thead>
          <tbody>
            {allReceipts.map((r, i) => (
              <tr key={i}>
                <td className="td-mono" style={{ fontSize: 12.5 }}>{window.formatDate(r.date)}</td>
                <td style={{ fontSize: 13 }}>{r.basis}</td>
                <td className="num-col num-bold">{m(r.amount)} ₴</td>
              </tr>
            ))}
          </tbody>
        </table>
      </section>

      <div className="hint-box" style={{ marginTop: 18 }}>
        <b>Як рахується.</b> 3 група єдиного податку: <b>5%</b> від доходу (надходжень на рахунок) + <b>1%</b> військового збору.
        <b> ЄСВ не нараховується</b> — ФОП є водночас директором ТОВ за тими ж КВЕД (звільнення від сплати «за себе»).
        Декларація — квартальна, наростаючим підсумком за рік; подача через Електронний кабінет ДПС (поза ERP).
        На бекенді дохід підтягується з оплачених віх графіка ФОП-договорів.
      </div>
    </div>
  );
}

window.FopTaxPage = FopTaxPage;
