(() => {
// U04 — lease funds (deposit/advance), mid-lease financial change, tenant statement with period. Fictional data.
const NS = window.AmlakPlusDesignSystem_b3aa85;
const { SummaryStrip, Money, StatusBadge, Button, DataTable, Alert, Dialog, Field, Select, TextInput, Checkbox, SaveStatus, StateView, KeyValueList, SegmentedControl } = NS;
const D = window.AP_DATA;
const val = (e) => (e && e.target ? (e.target.type === 'checkbox' ? e.target.checked : e.target.value) : e);
const fmt = (n) => Number(n || 0).toLocaleString('en-US', { maximumFractionDigits: 2 });
const key = (d) => { const [a, b, c] = d.split(/[\/-]/); return c && c.length === 4 ? c + b + a : a + b + c; };
const toDMY = (iso) => iso.split('-').reverse().join('/');

// ---------- Lease funds ----------
const FK = { DEPOSIT_RECEIVE: 'قبض تأمين مسترد', DEPOSIT_REFUND: 'رد التأمين', DEPOSIT_RENT: 'سداد إيجار من التأمين', RENT_REFUND: 'رد رصيد إيجار', ADVANCE_RECEIVE: 'قبض مبلغ مقدم غير مخصص', ADVANCE_REFUND: 'رد رصيد مقدم', ADVANCE_RENT: 'تخصيص المقدم للإيجار' };
const FK_HINT = { DEPOSIT_RECEIVE: 'يُحفظ كالتزام للمستأجر — لا يسدد أي قسط.', DEPOSIT_REFUND: 'سجّله بعد تنفيذ الرد فعليًا.', DEPOSIT_RENT: 'تسوية دين المستأجر من التأمين — تحتاج موافقة موثقة.', RENT_REFUND: 'رد ما دفعه المستأجر زيادة بعد تسوية المغادرة.', ADVANCE_RECEIVE: 'زيادة عن الإيجار تُحفظ رصيدًا مستقلًا حتى تُخصص أو تُرد.', ADVANCE_REFUND: 'رد جزء من الرصيد المقدم.', ADVANCE_RENT: 'يسدد أقدم قسط مستحق من الرصيد المقدم.' };
const ACTIVE_KINDS = ['DEPOSIT_RECEIVE', 'DEPOSIT_REFUND', 'ADVANCE_RECEIVE', 'ADVANCE_REFUND', 'ADVANCE_RENT'];
const ENDED_KINDS = ['DEPOSIT_REFUND', 'DEPOSIT_RENT', 'RENT_REFUND', 'ADVANCE_REFUND', 'ADVANCE_RENT'];
const NO_ACCOUNT = ['DEPOSIT_RENT', 'ADVANCE_RENT'];
const SIGN = { DEPOSIT_RECEIVE: ['dep', 1], DEPOSIT_REFUND: ['dep', -1], DEPOSIT_RENT: ['dep', -1], ADVANCE_RECEIVE: ['adv', 1], ADVANCE_REFUND: ['adv', -1], ADVANCE_RENT: ['adv', -1] };
D.leaseFunds = D.leaseFunds || {
  l1: { agreed: 3000, rows: [
    { id: 'f1', date: '01/01/2026', kind: 'DEPOSIT_RECEIVE', holder: 'OWNER', amount: 3000, account: 'حساب المالك — عبدالله السبيعي', ref: 'TRX-10021', reason: 'تأمين العقد عند التوقيع', status: 'POSTED', doc: 'DP-000031' },
    { id: 'f2', date: '10/06/2026', kind: 'ADVANCE_RECEIVE', holder: 'OFFICE', amount: 1500, account: 'حساب المكتب — مصرف الراجحي', ref: 'TRX-55310', reason: 'حوّل زيادة عن قسط يونيو', status: 'POSTED', doc: 'DP-000058' },
    { id: 'f3', date: '12/06/2026', kind: 'ADVANCE_RECEIVE', holder: 'OFFICE', amount: 500, account: 'صندوق المكتب — نقد (عهدة سارة)', ref: 'نقد 12/06', reason: 'تسجيل مكرر', status: 'REVERSED', doc: 'DP-000059', reversal: 'سُجلت مرتين — 13/06 · أحمد' }
  ] },
  l4: { agreed: 2200, rows: [{ id: 'f9', date: '01/09/2025', kind: 'DEPOSIT_RECEIVE', holder: 'OFFICE', amount: 2200, account: 'حساب المكتب — مصرف الراجحي', ref: 'TRX-3120', reason: 'تأمين العقد', status: 'POSTED', doc: 'DP-000012' }] }
};
const fundsOf = (L) => (D.leaseFunds[L.id] = D.leaseFunds[L.id] || { agreed: Math.round(L.rent / 12), rows: [] });
const balances = (F) => { const b = { dep: { OWNER: 0, OFFICE: 0 }, adv: { OWNER: 0, OFFICE: 0 } }; F.rows.filter((r) => r.status === 'POSTED' && SIGN[r.kind]).forEach((r) => { const [k, s] = SIGN[r.kind]; b[k][r.holder] += s * r.amount; }); return b; };
const HOLDER = { OWNER: 'المالك', OFFICE: 'المكتب' };

function FundDialog({ L, mode, row, onClose, onSaved }) {
  const ended = L.status === 'ended';
  const kinds = ended ? ENDED_KINDS : ACTIVE_KINDS;
  const b = balances(fundsOf(L));
  const [v, setV] = React.useState({ kind: ended ? 'DEPOSIT_REFUND' : 'DEPOSIT_RECEIVE', holder: 'OWNER', amount: '', account: '', ref: '', reason: '', ok: false });
  const [step, setStep] = React.useState('form');
  const [tried, setTried] = React.useState(false);
  const [state, setState] = React.useState('idle');
  const set = (k) => (e) => setV((x) => ({ ...x, [k]: val(e), ...(k === 'holder' ? { account: '' } : {}) }));
  const accounts = D.accounts.filter((a) => v.holder === 'OWNER' ? a.recipient === 'owner' : a.recipient === 'office').map((a) => ({ value: a.label, label: a.label }));
  const needsAcc = !NO_ACCOUNT.includes(v.kind);
  const avail = v.kind.startsWith('DEPOSIT_') && v.kind !== 'DEPOSIT_RECEIVE' ? b.dep[v.holder] : v.kind.startsWith('ADVANCE_') && v.kind !== 'ADVANCE_RECEIVE' ? b.adv[v.holder] : null;
  const amt = Number(v.amount) || 0;
  const errs = mode === 'reverse' ? { reason: v.reason.trim().length < 3 } : { amount: !amt || (avail != null && amt > avail), account: needsAcc && !v.account, ref: v.ref.trim().length < 3, reason: v.reason.trim().length < 3 };
  const bad = Object.values(errs).some(Boolean) || !v.ok;
  const next = () => { setTried(true); if (bad) return; if (mode !== 'reverse' && step === 'form') { setStep('review'); return; } setState('saving'); setTimeout(() => {
    const F = fundsOf(L);
    if (mode === 'reverse') F.rows = F.rows.map((r) => r.id === row.id ? { ...r, status: 'REVERSED', reversal: v.reason + ' — ' + D.today + ' · ' + D.user.name } : r);
    else F.rows = [{ id: 'f' + Date.now(), date: D.today, kind: v.kind, holder: v.holder, amount: amt, account: needsAcc ? v.account : '—', ref: v.ref, reason: v.reason, status: 'POSTED', doc: 'DP-0000' + (60 + F.rows.length) }, ...F.rows];
    setState('saved'); setTimeout(onSaved, 400); }, 800); };
  const title = mode === 'reverse' ? 'عكس عملية مسجلة' : step === 'review' ? 'مراجعة قبل التسجيل' : 'تسجيل قبض / رد / تسوية';
  return (
    <Dialog title={title} subtitle={L.tenant + ' · ' + L.property + ' / ' + L.unit} onClose={onClose} busy={state === 'saving'} width={620}
      footer={<><SaveStatus state={state} /><div style={{ display: 'flex', gap: 8 }}>{step === 'review' ? <Button variant="secondary" onClick={() => setStep('form')} disabled={state === 'saving'}>تعديل</Button> : <Button variant="secondary" onClick={onClose} disabled={state === 'saving'}>إلغاء</Button>}<Button variant={mode === 'reverse' ? 'danger' : 'primary'} loading={state === 'saving'} onClick={next}>{mode === 'reverse' ? 'عكس العملية' : step === 'review' ? 'اعتماد وتسجيل' : 'مراجعة'}</Button></div></>}>
      {mode === 'reverse' ? <div style={{ display: 'grid', gap: 14 }}>
        <Alert tone="danger">العكس لا يحذف العملية ولا ينفذ تحويلًا بنكيًا؛ يُنشئ قيدًا معاكسًا ويبقى الأصل ظاهرًا بحالة «معكوس».</Alert>
        <div className="kit-f-summary"><div><span>العملية</span><b>{FK[row.kind]}</b></div><div><span>المبلغ</span><Money value={row.amount} size="md" /></div><div><span>الجهة</span><b>{HOLDER[row.holder]}</b></div><div><span>السند</span><b>{row.doc}</b></div></div>
        <Field label="سبب العكس" required error={tried && errs.reason ? 'مطلوب' : undefined}><TextInput multiline rows={3} value={v.reason} onChange={set('reason')} /></Field>
        <Checkbox label="أؤكد تصحيح السجل بعكس القيد مع الاحتفاظ بالأصل." checked={v.ok} onChange={set('ok')} />
      </div> : step === 'review' ? <div style={{ display: 'grid', gap: 14 }}>
        <KeyValueList layout="rows" items={[{ label: 'العملية', value: FK[v.kind], strong: true }, { label: 'المبلغ', value: <Money value={amt} size="md" /> }, { label: 'كتابةً', value: window.amountToArabicWords ? window.amountToArabicWords(amt) : '' }, { label: 'الجهة الحافظة / الدافعة', value: HOLDER[v.holder] }, { label: 'الحساب', value: needsAcc ? v.account : 'بدون حركة نقدية' }, { label: 'المرجع', value: v.ref }, { label: 'السبب', value: v.reason }]} />
        <Alert tone="neutral">{FK_HINT[v.kind]} يصدر سند برقم مستقل بعد التسجيل.</Alert>
      </div> : <div style={{ display: 'grid', gap: 14 }}>
        <div className="kit-form">
          <Field label="العملية" className="is-full" hint={FK_HINT[v.kind]}><Select value={v.kind} onChange={set('kind')} options={kinds.map((k) => ({ value: k, label: FK[k] }))} /></Field>
          <Field label="الجهة الحافظة / الدافعة"><SegmentedControl label="الجهة" value={v.holder} onChange={set('holder')} options={[{ value: 'OWNER', label: 'المالك' }, { value: 'OFFICE', label: 'المكتب' }]} /></Field>
          <Field label="المبلغ" required hint={avail != null ? 'المتاح لدى ' + HOLDER[v.holder] + ': ' + fmt(avail) + ' ر.س' : undefined} error={tried && errs.amount ? (avail != null && amt > avail ? 'أكبر من الرصيد المتاح' : 'مطلوب') : undefined}><TextInput ltr inputMode="decimal" value={v.amount} onChange={set('amount')} placeholder="0" /></Field>
          {needsAcc && <Field label="حساب القبض / الدفع" required className="is-full" error={tried && errs.account ? 'اختر الحساب' : undefined}><Select value={v.account} onChange={set('account')} placeholder="اختر الحساب" options={accounts} /></Field>}
          <Field label="مرجع الإثبات / الموافقة" required className="is-full" error={tried && errs.ref ? '3 أحرف على الأقل' : undefined}><TextInput value={v.ref} onChange={set('ref')} placeholder="رقم الحوالة أو مرجع موافقة المستأجر" /></Field>
          <Field label="السبب والتفاصيل" required className="is-full" error={tried && errs.reason ? 'مطلوب' : undefined}><TextInput multiline rows={2} value={v.reason} onChange={set('reason')} /></Field>
        </div>
        <Checkbox label="أؤكد تنفيذ القبض / الرد فعليًا أو موافقة المستأجر على التسوية، وصحة المرجع." checked={v.ok} onChange={set('ok')} />
        {tried && !v.ok && <span className="kit-f-missing">أكّد قبل المتابعة.</span>}
      </div>}
    </Dialog>
  );
}

function LeaseFundsPanel({ L }) {
  const [dlg, setDlg] = React.useState(null);
  const [, tick] = React.useState(0);
  const F = fundsOf(L), b = balances(F);
  return (
    <div style={{ display: 'grid', gap: 14 }}>
      <SummaryStrip items={[
        { label: 'تأمين متفق عليه', amount: F.agreed, tone: 'neutral', note: 'في العقد' },
        { label: 'تأمين محفوظ', amount: b.dep.OWNER + b.dep.OFFICE, tone: 'brand', note: 'المالك ' + fmt(b.dep.OWNER) + ' · المكتب ' + fmt(b.dep.OFFICE) },
        { label: 'مقدم غير مخصص', amount: b.adv.OWNER + b.adv.OFFICE, tone: b.adv.OWNER + b.adv.OFFICE ? 'info' : 'neutral', note: 'المالك ' + fmt(b.adv.OWNER) + ' · المكتب ' + fmt(b.adv.OFFICE) }
      ]} />
      <p className="kit-scope" style={{ margin: 0 }}>قبض التأمين أو المقدم لا يسدد الإيجار. الزيادة عن القسط تُسجل مقدمًا مستقلًا ثم تُخصص للإيجار أو تُرد.</p>
      <section className="kit-group" style={{ marginBottom: 0 }}>
        <header><h2>حركات التأمين والمقدم<span className="kit-count">{F.rows.length}</span></h2><p>كل عملية لها سند. التصحيح بالعكس فقط.</p><Button size="sm" icon="Plus" onClick={() => setDlg({ mode: 'record' })}>تسجيل عملية</Button></header>
        {!F.rows.length ? <StateView kind="empty" icon="Wallet" title="لا حركات تأمين أو مقدم" text="سجّل قبض التأمين عند التوقيع، أو أي مبلغ زائد عن القسط." /> : <DataTable caption="حركات التأمين والمقدم" rows={F.rows} columns={[
          { key: 'd', header: 'التاريخ', render: (r) => <bdi className="ap-num">{r.date}</bdi> },
          { key: 'k', header: 'العملية', render: (r) => <><span className="ap-cell-strong">{FK[r.kind]}</span><small>{HOLDER[r.holder]} · {r.account}</small></> },
          { key: 'a', header: 'المبلغ', numeric: true, render: (r) => <Money value={r.amount} struck={r.status === 'REVERSED'} /> },
          { key: 'r', header: 'الإثبات', render: (r) => <>{r.ref}<small>{r.status === 'REVERSED' ? 'عُكست: ' + r.reversal : r.reason}</small></> },
          { key: 's', header: 'الحالة', render: (r) => r.status === 'POSTED' ? <StatusBadge size="sm" tone="success" label="مسجل" /> : <StatusBadge size="sm" status="reversed" /> },
          { key: 'x', header: <span className="ap-sr-only">إجراءات</span>, render: (r) => <div className="kit-acts"><Button size="sm" variant="secondary" icon="Printer" onClick={() => window.open('../../print/documents.html#deposit', '_blank')}>السند</Button>{r.status === 'POSTED' && <Button size="sm" variant="ghost" onClick={() => setDlg({ mode: 'reverse', row: r })}>عكس</Button>}</div> }
        ]} />}
      </section>
      {dlg && <FundDialog L={L} {...dlg} onClose={() => setDlg(null)} onSaved={() => { setDlg(null); tick((x) => x + 1); }} />}
    </div>
  );
}

// ---------- Mid-lease financial change ----------
function FinanceChangeDialog({ L, onClose, onSaved }) {
  const started = key(L.start) <= '20260923';
  const future = L.charges.filter((c) => c.future && !c.paid);
  const advanceRent = fundsOf(L).rows.some((r) => r.status === 'POSTED' && r.kind === 'ADVANCE_RENT');
  const canAmend = L.status === 'active' && future.length && !advanceRent;
  const canCancel = !started && !(L.history || []).length && !fundsOf(L).rows.length;
  const [v, setV] = React.useState({ action: canAmend ? 'AMEND' : canCancel ? 'CANCEL' : 'AMEND', charge: future[0] ? future[0].id : '', amount: '', reason: '', approval: '', ok: false });
  const [step, setStep] = React.useState('form');
  const [tried, setTried] = React.useState(false);
  const [state, setState] = React.useState('idle');
  const set = (k) => (e) => setV((x) => ({ ...x, [k]: val(e) }));
  const c = future.find((x) => x.id === v.charge);
  const amt = Number(v.amount) || 0;
  const total = L.charges.reduce((s, x) => s + x.amount, 0);
  const newTotal = c ? total - c.amount + amt : total;
  const blocked = v.action === 'AMEND' ? !canAmend : !canCancel;
  const errs = { amount: v.action === 'AMEND' && (!amt || (c && amt === c.amount)), reason: v.reason.trim().length < 3, approval: v.approval.trim().length < 3 };
  const bad = blocked || Object.values(errs).some(Boolean) || !v.ok;
  const next = () => { setTried(true); if (bad) return; if (step === 'form') { setStep('review'); return; } setState('saving'); setTimeout(() => {
    if (v.action === 'AMEND') { const before = c.amount; c.amount = amt; L.rent = newTotal; L.events = [{ title: 'تغيير مالي — ' + c.period + ': ' + fmt(before) + ' ← ' + fmt(amt) + ' ر.س', date: D.today, actor: D.user.name, tone: 'info', icon: 'Pencil', body: v.reason + ' · موافقة: ' + v.approval }, ...L.events]; }
    else { L.status = 'cancelled'; L.events = [{ title: 'أُلغي العقد قبل البدء', date: D.today, actor: D.user.name, tone: 'warning', icon: 'LogOut', body: v.reason }, ...L.events]; }
    setState('saved'); setTimeout(onSaved, 400); }, 800); };
  return (
    <Dialog title={step === 'review' ? 'مراجعة التغيير المالي' : 'تغيير مالي على العقد'} subtitle={L.tenant + ' · ' + L.property + ' / ' + L.unit} onClose={onClose} busy={state === 'saving'} width={640}
      footer={<><SaveStatus state={state} /><div style={{ display: 'flex', gap: 8 }}>{step === 'review' ? <Button variant="secondary" onClick={() => setStep('form')} disabled={state === 'saving'}>تعديل</Button> : <Button variant="secondary" onClick={onClose}>إلغاء</Button>}<Button variant={v.action === 'CANCEL' ? 'danger' : 'primary'} loading={state === 'saving'} onClick={next} disabled={blocked}>{step === 'review' ? (v.action === 'CANCEL' ? 'إلغاء العقد' : 'اعتماد التغيير') : 'مراجعة'}</Button></div></>}>
      {step === 'review' ? <div style={{ display: 'grid', gap: 14 }}>
        {v.action === 'AMEND' ? <div className="kit-f-summary"><div><span>القسط</span><b>{c.period}</b></div><div><span>قبل</span><Money value={c.amount} size="md" /></div><div><span>بعد</span><Money value={amt} size="md" tone={amt < c.amount ? 'success' : undefined} /></div><div><span>إجمالي العقد</span><b>{fmt(total)} ← {fmt(newTotal)}</b></div></div>
          : <Alert tone="danger">سيُلغى العقد ويعود الشاغر للوحدة. لا توجد عليه دفعات أو تأمين.</Alert>}
        <KeyValueList layout="rows" items={[{ label: 'السبب', value: v.reason }, { label: 'مرجع الموافقة', value: v.approval }]} />
        <Alert tone="neutral">يُحفظ التغيير في أحداث العقد بقيمته قبل وبعد. الأقساط المستحقة والمسددة لا تتغير.</Alert>
      </div> : <div style={{ display: 'grid', gap: 14 }}>
        <Alert tone="warning">لمدير المنشأة فقط. هذا المسار لا يعدّل أي قسط استحق أو خُصص له تحصيل — ذلك يحتاج تصحيحًا محاسبيًا.</Alert>
        <fieldset className="kit-f-radio"><legend>نوع التغيير</legend>
          {[{ value: 'AMEND', label: 'تعديل قيمة قسط مستقبلي', hint: 'زيادة أو خصم على قسط لم يستحق ولم يُسدد منه شيء.', ok: canAmend }, { value: 'CANCEL', label: 'إلغاء العقد قبل بدايته', hint: 'لعقد لم يبدأ وليس له تحصيل أو تأمين أو تجديد.', ok: canCancel }].map((o) =>
            <label key={o.value} className={'kit-choice' + (v.action === o.value ? ' is-on' : '')} style={o.ok ? undefined : { opacity: .55 }}><input type="radio" name="fc" checked={v.action === o.value} onChange={() => setV((x) => ({ ...x, action: o.value }))} /><span><b>{o.label}</b><small>{o.ok ? o.hint : 'غير متاح لهذا العقد — ' + (o.value === 'AMEND' ? (advanceRent ? 'له مقدم مخصص للإيجار؛ صحح التخصيص أولًا.' : 'لا أقساط مستقبلية غير مسددة.') : 'العقد بدأ أو له حركات؛ استخدم «إنهاء» وتسوية المغادرة.')}</small></span></label>)}
        </fieldset>
        {v.action === 'AMEND' && canAmend && <div className="kit-form">
          <Field label="القسط"><Select value={v.charge} onChange={set('charge')} options={future.map((x) => ({ value: x.id, label: x.period + ' — ' + fmt(x.amount) + ' ر.س' }))} /></Field>
          <Field label="القيمة الجديدة" required error={tried && errs.amount ? (c && amt === c.amount ? 'نفس القيمة الحالية' : 'مطلوب') : undefined} hint={c && amt ? (amt < c.amount ? 'خصم ' : 'زيادة ') + fmt(Math.abs(amt - c.amount)) + ' ر.س · الإجمالي ' + fmt(newTotal) : undefined}><TextInput ltr inputMode="decimal" value={v.amount} onChange={set('amount')} placeholder={c ? String(c.amount) : '0'} /></Field>
        </div>}
        <div className="kit-form">
          <Field label="السبب" required className="is-full" error={tried && errs.reason ? 'مطلوب' : undefined}><TextInput multiline rows={2} value={v.reason} onChange={set('reason')} placeholder="مثال: خصم متفق عليه مقابل إصلاحات نفذها المستأجر" /></Field>
          <Field label="مرجع موافقة المالك / المستأجر" required className="is-full" error={tried && errs.approval ? '3 أحرف على الأقل' : undefined}><TextInput value={v.approval} onChange={set('approval')} placeholder="رسالة، ملحق عقد، أو رقم طلب" /></Field>
        </div>
        <Checkbox label="أؤكد وجود موافقة موثقة على هذا التغيير." checked={v.ok} onChange={set('ok')} />
        {tried && !v.ok && !blocked && <span className="kit-f-missing">أكّد قبل المتابعة.</span>}
      </div>}
    </Dialog>
  );
}

// ---------- Tenant statement with period ----------
const PRESETS = [{ value: 'lease', label: 'العقد كاملًا' }, { value: 'month', label: 'الشهر الحالي' }, { value: 'q', label: 'آخر 3 أشهر' }, { value: 'custom', label: 'فترة محددة' }];
function statementRows(L) {
  const m = [];
  L.charges.filter((c) => !c.future).forEach((c) => m.push({ id: c.id, date: c.due, text: 'قسط ' + c.period, ref: '—', debit: c.amount, credit: 0 }));
  (L.history || []).forEach((p) => { m.push({ id: p.id, date: p.date, text: 'سداد — ' + p.method, sub: p.recipientLabel, ref: 'RC-' + p.receipt, debit: 0, credit: p.amount }); if (p.status === 'reversed') m.push({ id: p.id + 'r', date: p.date, text: 'عكس الدفعة — إعادة الرصيد', ref: 'RC-' + p.receipt, debit: p.amount, credit: 0, muted: true }); });
  fundsOf(L).rows.filter((f) => ['DEPOSIT_RENT', 'ADVANCE_RENT', 'RENT_REFUND'].includes(f.kind)).forEach((f) => m.push({ id: f.id, date: f.date, text: FK[f.kind], ref: f.doc, debit: f.kind === 'RENT_REFUND' ? f.amount : 0, credit: f.kind === 'RENT_REFUND' ? 0 : f.amount, muted: f.status === 'REVERSED' }));
  return m.sort((a, b) => key(a.date).localeCompare(key(b.date)));
}
function TenantStatement({ tenant, leases }) {
  const [leaseId, setLeaseId] = React.useState(leases[0] && leases[0].id);
  const [preset, setPreset] = React.useState('lease');
  const [from, setFrom] = React.useState('2026-07-01');
  const [to, setTo] = React.useState('2026-09-23');
  if (!leases.length) return <StateView boxed kind="empty" icon="FileText" title="لا عقود لهذا المستأجر" text="الكشف يظهر بعد إنشاء أول عقد." />;
  const L = window.buildLease(leaseId);
  const range = preset === 'lease' ? [key(L.start), '20260923'] : preset === 'month' ? ['20260901', '20260923'] : preset === 'q' ? ['20260701', '20260923'] : [from.replace(/-/g, ''), to.replace(/-/g, '')];
  const all = statementRows(L);
  const net = (r) => r.muted && r.credit ? 0 : r.debit - r.credit;
  const opening = all.filter((r) => key(r.date) < range[0]).reduce((s, r) => s + net(r), 0);
  let run = opening;
  const rows = all.filter((r) => key(r.date) >= range[0] && key(r.date) <= range[1]).map((r) => { run += net(r); return { ...r, bal: run }; });
  const due = rows.reduce((s, r) => s + r.debit, 0), paid = rows.filter((r) => !r.muted).reduce((s, r) => s + r.credit, 0);
  const future = L.charges.filter((c) => c.future).reduce((s, c) => s + c.amount - c.paid, 0);
  const label = (k) => k.slice(6) + '/' + k.slice(4, 6) + '/' + k.slice(0, 4);
  const invalid = preset === 'custom' && range[0] > range[1];
  return (
    <div style={{ display: 'grid', gap: 14 }}>
      <div className="kit-toolbar" style={{ marginBottom: 0 }}>
        {leases.length > 1 && <Field label="العقد" style={{ minWidth: 240 }}><Select value={leaseId} onChange={(e) => setLeaseId(val(e))} options={leases.map((l) => ({ value: l.id, label: l.property + ' / ' + l.unit + ' · ' + l.start }))} /></Field>}
        <SegmentedControl label="الفترة" value={preset} onChange={setPreset} options={PRESETS} />
        {preset === 'custom' && <><Field label="من"><TextInput type="date" value={from} onChange={(e) => setFrom(val(e))} /></Field><Field label="إلى" error={invalid ? 'قبل تاريخ البداية' : undefined}><TextInput type="date" value={to} max="2026-09-23" onChange={(e) => setTo(val(e))} /></Field></>}
        <Button variant="secondary" icon="Printer" style={{ marginInlineStart: 'auto' }} disabled={invalid} onClick={() => window.open('../../print/documents.html#tenant-statement', '_blank')}>طباعة الكشف</Button>
      </div>
      <p className="kit-scope" style={{ margin: 0 }}>{L.property} / {L.unit} · من {label(range[0])} إلى {label(range[1])} · بالريال السعودي. الأقساط المستقبلية خارج الرصيد.</p>
      <SummaryStrip items={[
        { label: 'رصيد أول الفترة', amount: opening, tone: opening > 0 ? 'warning' : 'neutral', note: opening < 0 ? 'سداد مقدم' : 'قبل ' + label(range[0]) },
        { label: 'مستحق خلال الفترة', amount: due, tone: 'neutral', note: rows.filter((r) => r.debit && !r.muted).length + ' أقساط' },
        { label: 'مسدد مؤكد خلال الفترة', amount: paid, tone: 'success', note: 'بعد العكس' },
        { label: 'الرصيد في نهاية الفترة', amount: run, tone: run > 0 ? 'danger' : 'success', note: run < 0 ? 'مسدد مقدمًا' : run ? 'على المستأجر' : 'لا رصيد' }
      ]} />
      {invalid ? <StateView boxed kind="error" title="الفترة غير صحيحة" text="تاريخ النهاية قبل تاريخ البداية." /> : <DataTable caption="حركة الحساب" rows={[{ id: 'open', date: label(range[0]), text: 'رصيد أول الفترة', ref: '—', debit: 0, credit: 0, bal: opening, opening: true }, ...rows]} footer columns={[
        { key: 'd', header: 'التاريخ', render: (r) => <bdi className="ap-num">{r.date}</bdi> },
        { key: 't', header: 'البيان', render: (r) => <span style={r.muted ? { color: 'var(--text-3)' } : r.opening ? { fontWeight: 600 } : undefined}>{r.text}{r.sub && <small>{r.sub}</small>}</span>, footer: 'الإجمالي للفترة' },
        { key: 'r', header: 'المرجع', render: (r) => r.ref === '—' ? '—' : <bdi className="ap-ltr">{r.ref}</bdi> },
        { key: 'db', header: 'مدين', numeric: true, render: (r) => r.debit ? <Money value={r.debit} /> : '—', footer: <Money value={due} /> },
        { key: 'cr', header: 'دائن', numeric: true, render: (r) => r.credit ? <Money value={r.credit} struck={r.muted} /> : '—', footer: <Money value={paid} /> },
        { key: 'b', header: 'الرصيد', numeric: true, render: (r) => <Money value={r.bal} tone={r.bal > 0 ? 'danger' : undefined} />, footer: <Money value={run} tone={run > 0 ? 'danger' : undefined} /> }
      ]} />}
      {future > 0 && <p className="kit-scope" style={{ margin: 0 }}>أقساط مستقبلية غير مسددة: {fmt(future)} ر.س — لا تدخل في الرصيد.</p>}
    </div>
  );
}

Object.assign(window, { LeaseFundsPanel, FinanceChangeDialog, TenantStatement });
})();
