// MissionChef — Marketing Extras: Social Calendar + Composer, Inbox, Analytics, PostThumb

// ─── POST THUMBNAIL ─────────────────────────────────────────────────────────
function PostThumb({ post, size = 64 }) {
  const tones = {
    warm:   ['#E8C49A','#A8743F'],
    cream:  ['#F4EFE2','#C8BFAC'],
    green:  ['#AEC854','#6E8A28'],
    dark:   ['#3A332A','#1B1B17'],
    orange: ['#F2A65A','#C56A1A'],
    red:    ['#B5475A','#7A2A36'],
    pink:   ['#E8B4B8','#C28A9E'],
  };
  if (!post.media) {
    return (
      <div style={{ width: size, height: size, background: 'var(--mc-surface-2)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, border: '1px dashed var(--mc-rule)' }}>
        <McIcon2 name="edit" size={size * 0.4} color="var(--mc-ink-dim)" />
      </div>
    );
  }
  const [c1, c2] = tones[post.media.tone] || tones.warm;
  return (
    <div style={{ width: size, height: size, background: `linear-gradient(135deg, ${c1} 0%, ${c2} 100%)`, position: 'relative', flexShrink: 0, overflow: 'hidden' }}>
      <div style={{ position: 'absolute', inset: 0, background: 'radial-gradient(circle at 30% 30%, rgba(255,255,255,.2), transparent 60%)' }} />
    </div>
  );
}
window.PostThumb = PostThumb;

// ─── SOCIAL TAB ─────────────────────────────────────────────────────────────
function SocialTab({ editingPost, setEditingPost }) {
  const store = useStore();
  const [view, setView] = React.useState('calendar'); // calendar | list | drafts

  if (editingPost) {
    return <PostComposer id={editingPost} onClose={() => setEditingPost(null)} />;
  }

  return (
    <div style={{ padding: 28 }}>
      {/* Channels overview */}
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 14, marginBottom: 24 }}>
        {store.channels.map(ch => <ChannelCard key={ch.id} channel={ch} />)}
      </div>

      {/* View toggle */}
      <div style={{ display: 'flex', gap: 6, marginBottom: 16, alignItems: 'center', justifyContent: 'space-between' }}>
        <div style={{ display: 'flex', gap: 6 }}>
          {[['calendar','Kalender'],['list','Liste'],['drafts','Entwürfe · ' + store.posts.filter(p => p.status === 'draft').length]].map(([id,label]) => (
            <button key={id} onClick={() => setView(id)} className={view===id?'mc-btn ink sm':'mc-btn ghost sm'} style={{
              background: view===id ? 'var(--mc-ink)' : 'transparent',
              color: view===id ? 'var(--mc-bg)' : 'var(--mc-ink-muted)',
              borderColor: view===id ? 'var(--mc-ink)' : 'var(--mc-rule)',
            }}>{label}</button>
          ))}
        </div>
        <button className="mc-btn leaf sm" onClick={() => setEditingPost('new')}>
          <McIcon2 name="plus" size={14} />Neuer Post
        </button>
      </div>

      {view === 'calendar' && <SocialCalendar onEdit={setEditingPost} />}
      {view === 'list'     && <SocialList     onEdit={setEditingPost} filter="all" />}
      {view === 'drafts'   && <SocialList     onEdit={setEditingPost} filter="draft" />}
    </div>
  );
}

