(() => {
// U06 — import preview, backup/restore, invite /join + portal entry + first-run, tenant agents. Fictional data.
const NS = window.AmlakPlusDesignSystem_b3aa85;
const { PageHeader, SummaryStrip, Money, StatusBadge, Button, Tabs, DataTable, Alert, Dialog, Field, Select, TextInput, Checkbox, SaveStatus, StateView, KeyValueList, Logo, Icon } = NS;
const D = window.AP_DATA;
const val = (e) => (e && e.target ? (e.target.type === 'checkbox' ? e.target.checked : e.target.type === 'file' ? (e.target.files[0] || {}).name || '' : e.target.value) : e);
const go = (r, p) => window.apGo && window.apGo(r, p);

// ---------- G10 · Import with preview ----------
const KINDS = { owners: 'الملاك', properties: 'العقارات', units: 'الوحدات', tenants: 'المستأجرون' };
const SAMPLE = {
  owners: { cols: ['name', 'kind', 'phone', 'id_number'], rows: [['سالم العنزي', 'فرد', '0551002003', '1098877665'], ['شركة دار المدى', 'شركة', '0114002233', '7001234567'], ['نوال القرني', 'فرد', '05510', '1022334455'], ['سالم العنزي', 'فرد', '0551002003', '1098877665']], errors: { 3: 'رقم الجوال غير مكتمل', 4: 'مكرر مع السطر 2 — نفس رقم الهوية' } },
  properties: { cols: ['name', 'city', 'district', 'owner_id_number', 'use'], rows: [['عمارة الواحة 4', 'الرياض', 'الملقا', '1098877665', 'سكني'], ['مجمع المدى', 'جدة', 'الروضة', '7001234567', 'تجاري'], ['فيلا القرني', 'الرياض', 'النرجس', '1999999999', 'سكني']], errors: { 4: 'لا يوجد مالك بهذا الرقم — استورد الملاك أولًا' } },
  units: { cols: ['property', 'unit', 'type', 'rent'], rows: [['عمارة الواحة 4', '101', 'شقة', '32000'], ['عمارة الواحة 4', '102', 'شقة', '32000']], errors: {} },
  tenants: { cols: ['name', 'type', 'phone', 'id_number'], rows: [['ماجد الشهراني', 'فرد', '0559988776', '1033445566'], ['مؤسسة البناء الحديث', 'مؤسسة', '0126655443', '4030112233']], errors: {} }
};
function ImportDialog({ initial, onClose, onDone }) {
  const [kind, setKind] = React.useState(initial || 'owners');
  const [file, setFile] = React.useState('');
  const [step, setStep] = React.useState('file');
  const [busy, setBusy] = React.useState(false);
  const [ok, setOk] = React.useState(false);
  const [tried, setTried] = React.useState(false);
  const S = SAMPLE[kind], errN = Object.keys(S.errors).length, valid = S.rows.length - errN;
  const reset = (k) => { setKind(k); setFile(''); setStep('file'); setOk(false); setTried(false); };
  const run = (next, fn) => { setBusy(true); setTimeout(() => { setBusy(false); fn && fn(); setStep(next); }, 900); };
  const footer = step === 'done' ? <><span /><Button onClick={() => { onDone(kind, valid); onClose(); }}>تم</Button></>
    : <><SaveStatus state={busy ? 'saving' : 'idle'} /><div style={{ display: 'flex', gap: 8 }}><Button variant="secondary" onClick={step === 'preview' ? () => setStep('file') : onClose} disabled={busy}>{step === 'preview' ? 'تغيير الملف' : 'إلغاء'}</Button>
      {step === 'file' ? <Button loading={busy} disabled={!file} onClick={() => run('preview')}>معاينة والتحقق</Button> : <Button loading={busy} disabled={!!errN} onClick={() => { setTried(true); if (ok) run('done'); }}>اعتماد الاستيراد</Button>}</div></>;
  return (
    <Dialog title={'استيراد ' + KINDS[kind]} subtitle="CSV · حتى 100 سطر و1 ميجابايت" width={step === 'preview' ? 820 : 600} onClose={onClose} busy={busy} footer={footer}>
      {step === 'file' && <div style={{ display: 'grid', gap: 14 }}>
        <Alert tone="neutral">الترتيب: الملاك ← العقارات ← الوحدات، والمستأجرون بملف مستقل. هذا المسار لا ينشئ عقودًا أو أرصدة أو دفعات.</Alert>
        <div className="kit-form">
          <Field label="نوع البيانات"><Select value={kind} onChange={(e) => reset(val(e))} options={Object.entries(KINDS).map(([k, l]) => ({ value: k, label: l }))} /></Field>
          <Field label="القالب"><Button variant="secondary" icon="Download">تنزيل قالب بعينة وهمية</Button></Field>
          <Field label="الملف" required className="is-full" hint="UTF-8 · الصف الأول أسماء الأعمدة كما في القالب."><div className="kit-file">{file ? <span className="kit-file__name"><Icon name="Paperclip" size={14} />{file}<button type="button" aria-label="إزالة الملف" onClick={() => setFile('')}>×</button></span> : <><Button size="sm" variant="secondary" icon="Upload" onClick={() => setFile(kind + '-2026-09.csv')}>اختيار ملف</Button><span className="kit-file__hint">أو اسحب الملف هنا</span></>}</div></Field>
        </div>
      </div>}
      {step === 'preview' && <div style={{ display: 'grid', gap: 14 }}>
        <SummaryStrip items={[{ label: 'الصفوف', value: S.rows.length, tone: 'neutral' }, { label: 'صالحة', value: valid, tone: 'success' }, { label: 'بها أخطاء', value: errN, tone: errN ? 'danger' : 'neutral', note: errN ? 'صحّحها في الملف وأعد الرفع' : 'جاهز للاعتماد' }]} />
        {errN > 0 && <Alert tone="danger" title="لا يمكن الاعتماد والملف به أخطاء">{Object.entries(S.errors).map(([r, m]) => <div key={r}>السطر {r}: {m}</div>)}</Alert>}
        <DataTable caption="معاينة الملف" rows={S.rows.map((r, i) => ({ id: i, line: i + 2, cells: r, err: S.errors[i + 2] }))} columns={[
          { key: 'n', header: 'السطر', render: (r) => <span style={r.err ? { color: 'var(--status-danger-fg)', fontWeight: 600 } : undefined}>{r.line}</span> },
          ...S.cols.map((c, ci) => ({ key: c, header: <bdi className="ap-ltr">{c}</bdi>, render: (r) => r.cells[ci] })),
          { key: 's', header: 'الحالة', render: (r) => r.err ? <StatusBadge size="sm" tone="danger" label={r.err} /> : <StatusBadge size="sm" tone="success" label="صالح" /> }
        ]} />
        {!errN && <Checkbox label="راجعت المعاينة وأوافق على إنشاء السجلات. الموجود لا يُستبدل." checked={ok} onChange={(e) => setOk(val(e))} />}
        {tried && !ok && !errN && <span className="kit-f-missing">أكّد المراجعة.</span>}
      </div>}
      {step === 'done' && <div className="kit-result"><span className="kit-result__icon is-done"><Icon name="CircleCheck" size={26} /></span><div><strong style={{ fontSize: 16 }}>حُفظ {valid} سجل</strong><p style={{ margin: '4px 0 0', fontSize: 13, color: 'var(--text-2)' }}>{KINDS[kind]} · {file}. رفع الملف نفسه مرة أخرى لا يكرر السجلات.</p></div></div>}
    </Dialog>
  );
}

// ---------- G10 · Backup / restore ----------
function BackupDialog({ onClose }) {
  const [mode, setMode] = React.useState('export');
  const [v, setV] = React.useState({ pw: '', file: '', rpw: '', name: 'استعادة اختبار — مساحة منفصلة', ok: false });
  const [step, setStep] = React.useState('form');
  const [busy, setBusy] = React.useState(false);
  const [tried, setTried] = React.useState(false);
  const set = (k) => (e) => setV((x) => ({ ...x, [k]: val(e) }));
  const strong = v.pw.length >= 16;
  const rerr = { file: !v.file, rpw: v.rpw.length < 16, name: v.name.trim().length < 5, ok: !v.ok };
  const act = () => { setTried(true);
    if (mode === 'export') { if (!strong) return; setBusy(true); setTimeout(() => { setBusy(false); setStep('done'); }, 1100); return; }
    if (Object.values(rerr).some(Boolean)) return; if (step === 'form') return setStep('review');
    setBusy(true); setTimeout(() => { setBusy(false); setStep('done'); }, 1400); };
  const title = step === 'review' ? 'مراجعة الاستعادة' : 'النسخ الاحتياطي والاستعادة';
  return (
    <Dialog title={title} subtitle={D.org} width={560} onClose={onClose} busy={busy}
      footer={step === 'done' ? <><span /><Button onClick={onClose}>تم</Button></> : <><SaveStatus state={busy ? 'saving' : 'idle'} /><div style={{ display: 'flex', gap: 8 }}><Button variant="secondary" disabled={busy} onClick={step === 'review' ? () => setStep('form') : onClose}>{step === 'review' ? 'تعديل' : 'إلغاء'}</Button><Button loading={busy} onClick={act}>{mode === 'export' ? 'إنشاء وتنزيل نسخة مشفرة' : step === 'review' ? 'استعادة في مساحة جديدة' : 'مراجعة الاستعادة'}</Button></div></>}>
      {step === 'done' ? (mode === 'export'
        ? <div className="kit-result"><span className="kit-result__icon is-done"><Icon name="Download" size={24} /></span><div><strong>نُزّلت النسخة المشفرة</strong><p style={{ margin: '4px 0 0', fontSize: 13, color: 'var(--text-2)' }}><bdi className="ap-ltr">amlak-2026-09-23.amlakbackup</bdi> · البيانات والمرفقات. احتفظ بكلمة الحماية في مكان منفصل — لا يمكن استرجاعها.</p></div></div>
        : <div style={{ display: 'grid', gap: 12 }}><div className="kit-result"><span className="kit-result__icon is-done"><Icon name="CircleCheck" size={24} /></span><div><strong>تمت الاستعادة في مساحة جديدة</strong><p style={{ margin: '4px 0 0', fontSize: 13, color: 'var(--text-2)' }}>«{v.name}» — المنشأة الحالية لم تتغير.</p></div></div><Alert tone="warning">وصول باقي المستخدمين للمساحة المستعادة موقوف حتى تراجعه من «الفريق والفروع». اخترها من قائمة المنشآت أعلى الصفحة.</Alert></div>)
      : <div style={{ display: 'grid', gap: 14 }}>
        {step === 'form' && <Tabs label="إجراء النسخ" value={mode} onChange={(m) => { setMode(m); setTried(false); }} tabs={[{ id: 'export', label: 'نسخة احتياطية' }, { id: 'restore', label: 'استعادة منفصلة' }]} />}
        {mode === 'export' ? <>
          <p className="kit-scope" style={{ margin: 0 }}>النسخة تشمل بيانات المنشأة ومحتوى المرفقات، وتُشفّر بكلمة تختارها ولا نخزنها. حسابات الدخول لا تُنسخ.</p>
          <Field label="كلمة حماية النسخة" required hint={v.pw ? (strong ? 'مقبولة' : 'باقي ' + (16 - v.pw.length) + ' أحرف') : '16 حرفًا على الأقل'} error={tried && !strong ? '16 حرفًا على الأقل' : undefined}><TextInput type="password" ltr autoComplete="off" value={v.pw} onChange={set('pw')} /></Field>
        </> : step === 'review' ? <>
          <KeyValueList layout="rows" items={[{ label: 'الملف', value: <bdi className="ap-ltr">{v.file}</bdi> }, { label: 'اسم المساحة الجديدة', value: v.name, strong: true }, { label: 'المنشأة الحالية', value: 'لن تتغير' }]} />
          <Alert tone="warning">تُنشأ مساحة منفصلة، ويُوقف وصول المستخدمين الآخرين إليها للمراجعة. لا يُكتب فوق أي بيانات حالية.</Alert>
        </> : <>
          <Alert tone="neutral">الاستعادة لا تكتب فوق المنشأة الحالية أبدًا — تُنشئ مساحة جديدة منفصلة.</Alert>
          <Field label="ملف النسخة" required hint=".amlakbackup · حتى 2.9 ميجابايت عبر الويب" error={tried && rerr.file ? 'اختر الملف' : undefined}><div className="kit-file">{v.file ? <span className="kit-file__name"><Icon name="Paperclip" size={14} /><bdi className="ap-ltr">{v.file}</bdi><button type="button" aria-label="إزالة" onClick={() => setV((x) => ({ ...x, file: '' }))}>×</button></span> : <Button size="sm" variant="secondary" icon="Upload" onClick={() => setV((x) => ({ ...x, file: 'amlak-2026-09-01.amlakbackup' }))}>اختيار ملف</Button>}</div></Field>
          <Field label="كلمة حماية النسخة" required error={tried && rerr.rpw ? '16 حرفًا على الأقل' : undefined}><TextInput type="password" ltr autoComplete="off" value={v.rpw} onChange={set('rpw')} /></Field>
          <Field label="اسم مساحة الاستعادة" required error={tried && rerr.name ? '5 أحرف على الأقل' : undefined}><TextInput value={v.name} onChange={set('name')} /></Field>
          <Checkbox label="أوافق على إنشاء مساحة منفصلة من نسخة هذه المنشأة." checked={v.ok} onChange={set('ok')} />
          {tried && rerr.ok && <span className="kit-f-missing">الموافقة مطلوبة.</span>}
        </>}
        {step === 'form' && <p className="kit-scope" style={{ margin: 0 }}>الحد عبر الويب 3.5 ميجابايت للتنزيل و2.9 للاستعادة. النسخ الأكبر عبر الأداة المحلية.</p>}
      </div>}
    </Dialog>
  );
}
function DataDialogs() {
  const [dlg, setDlg] = React.useState(null);
  const [note, setNote] = React.useState('');
  React.useEffect(() => { window.apData = (id, ctx) => setDlg({ id, ctx }); return () => { window.apData = null; }; }, []);
  return <>{note && <Alert tone="success" onDismiss={() => setNote('')} style={{ marginBottom: 12 }}>{note}</Alert>}
    {dlg && dlg.id === 'import' && <ImportDialog initial={dlg.ctx} onClose={() => setDlg(null)} onDone={(k, n) => setNote('استُورد ' + n + ' سجل — ' + KINDS[k] + '.')} />}
    {dlg && dlg.id === 'backup' && <BackupDialog onClose={() => setDlg(null)} />}</>;
}

// ---------- G11 · Invite /join + portal entry ----------
const INVITE = { org: 'مكتب الندى لإدارة الأملاك', email: 'reem.alshehri@mail.com', kind: 'TENANT', target: 'ريم الشهري', by: 'منيرة القحطاني', expires: '30/09/2026' };
const KIND_L = { STAFF: 'موظف في المكتب', OWNER: 'بوابة مالك', TENANT: 'بوابة مستأجر' };
function JoinScreen() {
  const [state, setState] = React.useState('auth'); // auth | signed | wrong | invalid | expired | done
  const [signup, setSignup] = React.useState(true);
  const [v, setV] = React.useState({ email: INVITE.email, pw: '' });
  const [busy, setBusy] = React.useState(false);
  const [tried, setTried] = React.useState(false);
  const wait = (fn) => { setBusy(true); setTimeout(() => { setBusy(false); fn(); }, 900); };
  const card = (children) => <div className="kit-login"><section className="kit-login__card"><Logo base="../../" width={150} />{children}</section></div>;
  const inviteBox = <div className="kit-f-summary"><div><span>المنشأة</span><b>{INVITE.org}</b></div><div><span>نوع الوصول</span><b>{KIND_L[INVITE.kind]}{INVITE.target ? ' — ' + INVITE.target : ''}</b></div><div><span>البريد المدعو</span><b><bdi className="ap-ltr">{INVITE.email}</bdi></b></div><div><span>صالحة حتى</span><b>{INVITE.expires}</b></div></div>;
  const demo = <div className="kit-dev ap-no-print" style={{ flexWrap: 'wrap', justifyContent: 'center' }}>نموذج أولي: {['auth', 'wrong', 'invalid', 'expired'].map((s) => <button key={s} type="button" className="kit-src" onClick={() => { setState(s); setTried(false); }}>{{ auth: 'رابط سليم', wrong: 'حساب آخر', invalid: 'رابط ناقص', expired: 'منتهية' }[s]}</button>)}</div>;
  if (state === 'invalid' || state === 'expired') return card(<><h1>{state === 'invalid' ? 'رابط الدعوة غير مكتمل' : 'انتهت صلاحية الدعوة'}</h1><p>{state === 'invalid' ? 'انسخ الرابط كاملًا من الرسالة كما وصلك، أو اطلب من المكتب رابطًا جديدًا.' : 'الدعوات صالحة 7 أيام. اطلب من المكتب إرسال دعوة جديدة لنفس البريد.'}</p><StateView kind="error" icon="Info" title={state === 'invalid' ? 'لا يمكن قراءة الدعوة' : 'الدعوة لم تعد صالحة'} text={'تواصل مع ' + INVITE.org + '.'} />{demo}</>);
  if (state === 'done') return card(<><h1>انضممت إلى {INVITE.org}</h1><p>{INVITE.kind === 'STAFF' ? 'تفتح مساحة العمل بصلاحياتك.' : 'بوابتك جاهزة: عقودك وأقساطك وإرسال إثبات التحويل.'}</p><Button size="lg" block icon="ArrowLeft" onClick={() => { location.href = '../portals/index.html'; }}>{INVITE.kind === 'STAFF' ? 'فتح مساحة العمل' : 'فتح البوابة'}</Button>{demo}</>);
  if (state === 'signed' || state === 'wrong') { const email = state === 'wrong' ? 'sara@alnada.sa' : v.email; return card(<><h1>قبول الدعوة</h1><p>تأكد من اسم المكتب قبل القبول.</p>{inviteBox}
    <div className="kit-account" style={{ border: '1px solid var(--border-1)', borderRadius: 'var(--radius-md)', padding: 12, marginTop: 0 }}><span className="kit-avatar">{email[0].toUpperCase()}</span><div style={{ display: 'grid' }}><small style={{ color: 'var(--text-3)' }}>الحساب الحالي</small><bdi className="ap-ltr">{email}</bdi></div></div>
    {state === 'wrong' ? <Alert tone="danger">هذه الدعوة لبريد آخر. سجّل الخروج وادخل بالبريد المدعو <bdi className="ap-ltr">{INVITE.email}</bdi>.</Alert> : null}
    <Button size="lg" block loading={busy} disabled={state === 'wrong'} onClick={() => wait(() => setState('done'))}>قبول الدعوة وفتح {INVITE.kind === 'STAFF' ? 'المساحة' : 'البوابة'}</Button>
    <Button variant="secondary" block disabled={busy} onClick={() => setState('auth')}>استخدام حساب آخر</Button>{demo}</>); }
  const err = { email: !/^\S+@\S+\.\S+$/.test(v.email), pw: signup ? v.pw.length < 8 : !v.pw };
  return card(<><h1>الانضمام إلى أملاك بلس</h1><p>دعاك {INVITE.by} من {INVITE.org}. الدعوة لهذا البريد فقط.</p>{inviteBox}
    <Field label="البريد المدعو" required error={tried && err.email ? 'بريد غير صحيح' : undefined}><TextInput type="email" ltr autoComplete="email" value={v.email} onChange={(e) => setV((x) => ({ ...x, email: val(e) }))} /></Field>
    <Field label="كلمة المرور" required hint={signup ? '8 أحرف على الأقل' : undefined} error={tried && err.pw ? (signup ? '8 أحرف على الأقل' : 'مطلوبة') : undefined}><TextInput type="password" ltr autoComplete={signup ? 'new-password' : 'current-password'} value={v.pw} onChange={(e) => setV((x) => ({ ...x, pw: val(e) }))} /></Field>
    <Button size="lg" block loading={busy} onClick={() => { setTried(true); if (err.email || err.pw) return; wait(() => setState(v.email === INVITE.email ? 'signed' : 'wrong')); }}>{signup ? 'إنشاء حساب والمتابعة' : 'تسجيل الدخول والمتابعة'}</Button>
    <p className="kit-login__foot">{signup ? 'لديك حساب بهذا البريد؟ ' : 'ليس لديك حساب؟ '}<button type="button" className="kit-src" onClick={() => setSignup(!signup)}>{signup ? 'سجّل الدخول' : 'أنشئ حسابًا بالبريد المدعو'}</button></p>{demo}</>);
}

// First-run checklist on an empty workspace (after «سجّل مكتبك»).
const STEPS = [
  { id: 'accounts', icon: 'Wallet', t: 'أضف حساب استلام', d: 'الحساب البنكي أو الصندوق الذي تستلم فيه الإيجارات.', go: 'accounts' },
  { id: 'owners', icon: 'Landmark', t: 'استورد الملاك أو أضفهم', d: 'قبل العقارات — كل عقار يرتبط بمالك.', imp: 'owners' },
  { id: 'properties', icon: 'Building2', t: 'أضف العقارات والوحدات', d: 'استيراد CSV أو إضافة يدوية.', imp: 'properties' },
  { id: 'tenants', icon: 'Users', t: 'أضف المستأجرين وأنشئ العقود', d: 'العقد يولّد جدول الاستحقاقات تلقائيًا.', go: 'leases' },
  { id: 'team', icon: 'Settings2', t: 'ادعُ فريقك', d: 'دعوة بالبريد وصلاحيات لكل عضو.', go: 'team' }
];
function WelcomeScreen() {
  const [done, setDone] = React.useState(['accounts']);
  const n = done.length;
  return (
    <>
      <PageHeader title={'أهلًا بك في ' + D.org} description="خمس خطوات لتجهيز المنشأة. يمكنك تخطي أي خطوة والرجوع لها من القائمة." actions={<Button variant="ghost" onClick={() => go('today')}>تخطي إلى متابعات اليوم</Button>} />
      <div className="kit-panel" style={{ display: 'grid', gap: 10 }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 13 }}><b>{n} من {STEPS.length} مكتملة</b><span style={{ color: 'var(--text-3)' }}>التقدم محفوظ لهذه المنشأة</span></div>
        <div style={{ height: 6, background: 'var(--neutral-100)', borderRadius: 3, overflow: 'hidden' }}><div style={{ width: (n / STEPS.length * 100) + '%', height: '100%', background: 'var(--green-800)', transition: 'width var(--dur-slow) var(--ease-standard)' }}></div></div>
        <ol style={{ listStyle: 'none', margin: 0, padding: 0, display: 'grid' }}>{STEPS.map((s, i) => { const ok = done.includes(s.id); return (
          <li key={s.id} style={{ display: 'flex', gap: 14, alignItems: 'center', padding: '14px 0', borderTop: i ? '1px solid var(--border-1)' : 0 }}>
            <span className="kit-card__icon" style={ok ? { background: 'var(--status-success-bg)', color: 'var(--status-success-fg)' } : undefined}><Icon name={ok ? 'Check' : s.icon} size={18} /></span>
            <div style={{ flex: 1, display: 'grid', gap: 2 }}><b style={{ fontSize: 14, textDecoration: ok ? 'line-through' : 'none', color: ok ? 'var(--text-3)' : undefined }}>{s.t}</b><span style={{ fontSize: 12, color: 'var(--text-3)' }}>{s.d}</span></div>
            {!ok && <Button size="sm" variant={done.length === i ? 'primary' : 'secondary'} onClick={() => { if (s.imp) { go('data'); setTimeout(() => window.apData && window.apData('import', s.imp), 1000); } else go(s.go); setDone((d) => [...d, s.id]); }}>{s.imp ? 'استيراد' : 'ابدأ'}</Button>}
          </li>); })}</ol>
      </div>
    </>
  );
}

// ---------- G12 · Tenant agents (power of attorney) ----------
D.tenantAgents = D.tenantAgents || {
  n2: [{ id: 'ag1', name: 'فهد بن سالم الدوسري', idNo: '10•••••441', mobile: '0551234400', agency: '4412025117', start: '2025-03-01', end: '2027-02-28', files: 2 }],
  n1: [{ id: 'ag2', name: 'محمد العتيبي', idNo: '10•••••902', mobile: '0508877665', agency: '3310228801', start: '2024-01-01', end: '2026-06-30', files: 1 }]
};
const agentStatus = (a) => !a.end ? ['neutral', 'بلا تاريخ انتهاء'] : a.end < '2026-09-23' ? ['danger', 'منتهية'] : a.end < '2026-10-23' ? ['warning', 'تنتهي خلال 30 يومًا'] : ['success', 'سارية'];
function AgentDialog({ agent, onClose, onSaved }) {
  const [v, setV] = React.useState(agent || { name: '', idNo: '', mobile: '', agency: '', start: '', end: '' });
  const [tried, setTried] = React.useState(false);
  const [state, setState] = React.useState('idle');
  const set = (k) => (e) => setV((x) => ({ ...x, [k]: val(e) }));
  const err = { name: v.name.trim().length < 2, idNo: !v.idNo.trim(), mobile: !/^0\d{9}$/.test(v.mobile), agency: !v.agency.trim(), end: v.start && v.end && v.end < v.start };
  const save = () => { setTried(true); if (Object.values(err).some(Boolean)) return; setState('saving'); setTimeout(() => { setState('saved'); setTimeout(() => onSaved(v), 400); }, 700); };
  return (
    <Dialog title={agent ? 'تعديل الوكيل' : 'إضافة وكيل'} width={620} onClose={onClose} busy={state === 'saving'}
      footer={<><SaveStatus state={state} /><div style={{ display: 'flex', gap: 8 }}><Button variant="secondary" onClick={onClose}>إلغاء</Button><Button loading={state === 'saving'} onClick={save}>حفظ الوكيل</Button></div></>}>
      <div className="kit-form">
        <Field label="اسم الوكيل" required className="is-full" error={tried && err.name ? 'مطلوب' : undefined}><TextInput value={v.name} onChange={set('name')} /></Field>
        <Field label="رقم هوية الوكيل" required error={tried && err.idNo ? 'مطلوب' : undefined}><TextInput ltr value={v.idNo} onChange={set('idNo')} /></Field>
        <Field label="جوال الوكيل" required error={tried && err.mobile ? '10 أرقام تبدأ بـ 0' : undefined}><TextInput ltr inputMode="tel" value={v.mobile} onChange={set('mobile')} placeholder="05xxxxxxxx" /></Field>
        <Field label="رقم الوكالة" required className="is-full" error={tried && err.agency ? 'مطلوب' : undefined}><TextInput ltr value={v.agency} onChange={set('agency')} /></Field>
        <Field label="بداية الوكالة" optional><TextInput type="date" value={v.start} onChange={set('start')} /></Field>
        <Field label="انتهاء الوكالة" optional error={tried && err.end ? 'قبل تاريخ البداية' : undefined}><TextInput type="date" value={v.end} onChange={set('end')} /></Field>
        <Alert tone="neutral" style={{ gridColumn: '1/-1' }}>الوكالة تُسجل للمرجعية والمستندات فقط — لا تمنح الوكيل حساب دخول أو صلاحيات. لوصول البوابة أرسل دعوة من «الفريق والفروع».</Alert>
      </div>
    </Dialog>
  );
}
function TenantAgents({ tenant }) {
  const [rows, setRows] = React.useState(D.tenantAgents[tenant.id] || []);
  const [dlg, setDlg] = React.useState(null);
  const fmtD = (d) => d ? d.split('-').reverse().join('/') : 'غير مسجل';
  const saved = (v) => { const next = dlg.agent ? rows.map((a) => a.id === dlg.agent.id ? { ...a, ...v } : a) : [...rows, { ...v, id: 'ag' + Date.now(), files: 0 }]; D.tenantAgents[tenant.id] = next; setRows(next); setDlg(null); };
  return (
    <div style={{ display: 'grid', gap: 14 }}>
      <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}><p className="kit-scope" style={{ margin: 0 }}>الوكلاء الشرعيون للمستأجر. للمرجعية والمستندات — لا يمنحون دخولًا.</p><Button size="sm" icon="Plus" onClick={() => setDlg({})}>إضافة وكيل</Button></div>
      {!rows.length ? <StateView boxed kind="empty" icon="Users" title="لا وكلاء مسجلون" text="أضف الوكيل ورقم الوكالة وأرفق صورتها." actions={<Button variant="secondary" icon="Plus" onClick={() => setDlg({})}>إضافة وكيل</Button>} />
        : <div className="kit-cards">{rows.map((a) => { const [tone, label] = agentStatus(a); return (
          <article key={a.id} className="kit-card">
            <div style={{ display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'flex-start' }}><div><h3>{a.name}</h3><p>وكالة رقم <bdi className="ap-ltr">{a.agency}</bdi></p></div><StatusBadge size="sm" tone={tone} label={label} /></div>
            <dl><div><dt>الهوية</dt><dd><bdi className="ap-num">{a.idNo}</bdi></dd></div><div><dt>الجوال</dt><dd><bdi className="ap-num">{a.mobile}</bdi></dd></div><div><dt>المدة</dt><dd><bdi className="ap-num">{fmtD(a.start)} – {fmtD(a.end)}</bdi></dd></div></dl>
            <div style={{ display: 'flex', gap: 6 }}><Button size="sm" variant="secondary" icon="Paperclip" onClick={() => window.apOpen('attachments', { name: 'وكالة ' + a.name })}>مستندات الوكالة{a.files ? ' (' + a.files + ')' : ''}</Button><Button size="sm" variant="ghost" icon="Pencil" onClick={() => setDlg({ agent: a })}>تعديل</Button></div>
          </article>); })}</div>}
      {dlg && <AgentDialog agent={dlg.agent} onClose={() => setDlg(null)} onSaved={saved} />}
    </div>
  );
}

Object.assign(window, { DataDialogs, JoinScreen, WelcomeScreen, TenantAgents });
})();
