// Daily Report Form — מסך יצירת דוח יומי
(function(){
const { useState, useEffect, useMemo, useRef } = React;

const DailyReportForm = ({ projectId, editReportId, prefillData, onBack, onAfterSubmit }) => {
  const { isMobile, isLandscape } = useViewport();
  const project = YBP_DATA.projects.find(p => p.id === projectId);
  const contacts = React.useMemo(() => {
    try {
      const global = JSON.parse(localStorage.getItem('ybp_contacts_v1') || '[]');
      const projIds = (JSON.parse(localStorage.getItem('ybp_proj_contacts_v2') || '{}'))[projectId] || [];
      const proj = global.filter(c => projIds.includes(c.id));
      if (proj.length) return proj;
      if (global.length) return global;
    } catch {}
    return YBP_DATA.projectDetail?.contacts || [];
  }, [projectId]);
  const allTasks = YBP_DATA.projectDetail?.tasks || [];
  const user = (window.YBP_AUTH && window.YBP_AUTH.getCurrentUser) ? window.YBP_AUTH.getCurrentUser() : YBP_DATA.user;

  // Load edit report if editing
  const editReport = editReportId ? (SyncStore.get().reports || []).find(r => r.id === editReportId) : null;
  const ec = editReport?.content || {};

  const nextId = useMemo(() => SyncStore.peekNextReportId(projectId, 'daily'), [projectId]);

  const [date, setDate] = useState(editReport?.date || todayISO());
  const [dayStatus, setDayStatus] = useState(ec.dayStatus || 'normal');
  const [statusReason, setStatusReason] = useState(ec.statusReason || '');
  const [contractors, setContractors] = useState(ec.contractors || []);
  const [progress, setProgress] = useState(ec.progress?.map(p => ({ taskId: p.taskId, percentDone: p.percentDone })) || []);
  const [issues, setIssues] = useState(
    ec.issues
    || (!editReportId && prefillData?.structured?.issues)
    || (!editReportId && prefillData?.structured?.issuesFound)
    || ''
  );
  const [notes, setNotes] = useState(() => {
    if (ec.notes) return ec.notes;
    if (editReportId || !prefillData) return '';
    // אם AI חילץ rejects בנפרד — notes לא צריך להכיל את הטקסט המלא (מונע כפילות)
    const aiHasRejects = Array.isArray(prefillData.structured?.rejects) && prefillData.structured.rejects.length > 0;
    return prefillData.structured?.notes || (aiHasRejects ? '' : (prefillData.summaryText || ''));
  });
  const [rejects, setRejects] = useState(() => {
    if (editReport?.rejects) return editReport.rejects;
    if (!editReportId && prefillData) {
      // מקור עדיפות: structured.rejects (AI) → suggestedRejects (DataStore או bullet fallback)
      const aiRejects = Array.isArray(prefillData.structured?.rejects) ? prefillData.structured.rejects : [];
      const source = aiRejects.length ? aiRejects : (prefillData.suggestedRejects || []);
      if (source.length) {
        return source.map((r, i) => ({
          id: `r-pf-${Date.now()}-${i}`,
          title: r.title || '',
          description: r.description || '',
          trades: r.trades || [],
          assigneeId: '',
          assignee: r.assignee || '',
          severity: r.severity || 'medium',
          due: r.due || defaultDueDate(),
          photo: null,
        }));
      }
    }
    return [];
  });
  const [showSuppliers, setShowSuppliers] = useState(!!(ec.suppliers?.length));
  const [suppliers, setSuppliers] = useState(ec.suppliers?.length ? ec.suppliers : [{ name:'', item:'', note:'' }]);
  const [showVisits, setShowVisits] = useState(!!(ec.visits?.length));
  const [visits, setVisits] = useState(ec.visits?.length ? ec.visits : [{ name:'', role:'' }]);

  // ── Voice fill listener ───────────────────────────────────────────────────
  useEffect(() => {
    const handler = (e) => {
      const { formType, data } = e.detail || {};
      if (formType !== 'daily' || !data) return;
      if (data.issues) setIssues(data.issues);
      if (data.notes) setNotes(data.notes);
      if (data.statusReason) { setStatusReason(data.statusReason); setDayStatus('special'); }
      if (data.contractors && Array.isArray(data.contractors)) {
        setContractors(prev => {
          const newTrades = data.contractors.filter(t => !prev.find(p => p.trade === t));
          return [...prev, ...newTrades.map(t => ({ trade: t, count: null }))];
        });
      }
      if (data.rejectTitle) {
        setRejects(prev => [...prev, {
          id: `r-voice-${Date.now()}`,
          title: data.rejectTitle,
          description: data.rejectDescription || '',
          trades: [],
          assigneeId: '',
          assignee: data.rejectAssignee || '',
          severity: 'medium',
          due: data.rejectDue || defaultDueDate(),
          photo: null,
        }]);
      }
    };
    window.addEventListener('ybp-voice-fill', handler);
    return () => window.removeEventListener('ybp-voice-fill', handler);
  }, []);

  // Toggle contractor trade
  const toggleContractor = (trade) => {
    setContractors(prev => {
      const exists = prev.find(c => c.trade === trade);
      if (exists) return prev.filter(c => c.trade !== trade);
      return [...prev, { trade, count: null }];
    });
  };
  const setContractorCount = (trade, count) => {
    setContractors(prev => prev.map(c => c.trade === trade ? { ...c, count } : c));
  };

  // Task progress
  const toggleTask = (taskId) => {
    setProgress(prev => {
      const exists = prev.find(p => p.taskId === taskId);
      if (exists) return prev.filter(p => p.taskId !== taskId);
      return [...prev, { taskId, percentDone: 100 }];
    });
  };

  // Rejects
  const addReject = () => setRejects(r => [...r, {
    id: `r-${Date.now()}`, title:'', description:'', trades:[], assigneeId:'',
    severity:'medium', due: defaultDueDate(), photo: null,
  }]);
  const updateReject = (id, data) => setRejects(r => r.map(x => x.id === id ? data : x));
  const removeReject = (id) => setRejects(r => r.filter(x => x.id !== id));

  const [submittedReport, setSubmittedReport] = useState(null);
  const [cloudSaveStatus, setCloudSaveStatus] = useState(null); // null | 'saved' | 'pending'
  const [submitting, setSubmitting] = useState(false);

  // ── Draft / auto-save ────────────────────────────────────────────────────
  const userId = useMemo(() => {
    try { return JSON.parse(localStorage.getItem('ybp_auth_session') || '{}')?.email || 'unknown'; } catch { return 'unknown'; }
  }, []);
  const draftKey = `ybp_draft_daily_${projectId}_${userId}`;
  const [lastDraftSavedAt, setLastDraftSavedAt] = useState(null);
  const [cloudSavedAt, setCloudSavedAt] = useState(null);
  const [isDirty, setIsDirty] = useState(false);
  const [draftTick, setDraftTick]   = useState(0);
  const autoSaveTimer       = useRef(null);
  const isFirstRender       = useRef(true);
  const restorePromptShown  = useRef(false);

  // סמן טופס פעיל — מונע force-update בזמן עריכה
  useEffect(() => {
    window.YBP_FORM_DIRTY = true;
    window.YBP_CURRENT_SCREEN = 'daily-report';
    return () => { window.YBP_FORM_DIRTY = false; window.YBP_FORM_STATE_SNAPSHOT = null; };
  }, []);

  // minute ticker — refreshes age label
  useEffect(() => {
    const t = setInterval(() => setDraftTick(n => n + 1), 60000);
    return () => clearInterval(t);
  }, []);

  function formatDraftAge(savedAt) {
    const ms  = Date.now() - savedAt;
    const min = Math.floor(ms / 60000);
    if (min < 1)  return 'לפני פחות מדקה';
    if (min < 60) return `לפני ${min} דקות`;
    const hr = Math.floor(min / 60);
    if (hr < 24)  return `לפני ${hr} שעות`;
    const day = Math.floor(hr / 24);
    return `לפני ${day} ${day === 1 ? 'יום' : 'ימים'}`;
  }

  // שחזור טיוטה בעלייה (רק אם לא edit ולא prefill)
  useEffect(() => {
    if (editReportId || prefillData) return;
    if (restorePromptShown.current) return;
    restorePromptShown.current = true;
    (async () => {
      // סנכרן מ-Supabase לפני טעינה מ-localStorage (cross-device)
      try {
        const cloudResult = await window.loadDraftFromSupabase?.({ kind: 'daily', projectId });
        if (cloudResult?.formData?.savedAt) {
          const localDraft = cloudLoadSync(draftKey, null);
          if ((cloudResult.formData.savedAt || 0) > (localDraft?.savedAt || 0)) {
            await cloudSave(draftKey, cloudResult.formData);
          }
        }
      } catch (_) {}
      const draft = await cloudLoad(draftKey);
      if (!draft?.savedAt) return;
      const ageLabel = formatDraftAge(draft.savedAt);
      const doLoad = () => {
        if (draft.date !== undefined)          setDate(draft.date);
        if (draft.dayStatus !== undefined)     setDayStatus(draft.dayStatus);
        if (draft.statusReason !== undefined)  setStatusReason(draft.statusReason);
        if (draft.contractors)                 setContractors(draft.contractors);
        if (draft.progress)                    setProgress(draft.progress);
        if (draft.issues !== undefined)        setIssues(draft.issues);
        if (draft.notes !== undefined)         setNotes(draft.notes);
        if (draft.rejects)                     setRejects(draft.rejects);
        if (draft.suppliers)                   { setSuppliers(draft.suppliers); setShowSuppliers(true); }
        if (draft.visits)                      { setVisits(draft.visits);    setShowVisits(true); }
        setLastDraftSavedAt(draft.savedAt);
      };
      if (typeof window.confirmDialog === 'function') {
        window.confirmDialog({
          title: 'יש טיוטה ממתינה',
          message: `נשמרה ${ageLabel}. להמשיך עריכה?`,
          confirmText: 'המשך עריכה',
          cancelText: 'התחל מחדש',
          onConfirm: doLoad,
          onCancel: () => cloudSave(draftKey, null),
        });
      } else if (window.confirm(`יש טיוטה שנשמרה ${ageLabel}. להמשיך עריכה?`)) {
        doLoad();
      } else {
        cloudSave(draftKey, null);
      }
    })();
  }, []); // eslint-disable-line react-hooks/exhaustive-deps

  // isDirty — מסמן שינוי בכל שדה
  useEffect(() => {
    if (isFirstRender.current) { isFirstRender.current = false; return; }
    setIsDirty(true);
  }, [date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits]);

  // snapshot לemergency save — מתעדכן בכל render
  useEffect(() => {
    window.YBP_FORM_STATE_SNAPSHOT = { projectId, date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits };
  });

  // auto-save — debounce 30 שניות
  useEffect(() => {
    if (!isDirty) return;
    if (autoSaveTimer.current) clearTimeout(autoSaveTimer.current);
    autoSaveTimer.current = setTimeout(async () => {
      const now = Date.now();
      const formData = { date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits, savedAt: now };
      await cloudSave(draftKey, formData);
      window.upsertDraftReport?.({ draftKey, kind: 'daily', projectId, reportDate: date, formData }).catch(() => {});
      setLastDraftSavedAt(now);
      setCloudSavedAt(now);
      setIsDirty(false);
    }, 30000);
    return () => { if (autoSaveTimer.current) clearTimeout(autoSaveTimer.current); };
  }, [isDirty, date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits]); // eslint-disable-line

  const handleSaveDraft = async () => {
    const now = Date.now();
    const formData = { date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits, savedAt: now };
    await cloudSave(draftKey, formData);
    window.upsertDraftReport?.({ draftKey, kind: 'daily', projectId, reportDate: date, formData }).catch(() => {});
    setLastDraftSavedAt(now);
    setCloudSavedAt(now);
    setIsDirty(false);
    if (typeof window.toastSuccess === 'function') window.toastSuccess('טיוטה נשמרה');
  };

  const handleDeleteDraft = async () => {
    if (!window.confirm('למחוק את הטיוטה ולצאת? פעולה זו לא ניתנת לביטול.')) return;
    try {
      if (typeof YBP_AUTH !== 'undefined' && YBP_AUTH.appendAuditEvent) {
        const session = YBP_AUTH.getSession();
        const snapshot = { kind: 'daily', projectId, date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits };
        YBP_AUTH.appendAuditEvent({
          action: 'delete-draft',
          actor: session?.name || 'מנהל',
          detail: `מחק טיוטת דוח יומי לפרויקט ${projectId}`,
          snapshot: JSON.stringify(snapshot),
        });
      }
    } catch (e) { console.warn('[deleteDraft] audit log:', e); }
    try {
      if (window.cloudSave) await window.cloudSave(draftKey, null);
      localStorage.removeItem(draftKey);
    } catch (e) { console.warn('[deleteDraft] cloudSave/localStorage:', e); }
    if (editReportId && window.deleteReportFromSupabase) {
      try { await window.deleteReportFromSupabase(editReportId); }
      catch (e) { console.warn('[deleteDraft] Supabase delete:', e); }
    }
    if (typeof window.toastSuccess === 'function') window.toastSuccess('הטיוטה נמחקה');
    onBack && onBack();
  };

  const handleForceCloudSave = async () => {
    const now = Date.now();
    const formData = { date, dayStatus, statusReason, contractors, progress, issues, notes, rejects, suppliers, visits, savedAt: now };
    await cloudSave(draftKey, formData);
    window.upsertDraftReport?.({ draftKey, kind: 'daily', projectId, reportDate: date, formData }).catch(() => {});
    setLastDraftSavedAt(now);
    setCloudSavedAt(now);
    if (typeof window.toastSuccess === 'function') window.toastSuccess('נשמר ב-cloud ✓');
  };

  // בנה HTML לדוח יומי (preview + print)
  const buildPdfParts = () => {
    const fmtD2 = iso => { if (!iso) return '—'; const d = new Date(iso + 'T00:00:00'); return String(d.getDate()).padStart(2,'0')+'/'+String(d.getMonth()+1).padStart(2,'0')+'/'+d.getFullYear(); };
    const dateStr = fmtD2(date);
    const tmpId = nextId || 'טיוטה';
    const rejectsHtml = rejects.length ? `<div class="sec"><div class="sec-lbl">ריג'קטים (${rejects.length})</div><table class="d"><thead><tr><th>#</th><th>ממצא</th><th>תיאור</th><th>אחראי</th><th>יעד</th></tr></thead><tbody>${rejects.map((r,i)=>`<tr class="reject-card"><td style="text-align:center;font-weight:700">${i+1}</td><td style="font-weight:600">${r.title||'—'}</td><td style="font-size:10px;color:#4b5563">${r.description||'—'}</td><td style="font-size:10px">${r.assignee||'—'}</td><td style="font-weight:600;font-size:10px;color:#1a2c4a">${fmtD2(r.due)}</td></tr>`).join('')}</tbody></table></div>` : '';
    const contractorsHtml = contractors.length ? `<div class="sec"><div class="sec-lbl">קבלנים באתר</div><div style="display:flex;flex-wrap:wrap;gap:5px">${contractors.map(co=>`<span style="padding:4px 10px;border-radius:12px;background:#eff6ff;color:#1d4ed8;font-size:11px;font-weight:600;border:1px solid #dbeafe">${co.trade}${co.count?' × '+co.count:''}</span>`).join('')}</div></div>` : '';
    const dayStatusHtml = `<div class="sec"><div class="sec-lbl">סטטוס יום</div><div style="padding:7px 10px;background:#d1fae5;border-right:3px solid #10b981;border-radius:4px;font-size:12px;font-weight:700;color:#065f46">${dayStatus==='normal'?'✓ יום עבודה תקין':dayStatus==='delayed'?'⚠️ עיכובים':dayStatus}${statusReason?' — '+statusReason:''}</div></div>`;
    const progressHtml = progress.length ? `<div class="sec"><div class="sec-lbl">התקדמות</div>${progress.map(p=>{const t=allTasks.find(tt=>tt.id===p.taskId);return `<div style="display:flex;align-items:center;gap:7px;padding:5px 8px;background:#f0fdf4;border-radius:4px;margin-bottom:3px"><span style="color:#10b981">✓</span><span style="flex:1;font-size:11px">${t?.title||''}</span><span style="font-size:11px;font-weight:700;color:#1d4ed8">${p.percentDone||0}%</span></div>`;}).join('')}</div>` : '';
    const issuesHtml = issues ? `<div class="sec"><div class="sec-lbl">בעיות</div><div style="padding:10px;background:#fef3c7;border-radius:5px;font-size:11px;color:#713f12;border-right:3px solid #d97706;white-space:pre-wrap">${issues}</div></div>` : '';
    const notesHtml = notes ? `<div class="sec"><div class="sec-lbl">הערות</div><div style="font-size:11.5px;color:#374151;line-height:1.6;white-space:pre-wrap">${notes}</div></div>` : '';
    const suppliersHtml = (showSuppliers && suppliers.filter(s=>s.name||s.item).length) ? `<div class="sec"><div class="sec-lbl">ספקים / חומרים שהגיעו</div><table class="d"><thead><tr><th>ספק</th><th>פריט</th><th>הערה</th></tr></thead><tbody>${suppliers.filter(s=>s.name||s.item).map(s=>`<tr><td>${s.name||''}</td><td>${s.item||''}</td><td style="color:#6b7280">${s.note||'—'}</td></tr>`).join('')}</tbody></table></div>` : '';
    const visitsHtml = (showVisits && visits.filter(v=>v.name).length) ? `<div class="sec"><div class="sec-lbl">ביקורים באתר</div>${visits.filter(v=>v.name).map(v=>`<div style="padding:5px 8px;background:#fafbfc;border-radius:4px;font-size:11px;margin-bottom:3px"><strong>${v.name||''}</strong>${v.role?' · '+v.role:''}</div>`).join('')}</div>` : '';
    const headerMetaHtml = `<div class="mb"><div><span class="badge">DAILY REPORT — DRAFT</span></div><div style="text-align:left"><div style="font-family:ui-monospace,Menlo,monospace;font-size:13px;font-weight:700;color:#1a2c4a">${tmpId}</div><div style="font-size:11px;color:#9ca3af;margin-top:2px">${dateStr}</div></div></div><div class="sec" style="padding-bottom:8px"><h2 style="font-size:22px;font-weight:700;color:#0f1e38;line-height:1.2;margin-bottom:6px">דוח יומי — ${dateStr}</h2>${project?.name?`<div style="font-size:13px;color:#6b7280">פרויקט: <strong style="color:#1f2937">${project.name}</strong>${project.address?' · '+project.address:''}</div>`:''}</div><div class="sec" style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:12px;background:#fef3c7;border-radius:4px;border:1px solid #fde68a"><div style="text-align:center"><div style="font-size:10px;color:#6b7280;font-weight:700;margin-bottom:3px">תאריך</div><div style="font-size:12px;font-weight:600;color:#1f2937">${dateStr}</div></div><div style="text-align:center"><div style="font-size:10px;color:#6b7280;font-weight:700;margin-bottom:3px">נוצר על ידי</div><div style="font-size:12px;font-weight:600;color:#1f2937">${user?.name||''}</div></div><div style="text-align:center"><div style="font-size:10px;color:#b45309;font-weight:700;margin-bottom:3px">סטטוס</div><div style="font-size:12px;font-weight:600;color:#b45309">✏️ טיוטה</div></div></div>`;
    const bodyHtml = [dayStatusHtml, contractorsHtml, progressHtml, rejectsHtml, issuesHtml, suppliersHtml, visitsHtml, notesHtml].join('');
    return { headerMetaHtml, bodyHtml };
  };

  const handlePreviewPdf = () => {
    if (typeof window.YBPPdf === 'undefined') { alert('מודול PDF לא טעון'); return; }
    const { headerMetaHtml, bodyHtml } = buildPdfParts();
    const logoSrc = document.querySelector('img[alt="YBP"]')?.src || '';
    const fmtD2 = iso => { if (!iso) return ''; const d = new Date(iso+'T00:00:00'); return String(d.getDate()).padStart(2,'0')+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+d.getFullYear(); };
    window.YBPPdf.generatePdf({ orientation:'portrait', logoSrc, fileName:`${fmtD2(date)}_${project?.name||''}_יומי_טיוטה`, headerMetaHtml, bodyHtml, sigHtml:'', projectId, uploadToDrive: false });
  };

  const handlePrint = () => {
    if (typeof window.YBPPdf === 'undefined') { alert('מודול PDF לא טעון'); return; }
    const { headerMetaHtml, bodyHtml } = buildPdfParts();
    const logoSrc = document.querySelector('img[alt="YBP"]')?.src || '';
    const fmtD2 = iso => { if (!iso) return ''; const d = new Date(iso+'T00:00:00'); return String(d.getDate()).padStart(2,'0')+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+d.getFullYear(); };
    window.YBPPdf.openPrintWindow({ orientation:'portrait', logoSrc, fileName:`${fmtD2(date)}_${project?.name||''}_יומי_טיוטה`, headerMetaHtml, bodyHtml, sigHtml:'' });
  };

  const handleSubmit = async () => {
    if (submitting) return;
    setSubmitting(true);
    try {
      const reportId = editReport ? editReport.id : SyncStore.nextReportId(projectId, 'daily');
      const report = {
        id: reportId,
        projectId,
        kind: 'daily',
        title: `דוח יומי — ${fmtDateHe(date)}`,
        date,
        author: (user.name || '').split(' ')[0] || user.name,   // v78 — שם ראשון בלבד
        content: {
          dayStatus, statusReason,
          contractors,
          progress: progress.map(p => {
            const t = allTasks.find(tt => tt.id === p.taskId);
            return { taskId: p.taskId, title: t?.title, percentDone: p.percentDone };
          }),
          issues, notes,
          suppliers: showSuppliers ? suppliers.filter(s => s.name || s.item) : [],
          visits: showVisits ? visits.filter(v => v.name) : [],
        },
        rejects,
      };
      await SyncStore.submitSiteReport(report);
      if (prefillData?.summaryId) {
        window.PendingSummariesAPI?.approveUsed(prefillData.summaryId);
      }
      // שמור ל-Supabase — זה הצעד הקריטי
      const saveResult = window.saveReportAsSent
        ? await window.saveReportAsSent(draftKey, report)
        : { ok: false, error: 'saveReportAsSent not available' };
      // נקה טיוטה גם אם הענן נכשל (הדוח קיים ב-localStorage)
      cloudSave(draftKey, null);
      setCloudSaveStatus(saveResult.ok ? 'saved' : 'pending');
      setSubmittedReport(report);
      // לא קוראים onBack — מציגים פאנל הצלחה
    } catch (e) {
      console.error('[DailyReport] handleSubmit error:', e);
      if (window.toastError) window.toastError('שגיאה בשמירת הדוח');
    } finally {
      setSubmitting(false);
    }
  };

  const handleSubmitAll = async () => {
    await handleSubmit();
  };

  const statusOpt = YBP_DAY_STATUS.find(s => s.k === dayStatus);

  // גובה ה-bottom nav של AppShell במובייל (60px portrait, 48px landscape) — דרוש כדי שה-action bar הקבוע
  // לא יוסתר על ידי הבר התחתון של הטאבים.
  const tabBarH = isMobile ? (isLandscape ? 48 : 60) : 0;
  const actionBarH = 64; // הערכת גובה ה-action bar עצמו (כולל padding 12+12 + 40 גובה כפתור)

  return (
    <div style={{ minHeight:'100%', background:'#f6f7f9', fontFamily:'Assistant, sans-serif', direction:'rtl', paddingBottom: tabBarH + actionBarH + 16 }}>
      {/* TODO(photos): פיצ'ר הוספת תמונות אחרי דוח הוסר ב-v3.9.0.41 — צריך לתכנן מחדש זרימת תמונות→Drive. */}
      {/* Header */}
      <header style={{
        background:'#fff', borderBottom:'1px solid #e5e7eb', padding:'12px 24px',
        display:'flex', alignItems:'center', gap:12, position:'sticky', top:0, zIndex:10,
      }}>
        <button onClick={onBack} style={{
          background:'transparent', border:'none', cursor:'pointer', color:'#6b7280',
          display:'flex', alignItems:'center', gap:4, fontSize:14, padding:6, fontFamily:'inherit',
        }}>
          <Icon name="chevron" size={18}/> חזרה
        </button>
        <div style={{ width:1, height:24, background:'#e5e7eb' }}/>
        <div style={{ flex:1 }}>
          <div style={{ fontSize:11, color:'#6b7280', fontWeight:600 }}>
            {project?.name} · <span style={{ fontFamily:'ui-monospace, Menlo, monospace', color:'#1d4ed8' }}>{nextId}</span>
          </div>
          <div style={{ display:'flex', alignItems:'center', gap:8 }}>
            <h1 style={{ margin:0, fontSize:17, fontWeight:700, color:'#1f2937' }}>
              {editReport ? 'עריכת דוח יומי' : 'דוח יומי חדש'}
            </h1>
            {cloudSavedAt && Date.now() - cloudSavedAt < 300000 ? (
              <span style={{ fontSize:11, color:'#10b981', fontWeight:600 }}>
                ☁️ נשמר ב-cloud {formatDraftAge(cloudSavedAt)} {draftTick > -1 ? '' : ''}
              </span>
            ) : lastDraftSavedAt ? (
              <span style={{ fontSize:11, color:'#f59e0b', fontWeight:600 }}>
                📱 נשמר במכשיר ·{' '}
                <button onClick={handleForceCloudSave} style={{ background:'none', border:'none', color:'#1a2c4a', fontWeight:700, cursor:'pointer', fontFamily:'inherit', fontSize:11, padding:0 }}>
                  שמור ב-cloud
                </button>
                {draftTick > -1 ? '' : ''}
              </span>
            ) : isDirty ? (
              <span style={{ fontSize:11, color:'#ef4444', fontWeight:600 }}>● לא נשמר</span>
            ) : null}
          </div>
        </div>
      </header>

      {/* Draft / PDF toolbar */}
      <div style={{
        background:'#fff', borderBottom:'1px solid #e5e7eb',
        padding: isMobile ? '8px 12px' : '8px 24px',
        display:'flex', gap:8, flexWrap:'wrap',
      }}>
        {[
          { label:'שמור טיוטה', icon:'💾', onClick: handleSaveDraft },
          { label:'תצוגת PDF',  icon:'👁️', onClick: handlePreviewPdf },
          { label:'הדפס',       icon:'🖨️', onClick: handlePrint },
        ].map(({ label, icon, onClick }) => (
          <button key={label} onClick={onClick} style={{
            flex: isMobile ? '1 1 calc(33% - 6px)' : '0 0 auto',
            minHeight:44, padding:'8px 14px',
            borderRadius:8, border:'1px solid #e5e7eb', background:'#fafbfc',
            color:'#374151', fontSize:13, fontWeight:600,
            cursor:'pointer', fontFamily:'inherit',
            display:'flex', alignItems:'center', justifyContent:'center', gap:6,
          }}>
            <span style={{ fontSize:16 }}>{icon}</span>
            {label}
          </button>
        ))}
      </div>

      {/* Form */}
      <div style={{ maxWidth: 820, margin:'0 auto', padding: isMobile ? '12px 14px' : '20px 24px', display:'flex', flexDirection:'column', gap:16 }}>

        {/* Day status + Date */}
        <Section title="פרטי היום">
          <div style={{ display:'grid', gridTemplateColumns: isMobile ? '1fr' : '180px 1fr', gap:12 }}>
            <div>
              <label style={ybpLabelSt}>תאריך</label>
              <input type="date" value={date} onChange={e => setDate(e.target.value)} style={ybpInputSt}/>
            </div>
            <div>
              <label style={ybpLabelSt}>סטטוס יום</label>
              <div style={{ display:'flex', gap:6, flexWrap:'wrap' }}>
                {YBP_DAY_STATUS.map(s => (
                  <button key={s.k} onClick={() => setDayStatus(s.k)} style={{
                    flex:'1 1 100px', padding:'9px 10px', borderRadius:6, fontSize:13, fontWeight:600, minHeight:44,
                    border: dayStatus === s.k ? `1px solid ${s.color}` : '1px solid #e5e7eb',
                    background: dayStatus === s.k ? `${s.color}15` : '#fff',
                    color: dayStatus === s.k ? s.color : '#6b7280',
                    cursor:'pointer', fontFamily:'inherit',
                  }}>
                    <span style={{
                      display:'inline-block', width:6, height:6, borderRadius:6,
                      background: s.color, marginLeft:6, verticalAlign:'middle',
                    }}/>
                    {s.label}
                  </button>
                ))}
              </div>
            </div>
          </div>
          {dayStatus !== 'normal' && (
            <div style={{ marginTop:10 }}>
              <label style={ybpLabelSt}>סיבה ל{statusOpt?.label}</label>
              <input value={statusReason} onChange={e => setStatusReason(e.target.value)}
                placeholder="לדוגמה: גשם כבד, אירוע בטיחות, קבלן לא הגיע..."
                style={ybpInputSt}
              />
            </div>
          )}
        </Section>

        {/* Contractors on site */}
        <Section title="קבלנים באתר היום" subtitle="בחר את בעלי המקצוע שעבדו באתר. ניתן להוסיף כמות (לא חובה).">
          <div style={{ display:'flex', flexWrap:'wrap', gap:6 }}>
            {YBP_TRADES.map(t => {
              const on = contractors.find(c => c.trade === t);
              return (
                <div key={t} style={{
                  display:'flex', alignItems:'center', borderRadius:18, overflow:'hidden',
                  border: on ? '1px solid #1d4ed8' : '1px solid #e5e7eb',
                  background: on ? '#eff6ff' : '#fff',
                  transition:'all 0.1s',
                }}>
                  <button onClick={() => toggleContractor(t)} style={{
                    padding:'6px 12px', fontSize:13, fontWeight:500,
                    background:'transparent', border:'none',
                    color: on ? '#1d4ed8' : '#6b7280',
                    cursor:'pointer', fontFamily:'inherit',
                  }}>
                    {on && <span style={{ fontWeight:700, marginLeft:4 }}>✓</span>}
                    {t}
                  </button>
                  {on && (
                    <input
                      type="number" min="1" max="99"
                      value={on.count || ''}
                      onChange={e => setContractorCount(t, e.target.value ? parseInt(e.target.value) : null)}
                      placeholder="×"
                      style={{
                        width:40, padding:'6px 4px', fontSize:12, fontWeight:700,
                        border:'none', borderRight:'1px solid #bfdbfe', background:'rgba(255,255,255,0.6)',
                        color:'#1d4ed8', textAlign:'center', outline:'none', fontFamily:'inherit',
                      }}
                      onClick={e => e.stopPropagation()}
                    />
                  )}
                </div>
              );
            })}
          </div>
        </Section>

        {/* Task progress */}
        <Section title="התקדמות — משימות שקידמנו היום" subtitle="סמן משימות שהתקדמו. הסטטוס יתעדכן אוטומטית.">
          {allTasks.filter(t => t.status !== 'done').length === 0 ? (
            <div style={{ fontSize:13, color:'#9ca3af', padding:'16px 0' }}>אין משימות פעילות.</div>
          ) : (
            <div style={{ display:'flex', flexDirection:'column', gap:6 }}>
              {allTasks.filter(t => t.status !== 'done').slice(0, 8).map(t => {
                const sel = progress.find(p => p.taskId === t.id);
                return (
                  <label key={t.id} style={{
                    display:'flex', alignItems:'center', gap:10, padding:'8px 10px', borderRadius:6,
                    background: sel ? '#eff6ff' : '#fafbfc',
                    border: sel ? '1px solid #bfdbfe' : '1px solid transparent',
                    cursor:'pointer', transition:'all 0.1s',
                  }}>
                    <input type="checkbox" checked={!!sel} onChange={() => toggleTask(t.id)}
                      style={{ width:16, height:16, accentColor:'#1d4ed8', cursor:'pointer' }}
                    />
                    <div style={{ flex:1, fontSize:13, color:'#1f2937' }}>{t.title}</div>
                    <div style={{ fontSize:11, color:'#6b7280' }}>{t.team}</div>
                    {sel && (
                      <div style={{ display:'flex', alignItems:'center', gap:4 }}>
                        <input
                          type="range" min="0" max="100" step="5"
                          value={sel.percentDone}
                          onChange={e => setProgress(p => p.map(x => x.taskId === t.id ? { ...x, percentDone: parseInt(e.target.value) } : x))}
                          onClick={e => e.stopPropagation()}
                          style={{ width:80, accentColor:'#1d4ed8' }}
                        />
                        <div style={{ width:38, fontSize:12, fontWeight:700, color:'#1d4ed8', textAlign:'center' }}>
                          {sel.percentDone}%
                        </div>
                      </div>
                    )}
                  </label>
                );
              })}
            </div>
          )}
        </Section>

        {/* Rejects */}
        <Section title="ריג׳קטים מהיום" subtitle="כל ריג׳קט יפתח משימה חדשה עם אחראי ותאריך יעד.">
          <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
            {rejects.map((r, i) => (
              <RejectCard key={r.id} reject={r} idx={i} contacts={contacts}
                onChange={data => updateReject(r.id, data)}
                onRemove={() => removeReject(r.id)}
              />
            ))}
            <button onClick={addReject} style={{
              padding:'12px', borderRadius:8, border:'1px dashed #cbd5e1', background:'#fff',
              color:'#475569', fontSize:13, fontWeight:600, cursor:'pointer', fontFamily:'inherit',
              display:'flex', alignItems:'center', justifyContent:'center', gap:6,
            }}>
              <Icon name="plus" size={16}/> הוסף ריג׳קט
            </button>
          </div>
        </Section>

        {/* Issues + notes */}
        <Section title="בעיות ואבני דרך" subtitle="מה תוקע, מה דחוף, החלטות שצריך.">
          <textarea value={issues} onChange={e => setIssues(e.target.value)}
            placeholder="לדוגמה: ממתין לאישור יועץ קונסטרוקציה על שינוי בתקרה..."
            rows={3} style={ybpTextareaSt}
          />
        </Section>

        <Section title="הערות">
          <textarea value={notes} onChange={e => setNotes(e.target.value)}
            placeholder="הערות כלליות של מנהל הפרויקט..."
            rows={2} style={ybpTextareaSt}
          />
        </Section>

        {/* Optional sections */}
        <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
          <OptionalSection
            title="ספקים / חומרים שהגיעו"
            active={showSuppliers} onToggle={() => setShowSuppliers(!showSuppliers)}
          >
            {suppliers.map((s, i) => (
              <div key={i} style={{ display:'grid', gridTemplateColumns: isMobile ? '1fr 1fr' : '1fr 1fr 1.3fr 32px', gap:8, marginBottom:8 }}>
                <input value={s.name} onChange={e => setSuppliers(a => a.map((x,j)=>j===i?{...x, name:e.target.value}:x))}
                  placeholder="שם ספק" style={ybpInputSt}/>
                <input value={s.item} onChange={e => setSuppliers(a => a.map((x,j)=>j===i?{...x, item:e.target.value}:x))}
                  placeholder="מה הגיע" style={ybpInputSt}/>
                <input value={s.note} onChange={e => setSuppliers(a => a.map((x,j)=>j===i?{...x, note:e.target.value}:x))}
                  placeholder="הערה" style={ybpInputSt}/>
                <button onClick={() => setSuppliers(a => a.filter((_,j)=>j!==i))} style={iconBtnSt}>
                  <Icon name="close" size={14}/>
                </button>
              </div>
            ))}
            <button onClick={() => setSuppliers(a => [...a, { name:'', item:'', note:'' }])} style={addRowSt}>
              + שורה נוספת
            </button>
          </OptionalSection>

          <OptionalSection
            title="ביקורים באתר"
            active={showVisits} onToggle={() => setShowVisits(!showVisits)}
          >
            {visits.map((v, i) => (
              <div key={i} style={{ display:'grid', gridTemplateColumns: isMobile ? '1fr 32px' : '1fr 1fr 32px', gap:8, marginBottom:8 }}>
                <input value={v.name} onChange={e => setVisits(a => a.map((x,j)=>j===i?{...x, name:e.target.value}:x))}
                  placeholder="שם המבקר" style={ybpInputSt}/>
                <input value={v.role} onChange={e => setVisits(a => a.map((x,j)=>j===i?{...x, role:e.target.value}:x))}
                  placeholder="תפקיד (לקוח/אדריכל/פקח)" style={ybpInputSt}/>
                <button onClick={() => setVisits(a => a.filter((_,j)=>j!==i))} style={iconBtnSt}>
                  <Icon name="close" size={14}/>
                </button>
              </div>
            ))}
            <button onClick={() => setVisits(a => [...a, { name:'', role:'' }])} style={addRowSt}>
              + שורה נוספת
            </button>
          </OptionalSection>
        </div>

        {/* Auto signature */}
        <div style={{
          background:'#f9fafb', border:'1px solid #f3f4f6', borderRadius:8, padding:'12px 14px',
          display:'flex', alignItems:'center', gap:12,
        }}>
          {user.signatureImage
            ? <img src={user.signatureImage} alt="חתימה" style={{ height:40, maxWidth:160, objectFit:'contain' }}/>
            : <Icon name="check" size={14} color="#10b981"/>
          }
          <span style={{ fontSize:12, color:'#6b7280' }}>
            ייחתם אוטומטית: <strong style={{ color:'#1f2937' }}>{user.name}</strong> · {user.role} · {fmtDateHe(date)}
          </span>
        </div>
      </div>

      {/* Action bar — sticky so it scrolls with the form and doesn't cover FABs */}
      <div style={{
        position:'sticky', bottom:0, background:'#fff',
        borderTop:'1px solid #e5e7eb', padding: isMobile ? '10px 14px' : '12px 24px', zIndex: 800,
        display:'flex', alignItems:'center', gap:12, justifyContent:'space-between',
        marginTop:16,
      }}>
        <div style={{ fontSize:12, color:'#6b7280' }}>
          {rejects.length > 0 && <span>{rejects.length} ריג׳קטים · יהפכו ל-{rejects.length} משימות</span>}
        </div>
        <div style={{ display:'flex', gap:10 }}>
          <button onClick={handleDeleteDraft} style={{
            padding:'9px 14px', borderRadius:6,
            border:'1px solid var(--ybp-danger-bg,#fecaca)',
            background:'var(--ybp-panel,#fff)', color:'var(--ybp-danger,#dc2626)',
            fontSize:13, fontWeight:600, cursor:'pointer', fontFamily:'inherit',
            display:'flex', alignItems:'center', gap:6,
          }}>🗑 מחק טיוטה</button>
          <button onClick={onBack} style={{
            padding:'9px 18px', borderRadius:6, border:'1px solid #e5e7eb', background:'#fff',
            color:'#6b7280', fontSize:13, fontWeight:600, cursor:'pointer', fontFamily:'inherit',
          }}>ביטול</button>
          <button onClick={handleSubmit} disabled={submitting} style={{
            padding:'9px 18px', borderRadius:6, border:'none',
            background: submitting ? '#9ca3af' : '#1d4ed8',
            color:'#fff', fontSize:13, fontWeight:700,
            cursor: submitting ? 'not-allowed' : 'pointer', fontFamily:'inherit',
            display:'flex', alignItems:'center', gap:6,
          }}>
            <Icon name="send" size={14}/> {submitting ? 'מפיק דוח...' : 'הפק דוח'}
          </button>
          <button onClick={handleSubmitAll} disabled={submitting} style={{
            padding:'9px 18px', borderRadius:6, border:'none',
            background: submitting ? '#9ca3af' : '#059669',
            color:'#fff', fontSize:13, fontWeight:700,
            cursor: submitting ? 'not-allowed' : 'pointer', fontFamily:'inherit',
            display:'flex', alignItems:'center', gap:6,
          }}>
            <Icon name="check-circle" size={14}/> {submitting ? 'שולח...' : 'שלח הכל'}
          </button>
        </div>
      </div>

      {/* פאנל הצלחה — מופיע אחרי הפקת דוח */}
      {submittedReport && (
        <div style={{
          position: 'fixed', bottom: tabBarH, left: 0, right: 0,
          background: '#fff', borderTop: '2px solid #e5e7eb',
          borderRadius: '16px 16px 0 0',
          boxShadow: '0 -8px 32px rgba(0,0,0,0.12)',
          padding: '20px 16px 24px', zIndex: 50,
          direction: 'rtl', fontFamily: 'Assistant, sans-serif',
        }}>
          {/* כותרת */}
          <div style={{ display:'flex', alignItems:'center', gap:10, marginBottom:16 }}>
            <div style={{
              width: 40, height: 40, borderRadius: '50%',
              background: cloudSaveStatus === 'saved' ? '#dcfce7' : '#fef3c7',
              display:'flex', alignItems:'center', justifyContent:'center', fontSize:20, flexShrink:0
            }}>
              {cloudSaveStatus === 'saved' ? '✓' : '⏳'}
            </div>
            <div>
              <div style={{ fontSize:16, fontWeight:700, color:'#1f2937' }}>
                {cloudSaveStatus === 'saved' ? 'הדוח הופק ונשמר ✓' : 'הדוח הופק'}
              </div>
              <div style={{ fontSize:12, color: cloudSaveStatus === 'saved' ? '#16a34a' : '#d97706' }}>
                {cloudSaveStatus === 'saved'
                  ? 'נשמר בענן בהצלחה'
                  : '⚠️ ממתין לחיבור — נשמר במכשיר'}
              </div>
            </div>
          </div>

          {/* אפשרויות שליחה */}
          <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:8, marginBottom:12 }}>
            {[
              { icon:'📄', label:'הורד PDF', action: () => {
                if (window.generateReportPDF) window.generateReportPDF(submittedReport);
                else if (window.toastInfo) window.toastInfo('PDF בהכנה...');
              }},
              { icon:'💬', label:'WhatsApp', action: () => {
                const text = `דוח יומי — ${submittedReport.title || ''}\nפרויקט: ${submittedReport.projectId}\nתאריך: ${submittedReport.date}`;
                window.open(`https://wa.me/?text=${encodeURIComponent(text)}`, '_blank');
              }},
              { icon:'✉️', label:'מייל', action: () => {
                const subj = encodeURIComponent(submittedReport.title || 'דוח יומי');
                const body = encodeURIComponent(`דוח יומי — ${submittedReport.date}`);
                window.open(`https://mail.google.com/mail/?view=cm&su=${subj}&body=${body}`, '_blank');
              }},
            ].map(({ icon, label, action }) => (
              <button key={label} onClick={action} style={{
                padding:'12px 4px', borderRadius:10, border:'1px solid #e5e7eb',
                background:'#f9fafb', cursor:'pointer', fontFamily:'inherit',
                display:'flex', flexDirection:'column', alignItems:'center', gap:4,
              }}>
                <span style={{ fontSize:22 }}>{icon}</span>
                <span style={{ fontSize:11, fontWeight:600, color:'#374151' }}>{label}</span>
              </button>
            ))}
          </div>

          {/* כפתור סגירה */}
          <button onClick={() => { setSubmittedReport(null); onAfterSubmit ? onAfterSubmit(submittedReport) : onBack(); }}
            style={{
              width:'100%', padding:'12px', borderRadius:10, border:'none',
              background:'#1a2c4a', color:'#fff', fontSize:14, fontWeight:700,
              cursor:'pointer', fontFamily:'inherit',
            }}>
            סיום וחזרה לפרויקט
          </button>
        </div>
      )}
    </div>
  );
};

