/* ============================================================
   IMTRACK — Cash Call Planner (DD255)
   Standalone module + reuseable in AC Log Cash Call tab.
   Rolling 4-quarter cash flow forecast grid + period reassign (C2).
   ============================================================ */
(function () {
  var E = window.IMTRACK_ENGINE;
  var { useState, useMemo } = React;

  function cashCallQuarters(cfg) {
    var windowMonths = (cfg && cfg.cashCallWindowMonths) || 3;
    var today = E.TODAY || new Date();
    var currentQ = Math.floor(today.getMonth() / 3) * 3;
    var periods = [];
    for (var i = -1; i <= 2; i++) {
      var qStartMonth = currentQ + i * windowMonths;
      var qStartDate = new Date(today.getFullYear(), qStartMonth, 1);
      if (qStartMonth < 0) { qStartDate = new Date(today.getFullYear() - 1, 12 + qStartMonth, 1); }
      if (qStartMonth > 11) { qStartDate = new Date(today.getFullYear() + 1, qStartMonth - 12, 1); }
      var y = String(qStartDate.getFullYear());
      var m = String(qStartDate.getMonth() + 1).padStart(2, '0');
      periods.push(y + '-' + m);
    }
    return periods;
  }

  function allPeriodOptions() {
    var now = E.TODAY || new Date();
    var opts = [];
    for (var y = now.getFullYear() - 1; y <= now.getFullYear() + 2; y++) {
      for (var m = 1; m <= 12; m++) {
        opts.push(y + '-' + String(m).padStart(2, '0'));
      }
    }
    return opts;
  }

  function CashCallPlanner(props) {
    var embedded = props && props.embedded;
    var ctx = window.useStore();
    var { store, navigate } = ctx;
    var toast = window.useToast();
    var cfg = store.systemConfig || {};
    var windowMonths = cfg.cashCallWindowMonths || 3;

    var periods = useMemo(function () { return cashCallQuarters(cfg); }, [cfg]);
    var periodOpts = useMemo(function () { return allPeriodOptions(); }, []);

    var acs = (store.acRecords || []).filter(function (a) { return !a.deletedAt; });

    // C2: editing state — which AC is being reassigned, draft period value
    var editAcState = useState(null);
    var editingAcId = editAcState[0];
    var setEditingAcId = editAcState[1];
    var draftPeriodState = useState('');
    var draftPeriod = draftPeriodState[0];
    var setDraftPeriod = draftPeriodState[1];

    // Build grid
    var grid = useMemo(function () {
      var rows = {};
      acs.forEach(function (a) {
        var key = a.contractId + '|' + (a.poLineId || '—');
        if (!rows[key]) rows[key] = { contractId: a.contractId, poLineId: a.poLineId, contractNo: a.contractNo, cells: {} };
        var cp = a.cashCallPeriod;
        if (!rows[key].cells[cp]) rows[key].cells[cp] = [];
        rows[key].cells[cp].push(a);
      });
      return Object.values(rows).sort(function (a, b) { return String(a.contractNo).localeCompare(String(b.contractNo)); });
    }, [acs]);

    // Footer totals
    var footerTotals = useMemo(function () {
      var totals = {};
      periods.forEach(function (p) { totals[p] = { consumed: 0, obligated: 0, planned: 0, count: 0 }; });
      acs.forEach(function (a) {
        var cp = a.cashCallPeriod;
        if (!totals[cp]) return;
        totals[cp].count++;
        if (a.status === 's05') totals[cp].consumed += (a.erpAmount || 0);
        else if (a.status === 's02' || a.status === 's03' || a.status === 's04') totals[cp].obligated += (a.valueSubmitted || 0);
        else if (a.status === 's01') totals[cp].planned += (a.valueSubmitted || 0);
      });
      return totals;
    }, [acs, periods]);

    function periodLabel(cp) {
      if (!cp) return '—';
      var parts = cp.split('-');
      var y = parseInt(parts[0], 10);
      var m = parseInt(parts[1], 10);
      var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
      var endM = m + windowMonths - 1;
      return months[m - 1] + ' ' + y + '  (' + months[m - 1] + '–' + months[Math.min(endM, 11)] + ' ' + (y + Math.floor((m + windowMonths - 1) / 12)) + ')';
    }

    // C2: check if AC is locked (s04+ or s05)
    function isLocked(a) {
      return a.status === 's04' || a.status === 's05' || a.status === 's99d' || a.status === 's99u';
    }

    function commitReassign(acId) {
      if (!draftPeriod || !acId) return;
      var a = acs.find(function (x) { return x.id === acId; });
      if (!a || isLocked(a)) return;
      var parts = draftPeriod.split('-');
      var yy = parseInt(parts[0], 10);
      var mm = parseInt(parts[1], 10);
      if (!yy || !mm) return;
      var lastDay = new Date(yy, mm, 0).getDate();
      ctx.actions.setAcField(acId, {
        cashCallPeriod: draftPeriod,
        year: yy,
        periodStart: draftPeriod + '-01',
        periodEnd: draftPeriod + '-' + String(lastDay).padStart(2, '0'),
      });
      toast('AC moved to ' + E.cashLabel(draftPeriod), 'good');
      setEditingAcId(null);
      setDraftPeriod('');
    }

    function cancelReassign() {
      setEditingAcId(null);
      setDraftPeriod('');
    }

    var totalRows = grid.length;

    return (
      <div className="page page-wide">
        {!embedded && React.createElement(PageHeader, { title: 'Cash Call Planner', subtitle: totalRows + ' contract/PO lines · rolling ' + windowMonths + '-month windows' })}
        <div className="card" style={{ overflow: 'hidden' }}>
          <div className="tbl-wrap">
            <table className="tbl tbl-compact">
              <thead>
                <tr>
                  <th style={{ minWidth: 120 }}>Contract · PO Line</th>
                  {periods.map(function (p) {
                    return React.createElement('th', { key: p, className: 'num-col', style: { fontSize: 10 } }, periodLabel(p));
                  })}
                </tr>
              </thead>
              <tbody>
                {grid.map(function (row) {
                  return React.createElement('tr', { key: row.contractId + '|' + row.poLineId, className: 'clickable', onClick: function () { navigate('contract', { id: row.contractId, tab: 'afop' }); } },
                    React.createElement('td', { className: 'mono', style: { fontSize: 11 } }, row.contractNo),
                    periods.map(function (p) {
                      var cellAcs = row.cells[p] || [];
                      if (cellAcs.length === 0) return React.createElement('td', { key: p, className: 'num-col muted', style: { fontSize: 10 } }, '—');
                      var sub = cellAcs.reduce(function (s, a) { return s + (a.valueSubmitted || a.erpAmount || 0); }, 0);
                      var hasObligated = cellAcs.some(function (a) { return a.status !== 's01'; });
                      // C2: each AC is individually clickable for period reassign
                      return React.createElement('td', { key: p, className: 'num-col', style: { fontSize: 11 } },
                        cellAcs.map(function (a, ai) {
                          var locked = isLocked(a);
                          var isEditing = editingAcId === a.id;
                          return React.createElement('div', { key: a.id, style: { marginBottom: ai < cellAcs.length - 1 ? 2 : 0 } },
                            React.createElement('span', {
                              style: { fontWeight: hasObligated && !locked ? 600 : 400, color: locked ? 'var(--text-muted)' : (hasObligated ? '' : 'var(--text-muted)'), cursor: locked ? 'default' : 'pointer', fontSize: 10 },
                              onClick: function (e) { e.stopPropagation(); if (!locked) { setEditingAcId(isEditing ? null : a.id); setDraftPeriod(a.cashCallPeriod); } }
                            },
                              locked ? React.createElement('span', { style: { marginRight: 3 } }, '🔒') : null,
                              a.acNumber,
                              locked ? null : React.createElement('span', { style: { fontSize: 8, marginLeft: 2, color: 'var(--accent)' } }, '↗')
                            ),
                            isEditing ? (
                              React.createElement('div', { style: { marginTop: 3, display: 'flex', gap: 2, alignItems: 'center' }, onClick: function (e) { e.stopPropagation(); } },
                                React.createElement('select', {
                                  value: draftPeriod,
                                  onChange: function (e) { setDraftPeriod(e.target.value); },
                                  style: { height: 22, fontSize: 10, width: 80 }
                                },
                                  periodOpts.map(function (cp) { return React.createElement('option', { key: cp, value: cp }, E.cashLabel(cp)); })
                                ),
                                React.createElement('button', { className: 'icon-btn', style: { width: 18, height: 18 }, title: 'Save', onClick: function (e) { e.stopPropagation(); commitReassign(a.id); } },
                                  React.createElement(window.Icon, { name: 'check', size: 10 })
                                ),
                                React.createElement('button', { className: 'icon-btn', style: { width: 18, height: 18 }, title: 'Cancel', onClick: function (e) { e.stopPropagation(); cancelReassign(); } },
                                  React.createElement(window.Icon, { name: 'x', size: 10 })
                                )
                              )
                            ) : null
                          );
                        }),
                        React.createElement('div', { style: { fontSize: 10, marginTop: 2 } },
                          React.createElement(window.Money, { v: sub, dash: true })
                        )
                      );
                    })
                  );
                })}
                {/* Footer totals */}
                <tr style={{ background: 'var(--color-navy-800)', fontWeight: 600 }}>
                  <td style={{ color: '#fff', fontSize: 11 }}>Total Forecast</td>
                  {periods.map(function (p) {
                    var t = footerTotals[p] || { consumed: 0, obligated: 0, planned: 0, count: 0 };
                    var total = t.consumed + t.obligated + t.planned;
                    return React.createElement('td', { key: p, className: 'num-col', style: { color: '#fff', fontSize: 11 } },
                      React.createElement(window.Money, { v: total, dash: true }),
                      t.count > 0 && React.createElement('span', { style: { fontSize: 9, display: 'block', fontWeight: 400, color: '#94a3b8' } }, t.count + ' AC')
                    );
                  })}
                </tr>
                <tr style={{ background: 'var(--color-slate-50)', fontSize: 10 }}>
                  <td className="muted">Consumed (s05)</td>
                  {periods.map(function (p) {
                    var v = footerTotals[p] ? footerTotals[p].consumed : 0;
                    return React.createElement('td', { key: p, className: 'num-col muted' }, React.createElement(window.Money, { v: v, dash: true }));
                  })}
                </tr>
                <tr style={{ background: 'var(--color-slate-50)', fontSize: 10 }}>
                  <td className="muted" style={{ color: 'var(--accent)' }}>Obligated (s02–s04)</td>
                  {periods.map(function (p) {
                    var v = footerTotals[p] ? footerTotals[p].obligated : 0;
                    return React.createElement('td', { key: p, className: 'num-col', style: { color: 'var(--accent)' } }, React.createElement(window.Money, { v: v, dash: true }));
                  })}
                </tr>
                <tr style={{ background: 'var(--color-slate-50)', fontSize: 10 }}>
                  <td className="muted">Planned (s01)</td>
                  {periods.map(function (p) {
                    var v = footerTotals[p] ? footerTotals[p].planned : 0;
                    return React.createElement('td', { key: p, className: 'num-col muted' }, React.createElement(window.Money, { v: v, dash: true }));
                  })}
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <div style={{ marginTop: 12, fontSize: 11, color: 'var(--text-muted)', textAlign: 'center' }}>
          Window: {windowMonths} months · Click AC ↗ to reassign period · 🔒 = locked (s04/s05)
        </div>
      </div>
    );
  }

  window.CashCallPlanner = CashCallPlanner;
})();