function ChannelCard({ channel }) {
  const colors = { instagram: '#E1306C', facebook: '#1877F2', google: '#34A853' };
  return (
    <div className="mc-card" style={{ padding: 18, display: 'flex', alignItems: 'center', gap: 14 }}>
      <div style={{ width: 44, height: 44, background: colors[channel.platform], display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#fff', flexShrink: 0 }}>
        <McIcon2 name={channel.platform} size={22} stroke={1.8} />
      </div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div style={{ fontSize: 14, fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{channel.handle}</div>
        <div style={{ fontSize: 11, color: 'var(--mc-ink-dim)', marginTop: 2 }}>
          {channel.platform === 'google'
            ? `${channel.reviews} Bewertungen · ★ ${channel.rating}`
            : `${fmtINT(channel.followers)} Follower`}
        </div>
      </div>
      <div style={{ textAlign: 'right' }}>
        <div className="mc-num" style={{ fontSize: 16, fontWeight: 500, color: 'var(--mc-leaf-900)' }}>+{channel.growth30d}</div>
        <div className="mc-eyebrow" style={{ fontSize: 9 }}>30 Tage</div>
      </div>
    </div>
  );
}

// ─── SOCIAL CALENDAR ────────────────────────────────────────────────────────
function SocialCalendar({ onEdit }) {
  const store = useStore();
  const [weekOffset, setWeekOffset] = React.useState(0);

  // Compute week start (Monday)
  const start = React.useMemo(() => {
    const d = new Date();
    d.setHours(0,0,0,0);
    const day = d.getDay() || 7;
    d.setDate(d.getDate() - day + 1 + weekOffset * 7);
    return d;
  }, [weekOffset]);

  const days = Array.from({ length: 7 }, (_, i) => {
    const d = new Date(start); d.setDate(d.getDate() + i); return d;
  });
  const HOURS = [9, 12, 15, 18, 21];

  const postsByDayHour = (date, hour) => {
    return store.posts.filter(p => {
      const ts = p.publishedAt || p.scheduledAt;
      if (!ts) return false;
      const pd = new Date(ts);
      return pd.toDateString() === date.toDateString() && pd.getHours() >= hour && pd.getHours() < hour + 3;
    });
  };

  return (
    <div className="mc-card" style={{ padding: 0 }}>
      {/* Header with week nav */}
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '14px 20px', borderBottom: '1px solid var(--mc-rule)' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
          <button onClick={() => setWeekOffset(w => w - 1)} className="mc-btn ghost sm" style={{ padding: 6 }}>
            <McIcon2 name="back" size={14} />
          </button>
          <div className="mc-mono" style={{ fontSize: 12 }}>
            {start.toLocaleDateString('de-DE',{day:'2-digit',month:'short'})} – {days[6].toLocaleDateString('de-DE',{day:'2-digit',month:'short',year:'numeric'})}
          </div>
          <button onClick={() => setWeekOffset(w => w + 1)} className="mc-btn ghost sm" style={{ padding: 6 }}>
            <McIcon2 name="arrow" size={14} />
          </button>
          <button onClick={() => setWeekOffset(0)} className="mc-btn ghost sm" style={{ marginLeft: 8 }}>Heute</button>
        </div>
        <div className="mc-eyebrow">Best Times: Mi 18:00 · Fr 19:30 · So 11:00</div>
      </div>

      {/* Grid */}
      <div style={{ display: 'grid', gridTemplateColumns: '60px repeat(7, 1fr)' }}>
        <div style={{ borderRight: '1px solid var(--mc-rule)' }} />
        {days.map((d, i) => {
          const isToday = d.toDateString() === new Date().toDateString();
          return (
            <div key={i} style={{ padding: '12px 10px', borderBottom: '1px solid var(--mc-rule)', borderRight: i < 6 ? '1px solid var(--mc-rule)' : 'none', textAlign: 'center', background: isToday ? 'var(--mc-surface-2)' : 'transparent' }}>
              <div className="mc-eyebrow">{d.toLocaleDateString('de-DE',{weekday:'short'})}</div>
              <div style={{ fontSize: 18, fontWeight: 500, marginTop: 2, color: isToday ? 'var(--mc-leaf-900)' : 'var(--mc-ink)' }}>{d.getDate()}</div>
            </div>
          );
        })}

        {HOURS.map(h => (
          <React.Fragment key={h}>
            <div style={{ padding: '8px 10px', borderRight: '1px solid var(--mc-rule)', borderBottom: '1px solid var(--mc-rule)', fontSize: 10, color: 'var(--mc-ink-dim)', fontFamily: "'JetBrains Mono',monospace", textAlign: 'right' }}>{h}:00</div>
            {days.map((d, i) => {
              const cellPosts = postsByDayHour(d, h);
              return (
                <div key={i} style={{
                  minHeight: 110, padding: 6,
                  borderRight: i < 6 ? '1px solid var(--mc-rule)' : 'none',
                  borderBottom: '1px solid var(--mc-rule)',
                  background: 'var(--mc-bg)',
                  display: 'flex', flexDirection: 'column', gap: 4,
                }}>
                  {cellPosts.map(p => (
                    <button key={p.id} onClick={() => onEdit(p.id)} style={{
                      background: 'var(--mc-surface)', border: '1px solid var(--mc-rule)',
                      padding: 6, cursor: 'pointer', textAlign: 'left',
                      display: 'flex', gap: 6, fontFamily: 'inherit',
                      borderLeft: '3px solid ' + (p.status === 'published' ? 'var(--mc-leaf-700)' : 'var(--mc-ember)'),
                    }}>
                      <PostThumb post={p} size={36} />
                      <div style={{ flex: 1, minWidth: 0 }}>
                        <div style={{ display: 'flex', gap: 3 }}>
                          {p.channels.map(cid => <ChannelBadge key={cid} channelId={cid} size={10} />)}
                        </div>
                        <div style={{ fontSize: 10, color: 'var(--mc-ink)', marginTop: 3, lineHeight: 1.3, display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>{p.text.slice(0, 40)}…</div>
                      </div>
                    </button>
                  ))}
                </div>
              );
            })}
          </React.Fragment>
        ))}
      </div>
    </div>
  );
}

function SocialList({ onEdit, filter }) {
  const store = useStore();
  const posts = store.posts.filter(p => filter === 'all' || p.status === filter);
  return (
    <div className="mc-card" style={{ padding: 0 }}>
      {posts.map(p => {
        const ts = p.publishedAt || p.scheduledAt;
        const d = ts ? new Date(ts) : null;
        return (
          <div key={p.id} className="mc-row" onClick={() => onEdit(p.id)} style={{ display: 'flex', gap: 16, padding: 16, borderBottom: '1px solid var(--mc-rule)', cursor: 'pointer', alignItems: 'flex-start' }}>
            <PostThumb post={p} size={80} />
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 12 }}>
                <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>
                  {p.channels.map(cid => <ChannelBadge key={cid} channelId={cid} size={14} />)}
                  <Pill tone={p.status === 'published' ? 'leaf' : p.status === 'scheduled' ? 'ember' : 'default'}>
                    {p.status === 'published' ? 'Veröffentlicht' : p.status === 'scheduled' ? 'Geplant' : 'Entwurf'}
                  </Pill>
                  {d && <span className="mc-mono" style={{ fontSize: 11, color: 'var(--mc-ink-dim)' }}>
                    {d.toLocaleDateString('de-DE',{weekday:'short',day:'2-digit',month:'2-digit'})} · {d.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'})}
                  </span>}
                </div>
                {p.status === 'published' && (
                  <div style={{ display: 'flex', gap: 14, fontSize: 11, color: 'var(--mc-ink-muted)' }}>
                    <span><McIcon2 name="heart" size={11} /> {p.likes}</span>
                    <span><McIcon2 name="chat" size={11} /> {p.comments}</span>
                    <span><McIcon2 name="eye" size={11} /> {fmtINT(p.reach)}</span>
                  </div>
                )}
              </div>
              <div style={{ fontSize: 14, lineHeight: 1.5, marginTop: 8, color: 'var(--mc-ink)' }}>{p.text}</div>
            </div>
          </div>
        );
      })}
      {posts.length === 0 && <div style={{ padding: 60, textAlign: 'center', color: 'var(--mc-ink-dim)' }}>Keine Posts in dieser Ansicht.</div>}
    </div>
  );
}

// ─── POST COMPOSER ──────────────────────────────────────────────────────────
function PostComposer({ id, onClose }) {
  const store = useStore();
  const isNew = id === 'new';
  const post = isNew ? null : store.posts.find(p => p.id === id);

  const [draft, setDraft] = React.useState(() => post || {
    text: '', channels: ['ch-ig'], media: { type: 'image', tone: 'green' }, status: 'draft', scheduledAt: null,
  });
  const [scheduleDate, setScheduleDate] = React.useState(() => {
    const d = new Date(); d.setDate(d.getDate() + 1); d.setHours(18, 0, 0, 0);
    return d.toISOString().slice(0, 16);
  });
  const [aiBusy, setAiBusy] = React.useState(false);

  const update = (k, v) => setDraft(d => ({ ...d, [k]: v }));
  const toggleChannel = (cid) => {
    setDraft(d => ({ ...d, channels: d.channels.includes(cid) ? d.channels.filter(c => c !== cid) : [...d.channels, cid] }));
  };

  const aiGenerate = async () => {
    setAiBusy(true);
    await new Promise(r => setTimeout(r, 1100));
    const ideas = [
      'Frühling auf dem Teller — Spargel, frische Erbsen, Pecorino. Ab heute auf der Karte. 🌿',
      'Pasta-Tag in der Osteria. Frisch ausgerollte Tagliatelle, langsam getrocknet. Heute Abend.',
      'Drei neue Weine im Glas — alle aus Süditalien, alle bis 8 € pro Glas. Kommen Sie probieren.',
      'Aperitivo unter Olivenbäumen. Die Terrasse hat geöffnet. ☀️',
    ];
    update('text', ideas[Math.floor(Math.random() * ideas.length)]);
    setAiBusy(false);
  };

  const schedule = () => {
    const data = { ...draft, status: 'scheduled', scheduledAt: new Date(scheduleDate).toISOString() };
    if (isNew) mcApi.post('/posts', data); else mcApi.patch('/posts/' + id, data);
    onClose();
  };
  const publishNow = () => {
    const data = { ...draft, status: 'published', publishedAt: new Date().toISOString(), likes: 0, comments: 0, shares: 0, reach: 0 };
    if (isNew) mcApi.post('/posts', data); else mcApi.patch('/posts/' + id, data);
    onClose();
  };
  const saveDraft = () => {
    const data = { ...draft, status: 'draft' };
    if (isNew) mcApi.post('/posts', data); else mcApi.patch('/posts/' + id, data);
    onClose();
  };

  const TONES = ['warm','cream','green','dark','orange','red','pink'];

  return (
    <div style={{ display: 'flex', minHeight: '100%' }}>
      {/* LEFT */}
      <div style={{ width: 520, padding: 28, borderRight: '1px solid var(--mc-rule)', background: 'var(--mc-surface)', flexShrink: 0 }}>
        <button onClick={onClose} style={{ background: 'none', border: 'none', color: 'var(--mc-ink-muted)', cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 6, padding: 0, fontSize: 12, marginBottom: 20 }}>
          <McIcon2 name="back" size={14} />Zurück
        </button>

        <div className="mc-eyebrow">{isNew ? 'Neuer Post' : 'Post bearbeiten'}</div>

        {/* Channels */}
        <div style={{ marginTop: 18 }}>
          <div className="mc-eyebrow" style={{ marginBottom: 8 }}>Kanäle</div>
          <div style={{ display: 'flex', gap: 8 }}>
            {store.channels.map(ch => {
              const active = draft.channels.includes(ch.id);
              const colors = { instagram: '#E1306C', facebook: '#1877F2', google: '#34A853' };
              return (
                <button key={ch.id} onClick={() => toggleChannel(ch.id)} style={{
                  display: 'flex', alignItems: 'center', gap: 8, padding: '8px 12px',
                  background: active ? colors[ch.platform] : 'var(--mc-surface-2)',
                  color: active ? '#fff' : 'var(--mc-ink-muted)',
                  border: '1px solid ' + (active ? colors[ch.platform] : 'var(--mc-rule)'),
                  cursor: 'pointer', fontFamily: 'inherit', fontSize: 12,
                }}>
                  <McIcon2 name={ch.platform} size={14} stroke={1.8} />
                  {ch.handle.split(' ')[0]}
                </button>
              );
            })}
          </div>
        </div>

        {/* Text */}
        <div style={{ marginTop: 20 }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
            <div className="mc-eyebrow">Text</div>
            <button onClick={aiGenerate} disabled={aiBusy} className="mc-btn ghost sm" style={{ fontSize: 11, padding: '4px 10px', display: 'inline-flex', alignItems: 'center', gap: 6 }}>
              <McIcon2 name="sparkle" size={12} color="var(--mc-leaf-700)" />
              {aiBusy ? 'Generiert…' : 'KI-Vorschlag'}
            </button>
          </div>
          <textarea className="mc-input" style={{ minHeight: 140, padding: 14, lineHeight: 1.5, resize: 'vertical', fontFamily: 'inherit' }} value={draft.text} onChange={e => update('text', e.target.value)} placeholder="Was gibt's heute? Erzählen Sie's Ihren Gästen…" />
          <div className="mc-mono" style={{ fontSize: 10, color: 'var(--mc-ink-dim)', textAlign: 'right', marginTop: 4 }}>
            {draft.text.length} Zeichen · IG max 2200
          </div>
        </div>

        {/* Media */}
        <div style={{ marginTop: 16 }}>
          <div className="mc-eyebrow" style={{ marginBottom: 8 }}>Bild</div>
          <div style={{ display: 'flex', gap: 6 }}>
            {TONES.map(t => (
              <button key={t} onClick={() => update('media', { type: 'image', tone: t })} style={{
                width: 38, height: 38, padding: 0, cursor: 'pointer',
                background: { warm:'#E8C49A',cream:'#F4EFE2',green:'#AEC854',dark:'#1B1B17',orange:'#F2A65A',red:'#B5475A',pink:'#E8B4B8' }[t],
                border: '2px solid ' + (draft.media?.tone === t ? 'var(--mc-ink)' : 'transparent'),
              }} />
            ))}
            <button onClick={() => update('media', null)} style={{ width: 38, height: 38, padding: 0, cursor: 'pointer', background: 'var(--mc-surface-2)', border: '1px dashed var(--mc-rule)', display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--mc-ink-dim)' }}>
              <McIcon2 name="x" size={14} />
            </button>
          </div>
          <button className="mc-btn ghost sm" style={{ marginTop: 10 }}>
            <McIcon2 name="image" size={14} />Bild hochladen
          </button>
        </div>

        {/* Schedule */}
        <div style={{ marginTop: 20, paddingTop: 20, borderTop: '1px solid var(--mc-rule)' }}>
          <div className="mc-eyebrow" style={{ marginBottom: 8 }}>Veröffentlichung</div>
          <input type="datetime-local" className="mc-input" value={scheduleDate} onChange={e => setScheduleDate(e.target.value)} />
          <div className="mc-mono" style={{ fontSize: 10, color: 'var(--mc-ink-dim)', marginTop: 6 }}>
            ⓘ Vorgeschlagene Zeit für IG: Mi 18:00 (Beste Engagement-Quote)
          </div>
        </div>

        <div style={{ marginTop: 24, display: 'flex', gap: 8 }}>
          <button className="mc-btn ghost sm" style={{ flex: 1 }} onClick={saveDraft}>Entwurf</button>
          <button className="mc-btn sm" style={{ flex: 1 }} onClick={schedule}>
            <McIcon2 name="clock" size={14} />Planen
          </button>
          <button className="mc-btn leaf sm" style={{ flex: 1 }} onClick={publishNow}>
            <McIcon2 name="send" size={14} />Jetzt
          </button>
        </div>
      </div>

      {/* RIGHT — Live preview */}
      <div style={{ flex: 1, padding: 40, overflow: 'auto', background: 'var(--mc-bg)' }}>
        <div className="mc-eyebrow" style={{ marginBottom: 16 }}>Vorschau · Live</div>
        <div style={{ display: 'flex', gap: 20, flexWrap: 'wrap', justifyContent: 'center' }}>
          {draft.channels.includes('ch-ig')  && <IGPreview draft={draft} biz={store.biz} />}
          {draft.channels.includes('ch-fb')  && <FBPreview draft={draft} biz={store.biz} />}
          {draft.channels.includes('ch-gmb') && <GMBPreview draft={draft} biz={store.biz} />}
        </div>
      </div>
    </div>
  );
}

function postBgGradient(tone) {
  const tones = {
    warm:   'linear-gradient(135deg, #E8C49A, #A8743F)',
    cream:  'linear-gradient(135deg, #F4EFE2, #C8BFAC)',
    green:  'linear-gradient(135deg, #AEC854, #6E8A28)',
    dark:   'linear-gradient(135deg, #3A332A, #1B1B17)',
    orange: 'linear-gradient(135deg, #F2A65A, #C56A1A)',
    red:    'linear-gradient(135deg, #B5475A, #7A2A36)',
    pink:   'linear-gradient(135deg, #E8B4B8, #C28A9E)',
  };
  return tones[tone] || tones.warm;
}

function IGPreview({ draft, biz }) {
  return (
    <div style={{ width: 320, background: '#FFFFFF', boxShadow: '0 20px 50px -30px rgba(0,0,0,.25)', color: '#1B1B17', fontSize: 13 }}>
      <div style={{ padding: 12, display: 'flex', alignItems: 'center', gap: 10 }}>
        <div style={{ width: 32, height: 32, borderRadius: '50%', background: 'linear-gradient(45deg, #FCAF45, #E1306C, #5B51D8)', padding: 2 }}>
          <div style={{ width: '100%', height: '100%', background: '#FFF', borderRadius: '50%', padding: 2 }}>
            <McLogoTile size={24} />
          </div>
        </div>
        <div style={{ flex: 1 }}>
          <div style={{ fontWeight: 600, fontSize: 12 }}>osteria.botanica</div>
          <div style={{ fontSize: 10, color: '#8A8178' }}>{biz.city}</div>
        </div>
        <div style={{ color: '#1B1B17' }}>···</div>
      </div>
      {draft.media ? (
        <div style={{ width: 320, height: 320, background: postBgGradient(draft.media.tone), display: 'flex', alignItems: 'center', justifyContent: 'center', position: 'relative' }}>
          <div style={{ position: 'absolute', inset: 0, background: 'radial-gradient(circle at 30% 30%, rgba(255,255,255,.18), transparent 60%)' }} />
          <McLogoTile size={48} />
        </div>
      ) : (
        <div style={{ width: 320, height: 200, background: '#F5F5F5', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#8A8178', fontSize: 11 }}>Kein Bild</div>
      )}
      <div style={{ padding: 12 }}>
        <div style={{ display: 'flex', gap: 14, fontSize: 18, marginBottom: 8, color: '#1B1B17' }}>
          <McIcon2 name="heart" size={22} stroke={1.5} />
          <McIcon2 name="chat" size={22} stroke={1.5} />
          <McIcon2 name="send" size={22} stroke={1.5} />
        </div>
        <div style={{ fontSize: 12, lineHeight: 1.5, color: '#1B1B17' }}>
          <span style={{ fontWeight: 600 }}>osteria.botanica</span> {draft.text || 'Ihr Text erscheint hier…'}
        </div>
      </div>
    </div>
  );
}

function FBPreview({ draft, biz }) {
  return (
    <div style={{ width: 380, background: '#FFFFFF', boxShadow: '0 20px 50px -30px rgba(0,0,0,.25)', color: '#1B1B17', fontSize: 13 }}>
      <div style={{ padding: 12, display: 'flex', alignItems: 'center', gap: 10 }}>
        <div style={{ width: 40, height: 40, background: '#1877F2', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
          <McLogoTile size={28} />
        </div>
        <div style={{ flex: 1 }}>
          <div style={{ fontWeight: 600, fontSize: 13 }}>{biz.name}</div>
          <div style={{ fontSize: 10, color: '#8A8178' }}>Gerade eben · 🌍</div>
        </div>
      </div>
      <div style={{ padding: '0 12px 12px', fontSize: 13, lineHeight: 1.5 }}>{draft.text || 'Ihr Text erscheint hier…'}</div>
      {draft.media && (
        <div style={{ width: '100%', height: 280, background: postBgGradient(draft.media.tone) }}>
          <div style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
            <McLogoTile size={48} />
          </div>
        </div>
      )}
      <div style={{ padding: 10, borderTop: '1px solid #E8E2D2', display: 'flex', justifyContent: 'space-around', fontSize: 12, color: '#564F47' }}>
        <span>👍 Gefällt mir</span><span>💬 Kommentar</span><span>↗ Teilen</span>
      </div>
    </div>
  );
}

function GMBPreview({ draft, biz }) {
  return (
    <div style={{ width: 360, background: '#FFFFFF', boxShadow: '0 20px 50px -30px rgba(0,0,0,.25)', color: '#1B1B17', borderTop: '4px solid #34A853' }}>
      <div style={{ padding: 14 }}>
        <div style={{ fontSize: 11, color: '#8A8178', textTransform: 'uppercase', letterSpacing: '.05em' }}>Google Beitrag · {biz.name}</div>
        <div style={{ fontSize: 13, lineHeight: 1.5, marginTop: 8 }}>{draft.text || 'Ihr Text erscheint hier…'}</div>
      </div>
      {draft.media && (
        <div style={{ width: '100%', height: 200, background: postBgGradient(draft.media.tone) }} />
      )}
      <div style={{ padding: 12, borderTop: '1px solid #E8E2D2', fontSize: 12, color: '#1A73E8' }}>Mehr erfahren →</div>
    </div>
  );
}

// ─── INBOX TAB ──────────────────────────────────────────────────────────────
function InboxTab({ openMessage, setOpenMessage }) {
  const store = useStore();
  const [filter, setFilter] = React.useState('all'); // all | unread | dm | comment | review
  const [reply, setReply] = React.useState('');

  React.useEffect(() => {
    if (!openMessage && store.inbox.length > 0) setOpenMessage(store.inbox[0].id);
  }, []);

  const filtered = store.inbox.filter(m => {
    if (filter === 'unread' && !m.unread) return false;
    if (['dm','comment','review'].includes(filter) && m.kind !== filter) return false;
    return true;
  });

  const current = store.inbox.find(m => m.id === openMessage);

  const sendReply = () => {
    if (!reply.trim() || !current) return;
    mcApi.post(`/inbox/${current.id}/reply`, { text: reply });
    setReply('');
  };

  const aiSuggest = async () => {
    if (!current) return;
    const last = current.thread[current.thread.length - 1];
    let suggestion = 'Vielen Dank für Ihre Nachricht — wir melden uns gleich bei Ihnen.';
    if (last.text.toLowerCase().includes('reservier') || last.text.toLowerCase().includes('tisch')) {
      suggestion = 'Vielen Dank für Ihre Anfrage! Bitte reservieren Sie direkt unter osteria-botanica.de/reservieren — dort sehen Sie unsere Live-Verfügbarkeit. Bei Fragen schreiben Sie gerne wieder.';
    } else if (last.text.toLowerCase().includes('catering')) {
      suggestion = 'Sehr gerne! Wir machen Catering ab 20 Personen. Mein Kollege Paul meldet sich heute noch mit einem unverbindlichen Angebot — bitte schicken Sie uns Datum, Anzahl Gäste und gewünschtes Format.';
    } else if (last.text.toLowerCase().includes('glutenfr') || last.text.toLowerCase().includes('vegan')) {
      suggestion = 'Ja, wir haben jeden Tag mindestens eine glutenfreie und eine vegane Option auf der Karte. Bitte einfach bei der Reservierung Bescheid geben.';
    } else if (current.kind === 'review' && current.rating >= 4) {
      suggestion = 'Vielen herzlichen Dank für Ihre tolle Bewertung — wir freuen uns sehr und hoffen, Sie bald wieder bei uns begrüßen zu dürfen.';
    } else if (current.kind === 'review' && current.rating < 4) {
      suggestion = 'Vielen Dank für Ihr ehrliches Feedback. Es tut uns leid, dass nicht alles perfekt war. Wir nehmen Ihre Punkte ernst und arbeiten daran. Wir würden uns freuen, Sie bei einem nächsten Besuch vom Gegenteil zu überzeugen.';
    }
    setReply(suggestion);
  };

  return (
    <div style={{ display: 'flex', height: '100%' }}>
      {/* LIST */}
      <div style={{ width: 380, borderRight: '1px solid var(--mc-rule)', display: 'flex', flexDirection: 'column', background: 'var(--mc-surface)' }}>
        <div style={{ padding: 16, borderBottom: '1px solid var(--mc-rule)' }}>
          <div style={{ display: 'flex', gap: 4, flexWrap: 'wrap' }}>
            {[['all','Alle'],['unread','Ungelesen'],['dm','DMs'],['comment','Kommentare'],['review','Bewertungen']].map(([id,label]) => (
              <button key={id} onClick={() => setFilter(id)} style={{
                fontSize: 11, padding: '4px 10px', cursor: 'pointer',
                background: filter === id ? 'var(--mc-ink)' : 'transparent',
                color: filter === id ? 'var(--mc-bg)' : 'var(--mc-ink-muted)',
                border: '1px solid ' + (filter === id ? 'var(--mc-ink)' : 'var(--mc-rule)'),
                fontFamily: 'inherit',
              }}>{label}</button>
            ))}
          </div>
        </div>
        <div style={{ flex: 1, overflow: 'auto' }}>
          {filtered.map(m => {
            const channel = mcStore.channels.find(c => c.id === m.channelId);
            const colors = { instagram: '#E1306C', facebook: '#1877F2', google: '#34A853' };
            const sel = m.id === openMessage;
            return (
              <div key={m.id} className="mc-row" onClick={() => setOpenMessage(m.id)} style={{
                padding: 14, borderBottom: '1px solid var(--mc-rule)', cursor: 'pointer',
                background: sel ? 'var(--mc-surface-2)' : 'transparent',
                borderLeft: sel ? '3px solid var(--mc-leaf)' : '3px solid transparent',
                display: 'flex', gap: 12,
              }}>
                <div style={{ position: 'relative', flexShrink: 0 }}>
                  <div style={{ width: 36, height: 36, background: m.avatar, color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 13, fontWeight: 600 }}>
                    {m.from.slice(0,1).toUpperCase()}
                  </div>
                  <div style={{ position: 'absolute', bottom: -2, right: -2, width: 16, height: 16, background: colors[channel.platform], display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#fff', border: '2px solid var(--mc-surface)' }}>
                    <McIcon2 name={channel.platform} size={9} stroke={2.4} />
                  </div>
                </div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
                    <div style={{ fontSize: 13, fontWeight: m.unread ? 600 : 400 }}>{m.from}</div>
                    <span className="mc-mono" style={{ fontSize: 10, color: 'var(--mc-ink-dim)' }}>{relTime(m.received)}</span>
                  </div>
                  <div style={{ fontSize: 11, color: 'var(--mc-ink-dim)', marginTop: 1 }}>
                    {m.kind === 'dm' ? 'Direktnachricht' : m.kind === 'comment' ? 'Kommentar' : `Bewertung · ${m.rating}★`}
                  </div>
                  <div style={{ fontSize: 12, color: 'var(--mc-ink-muted)', marginTop: 4, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.preview}</div>
                </div>
                {m.unread && <div style={{ width: 7, height: 7, background: 'var(--mc-ember)', borderRadius: '50%', marginTop: 12, flexShrink: 0 }} />}
              </div>
            );
          })}
        </div>
      </div>

      {/* DETAIL */}
      {current ? (
        <div style={{ flex: 1, display: 'flex', flexDirection: 'column', background: 'var(--mc-bg)' }}>
          <div style={{ padding: 18, borderBottom: '1px solid var(--mc-rule)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', background: 'var(--mc-surface)' }}>
            <div>
              <div style={{ fontSize: 16, fontWeight: 500 }}>{current.from}</div>
              <div style={{ fontSize: 11, color: 'var(--mc-ink-dim)', marginTop: 2 }}>
                {mcStore.channels.find(c => c.id === current.channelId)?.handle}
                {current.kind === 'review' && ` · ${'★'.repeat(current.rating)}${'☆'.repeat(5-current.rating)}`}
              </div>
            </div>
            <div style={{ display: 'flex', gap: 6 }}>
              <button className="mc-btn ghost sm">Markieren</button>
              <button className="mc-btn ghost sm">Archivieren</button>
            </div>
          </div>

          <div style={{ flex: 1, padding: 28, overflow: 'auto', display: 'flex', flexDirection: 'column', gap: 14 }}>
            {current.thread.map((t, i) => (
              <div key={i} style={{ display: 'flex', justifyContent: t.from === 'us' ? 'flex-end' : 'flex-start' }}>
                <div style={{
                  maxWidth: '70%', padding: '12px 16px',
                  background: t.from === 'us' ? 'var(--mc-leaf)' : 'var(--mc-surface)',
                  color: t.from === 'us' ? '#1B1B17' : 'var(--mc-ink)',
                  border: '1px solid ' + (t.from === 'us' ? 'transparent' : 'var(--mc-rule)'),
                  fontSize: 14, lineHeight: 1.5,
                }}>
                  {t.text}
                  <div className="mc-mono" style={{ fontSize: 10, marginTop: 6, opacity: 0.6 }}>
                    {new Date(t.at).toLocaleString('de-DE', { hour: '2-digit', minute: '2-digit', day: '2-digit', month: 'short' })}
                  </div>
                </div>
              </div>
            ))}
          </div>

          {/* Compose */}
          <div style={{ padding: 16, borderTop: '1px solid var(--mc-rule)', background: 'var(--mc-surface)' }}>
            <div style={{ display: 'flex', gap: 8, marginBottom: 10 }}>
              <button onClick={aiSuggest} className="mc-btn ghost sm" style={{ fontSize: 11 }}>
                <McIcon2 name="sparkle" size={12} color="var(--mc-leaf-700)" />KI-Antwort vorschlagen
              </button>
              <button className="mc-btn ghost sm" style={{ fontSize: 11 }}>Vorlagen</button>
            </div>
            <div style={{ display: 'flex', gap: 8, alignItems: 'flex-end' }}>
              <textarea className="mc-input" style={{ flex: 1, minHeight: 60, padding: 12, resize: 'vertical' }} value={reply} onChange={e => setReply(e.target.value)} placeholder="Antwort schreiben…" />
              <button className="mc-btn leaf" onClick={sendReply}>
                <McIcon2 name="send" size={14} />Senden
              </button>
            </div>
          </div>
        </div>
      ) : (
        <div style={{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--mc-ink-dim)' }}>
          Wählen Sie eine Nachricht.
        </div>
      )}
    </div>
  );
}

// ─── ANALYTICS TAB ──────────────────────────────────────────────────────────
function AnalyticsTab() {
  const store = useStore();
  const data = store.marketingAnalytics;
  const totalReach = data.reduce((a, d) => a + d.reach, 0);
  const totalEng = data.reduce((a, d) => a + d.engagement, 0);
  const totalNew = data.reduce((a, d) => a + d.newSubs, 0);
  const totalUnsub = data.reduce((a, d) => a + d.unsubs, 0);
  const engRate = totalReach ? (totalEng / totalReach) * 100 : 0;

  const sentCamps = store.campaigns.filter(c => c.status === 'sent');
  const totalSent = sentCamps.reduce((a, c) => a + c.sent, 0);
  const totalOpens = sentCamps.reduce((a, c) => a + c.opened, 0);
  const totalClicks = sentCamps.reduce((a, c) => a + c.clicked, 0);
  const totalRev = sentCamps.reduce((a, c) => a + c.revenue, 0);

  // Top posts by engagement
  const topPosts = [...store.posts.filter(p => p.status === 'published')]
    .sort((a, b) => (b.likes + b.comments + b.shares) - (a.likes + a.comments + a.shares)).slice(0, 5);

  return (
    <div style={{ padding: 28, display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 16 }}>
      <Kpi label="Reichweite · 30 Tage" value={fmtINT(totalReach)} delta="+12% vs. Vormonat" tone="good" icon="eye" />
      <Kpi label="Engagement · 30 Tage" value={fmtINT(totalEng)} delta={`Rate: ${engRate.toFixed(1)}%`} icon="heart" />
      <Kpi label="Neue Newsletter-Abos" value={`+${totalNew}`} delta={`${totalUnsub} Abmeldungen · netto +${totalNew - totalUnsub}`} tone="good" icon="mail" />
      <Kpi label="Newsletter Umsatz" value={fmtEUR(totalRev)} delta={`${fmtINT(totalSent)} versendet`} tone="good" icon="eur" />

      {/* Reach trend */}
      <div className="mc-card" style={{ gridColumn: 'span 4', padding: 24 }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 18 }}>
          <div>
            <div className="mc-eyebrow">Reichweite</div>
            <div style={{ fontSize: 18, fontWeight: 500, marginTop: 4 }}>Letzte 30 Tage · Alle Kanäle</div>
          </div>
          <div style={{ display: 'flex', gap: 18, fontSize: 12 }}>
            <span><span style={{ display: 'inline-block', width: 12, height: 2, background: 'var(--mc-leaf-700)', verticalAlign: 'middle', marginRight: 6 }} />Reichweite</span>
            <span><span style={{ display: 'inline-block', width: 12, height: 2, background: 'var(--mc-ember)', verticalAlign: 'middle', marginRight: 6 }} />Engagement</span>
          </div>
        </div>
        <DualSparkChart data={data} height={200} />
      </div>

      {/* Newsletter performance */}
      <div className="mc-card" style={{ gridColumn: 'span 2', padding: 0 }}>
        <div style={{ padding: '16px 20px', borderBottom: '1px solid var(--mc-rule)' }}>
          <div className="mc-eyebrow">Newsletter Performance</div>
          <div style={{ fontSize: 16, fontWeight: 500, marginTop: 4 }}>Letzte Kampagnen</div>
        </div>
        {sentCamps.slice(0, 4).map(c => {
          const openR = c.sent ? (c.opened / c.sent) * 100 : 0;
          const clickR = c.sent ? (c.clicked / c.sent) * 100 : 0;
          return (
            <div key={c.id} style={{ padding: '14px 20px', borderBottom: '1px solid var(--mc-rule)' }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
                <div style={{ fontSize: 13, fontWeight: 500 }}>{c.name}</div>
                <div className="mc-num" style={{ fontSize: 13, color: 'var(--mc-leaf-900)' }}>{fmtEUR(c.revenue)}</div>
              </div>
              <div style={{ display: 'flex', gap: 14, marginTop: 6, fontSize: 11, color: 'var(--mc-ink-muted)' }}>
                <span>{fmtINT(c.sent)} versendet</span>
                <span>•</span>
                <span>{openR.toFixed(1)}% Öffnung</span>
                <span>•</span>
                <span>{clickR.toFixed(1)}% Klick</span>
              </div>
              <div style={{ display: 'flex', gap: 4, marginTop: 8, height: 4 }}>
                <div style={{ flex: openR, background: 'var(--mc-leaf-700)' }} />
                <div style={{ flex: 100 - openR, background: 'var(--mc-rule)' }} />
              </div>
            </div>
          );
        })}
      </div>

      {/* Top posts */}
      <div className="mc-card" style={{ gridColumn: 'span 2', padding: 0 }}>
        <div style={{ padding: '16px 20px', borderBottom: '1px solid var(--mc-rule)' }}>
          <div className="mc-eyebrow">Top Posts · 30 Tage</div>
          <div style={{ fontSize: 16, fontWeight: 500, marginTop: 4 }}>Nach Engagement</div>
        </div>
        {topPosts.map((p, i) => (
          <div key={p.id} style={{ padding: '12px 20px', borderBottom: '1px solid var(--mc-rule)', display: 'flex', gap: 12, alignItems: 'center' }}>
            <div className="mc-mono" style={{ width: 22, fontSize: 11, color: 'var(--mc-ink-dim)' }}>#{i+1}</div>
            <PostThumb post={p} size={48} />
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontSize: 12, lineHeight: 1.4, color: 'var(--mc-ink)', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>{p.text}</div>
              <div style={{ display: 'flex', gap: 12, marginTop: 4, fontSize: 11, color: 'var(--mc-ink-muted)' }}>
                <span>♥ {p.likes}</span><span>💬 {p.comments}</span><span>↗ {p.shares}</span>
              </div>
            </div>
            <div className="mc-num" style={{ fontSize: 13, color: 'var(--mc-leaf-900)' }}>{fmtINT(p.reach)}</div>
          </div>
        ))}
      </div>

      {/* Channel breakdown */}
      <div className="mc-card" style={{ gridColumn: 'span 4', padding: 24 }}>
        <div className="mc-eyebrow" style={{ marginBottom: 16 }}>Kanäle · Wachstum &amp; Engagement</div>
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 20 }}>
          {store.channels.map(ch => {
            const colors = { instagram: '#E1306C', facebook: '#1877F2', google: '#34A853' };
            return (
              <div key={ch.id} style={{ padding: 16, background: 'var(--mc-surface-2)' }}>
                <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 14 }}>
                  <div style={{ width: 36, height: 36, background: colors[ch.platform], display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#fff' }}>
                    <McIcon2 name={ch.platform} size={18} stroke={1.8} />
                  </div>
                  <div>
                    <div style={{ fontSize: 13, fontWeight: 500 }}>{ch.handle}</div>
                    <div style={{ fontSize: 11, color: 'var(--mc-ink-dim)' }}>{ch.platform === 'google' ? `${ch.reviews} Bewertungen` : `${fmtINT(ch.followers)} Follower`}</div>
                  </div>
                </div>
                <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 8 }}>
                  <Stat small label="Wachstum 30T" value={`+${ch.growth30d}`} />
                  <Stat small label={ch.platform === 'google' ? 'Rating' : 'Engagement'} value={ch.platform === 'google' ? `★ ${ch.rating}` : '4.2%'} />
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
}

function DualSparkChart({ data, height = 200 }) {
  const reaches = data.map(d => d.reach);
  const engs = data.map(d => d.engagement);
  const max = Math.max(...reaches);
  const maxE = Math.max(...engs);
  const w = 1000;
  const h = 200;
  const reachPath = reaches.map((v, i) => `${(i / (reaches.length - 1)) * w},${h - (v / max) * h * 0.9}`).join(' ');
  const engPath = engs.map((v, i) => `${(i / (engs.length - 1)) * w},${h - (v / maxE) * h * 0.9}`).join(' ');
  return (
    <div style={{ position: 'relative' }}>
      <svg width="100%" height={height} viewBox={`0 0 ${w} ${h}`} preserveAspectRatio="none" style={{ display: 'block' }}>
        {[0.25, 0.5, 0.75, 1].map(p => <line key={p} x1="0" x2={w} y1={h * p} y2={h * p} stroke="var(--mc-rule)" strokeWidth="1" vectorEffect="non-scaling-stroke" />)}
        <polygon points={`0,${h} ${reachPath} ${w},${h}`} fill="var(--mc-leaf-700)" opacity="0.12" />
        <polyline points={reachPath} stroke="var(--mc-leaf-700)" strokeWidth="2" fill="none" vectorEffect="non-scaling-stroke" />
        <polyline points={engPath} stroke="var(--mc-ember)" strokeWidth="1.5" fill="none" vectorEffect="non-scaling-stroke" strokeDasharray="4 3" />
      </svg>
      <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 8 }}>
        {data.filter((_, i) => i % 5 === 0).map((d, i) => (
          <span key={i} className="mc-mono" style={{ fontSize: 10, color: 'var(--mc-ink-dim)' }}>{d.date.slice(5)}</span>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { SocialTab, SocialCalendar, PostComposer, InboxTab, AnalyticsTab, DualSparkChart, postBgGradient, IGPreview, FBPreview, GMBPreview });