// Section wrapper
const Section = ({ title, subtitle, children }) => (
  <div style={{
    background:'#fff', border:'1px solid #e5e7eb', borderRadius:10, padding:18,
  }}>
    <div style={{ marginBottom: subtitle ? 4 : 12 }}>
      <h3 style={{ margin:0, fontSize:14, fontWeight:700, color:'#1f2937' }}>{title}</h3>
      {subtitle && <div style={{ fontSize:12, color:'#9ca3af', marginTop:2 }}>{subtitle}</div>}
    </div>
    <div style={{ marginTop: subtitle ? 14 : 0 }}>{children}</div>
  </div>
);

// Collapsible optional section
const OptionalSection = ({ title, active, onToggle, children }) => (
  <div style={{
    background: active ? '#fff' : '#fafbfc',
    border: active ? '1px solid #e5e7eb' : '1px dashed #e5e7eb',
    borderRadius:10, overflow:'hidden',
  }}>
    <button onClick={onToggle} style={{
      width:'100%', padding:'12px 18px', background:'transparent', border:'none',
      display:'flex', alignItems:'center', justifyContent:'space-between', cursor:'pointer',
      fontFamily:'inherit', textAlign:'right',
    }}>
      <span style={{ fontSize:13, fontWeight:600, color: active ? '#1f2937' : '#6b7280' }}>
        {active ? title : `+ ${title}`}
      </span>
      {active && <Icon name="chevronD" size={14} color="#9ca3af"/>}
    </button>
    {active && <div style={{ padding:'0 18px 16px' }}>{children}</div>}
  </div>
);

const iconBtnSt = {
  background:'#fff', border:'1px solid #e5e7eb', borderRadius:6, cursor:'pointer',
  color:'#dc2626', display:'flex', alignItems:'center', justifyContent:'center',
};
const addRowSt = {
  padding:'6px 10px', borderRadius:6, border:'1px dashed #cbd5e1', background:'transparent',
  color:'#6b7280', fontSize:12, fontWeight:600, cursor:'pointer', fontFamily:'inherit',
};

window.DailyReportForm = DailyReportForm;

})();
