// MedBridge — cards. Listing cards, doctor cards, booking, news.

// ─── Listing card — Vertretung ───────────────────────────────────
function ListingCardVertretung({ listing, density = 'compact', greyed, greyReason }) {
  // density: compact (list), expanded (full), calendar
  const t = MB.vertretung;
  const pad = density === 'expanded' ? 18 : 14;
  return (
    <div className="mb-card mb-listing-card" style={{
      background: MB.surface.raised, border: `1px solid ${MB.line.hair}`,
      borderRadius: 14, overflow: 'hidden', position: 'relative',
      opacity: greyed ? 0.6 : 1, filter: greyed ? 'saturate(0.6)' : 'none',
      boxShadow: MB.shadow.card,
    }}>
      {/* left edge type stripe */}
      <div style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 4, background: t[600] }} />
      {listing.urgent && <UrgencyStrip days={listing.urgentDays} tone="Vertretung" />}
      <div style={{ padding: `${pad}px ${pad}px ${pad}px ${pad + 6}px` }}>
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
          <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>
            <TypePill type="Vertretung" size={density === 'expanded' ? 'md' : 'sm'} />
            <Chip tone="neutral" size="sm" style={{ color: MB.specialty[listing.specialty] || MB.specialty.default, borderColor: 'rgba(0,0,0,0.06)' }}>
              {listing.specialty}
            </Chip>
          </div>
          {!greyed && <Icon name="bookmark" size={18} color={MB.ink.tertiary} />}
        </div>
        <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: density === 'expanded' ? 19 : 17, fontWeight: 700, color: MB.ink.primary, letterSpacing: -0.2, lineHeight: 1.25 }}>
          {listing.title}
        </div>
        <div style={{ marginTop: 10, display: 'grid', gridTemplateColumns: '1fr', gap: 6, fontFamily: MB.font, fontSize: 14, color: MB.ink.secondary, fontVariantNumeric: 'tabular-nums' }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="calendar" size={15} color={MB.ink.tertiary} />{listing.dateRange}</div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="pin" size={15} color={MB.ink.tertiary} />{listing.location}</div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="euro" size={15} color={MB.ink.tertiary} /><strong style={{ color: MB.ink.primary, fontWeight: 600 }}>{listing.rate}</strong></div>
        </div>
        {density === 'expanded' && (
          <div style={{ marginTop: 14, paddingTop: 14, borderTop: `1px solid ${MB.line.hair}`, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
              <Avatar name={listing.host} size={32} verified />
              <div>
                <div style={{ fontFamily: MB.font, fontSize: 14, fontWeight: 600, color: MB.ink.primary }}>{listing.host}</div>
                <div style={{ fontFamily: MB.font, fontSize: 12, color: MB.ink.tertiary }}>{listing.hostPractice}</div>
              </div>
            </div>
            {!greyed && <Button kind="primary" size="sm" tone={t}>Bewerben</Button>}
          </div>
        )}
        {greyed && greyReason && (
          <div style={{ marginTop: 12, padding: '10px 12px', background: MB.surface.canvas2, borderRadius: 10, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, display: 'flex', gap: 8, alignItems: 'flex-start' }}>
            <Icon name="info" size={15} color={MB.ink.tertiary} />
            <span>{greyReason}</span>
          </div>
        )}
      </div>
    </div>
  );
}

// ─── Listing card — Ausbildungsstelle ─────────────────────────────
function ListingCardAusbildung({ listing, density = 'compact', greyed, greyReason }) {
  const t = MB.ausbildung;
  const pad = density === 'expanded' ? 18 : 14;
  return (
    <div className="mb-card mb-listing-card" style={{
      background: MB.surface.raised, border: `1px solid ${MB.line.hair}`,
      borderRadius: 14, overflow: 'hidden', position: 'relative',
      opacity: greyed ? 0.6 : 1, filter: greyed ? 'saturate(0.6)' : 'none',
      boxShadow: MB.shadow.card,
    }}>
      <div style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 4, background: t[600] }} />
      {listing.urgent && <UrgencyStrip days={listing.urgentDays} tone="Ausbildung" />}
      <div style={{ padding: `${pad}px ${pad}px ${pad}px ${pad + 6}px` }}>
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
          <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>
            <TypePill type="Ausbildung" subtype={listing.subtype} size={density === 'expanded' ? 'md' : 'sm'} />
            {listing.sonderfach && <Chip tone="neutral" size="sm" style={{ color: MB.specialty[listing.sonderfach] || MB.specialty.default }}>{listing.sonderfach}</Chip>}
          </div>
          {!greyed && <Icon name="bookmark" size={18} color={MB.ink.tertiary} />}
        </div>
        <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: density === 'expanded' ? 19 : 17, fontWeight: 700, color: MB.ink.primary, letterSpacing: -0.2, lineHeight: 1.25 }}>
          {listing.title}
        </div>
        <div style={{ marginTop: 10, display: 'grid', gridTemplateColumns: '1fr', gap: 6, fontFamily: MB.font, fontSize: 14, color: MB.ink.secondary, fontVariantNumeric: 'tabular-nums' }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="clock" size={15} color={MB.ink.tertiary} />{listing.rotation} · Start {listing.start}</div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="pin" size={15} color={MB.ink.tertiary} />{listing.location}</div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}><Icon name="euro" size={15} color={MB.ink.tertiary} /><strong style={{ color: MB.ink.primary, fontWeight: 600 }}>{listing.stipendium}</strong></div>
        </div>
        {density === 'expanded' && (
          <div style={{ marginTop: 14, paddingTop: 14, borderTop: `1px solid ${MB.line.hair}`, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
            <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
              <Avatar name={listing.host} size={32} verified />
              <div>
                <div style={{ fontFamily: MB.font, fontSize: 14, fontWeight: 600, color: MB.ink.primary }}>{listing.host}</div>
                <div style={{ fontFamily: MB.font, fontSize: 12, color: MB.ink.tertiary }}>{listing.hostPractice}</div>
              </div>
            </div>
            {!greyed && <Button kind="primary" size="sm" tone={t}>Bewerben</Button>}
          </div>
        )}
        {greyed && greyReason && (
          <div style={{ marginTop: 12, padding: '10px 12px', background: MB.surface.canvas2, borderRadius: 10, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, display: 'flex', gap: 8, alignItems: 'flex-start' }}>
            <Icon name="info" size={15} color={MB.ink.tertiary} />
            <span>{greyReason}</span>
          </div>
        )}
      </div>
    </div>
  );
}

// Generic dispatcher used in lists
function ListingCard(props) {
  return props.listing.type === 'Vertretung'
    ? <ListingCardVertretung {...props} />
    : <ListingCardAusbildung {...props} />;
}

// Doctor / applicant card
function DoctorCard({ doctor, action }) {
  return (
    <div style={{
      background: MB.surface.raised, border: `1px solid ${MB.line.hair}`,
      borderRadius: 14, padding: 16, display: 'flex', gap: 14, alignItems: 'flex-start',
      boxShadow: MB.shadow.card,
    }}>
      <Avatar name={doctor.name} size={48} verified={doctor.verified} />
      <div style={{ flex: 1, minWidth: 0 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
          <span style={{ fontFamily: MB.font, fontSize: 16, fontWeight: 700, color: MB.ink.primary, letterSpacing: -0.2 }}>{doctor.name}</span>
        </div>
        <div style={{ marginTop: 4, display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>
          <CareerChip stage={doctor.stage} size="sm" />
          {doctor.rating && <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, fontVariantNumeric: 'tabular-nums' }}>
            <Icon name="star-filled" size={13} color={MB.warning[600]} />{doctor.rating} <span style={{ color: MB.ink.tertiary }}>({doctor.ratings})</span>
          </span>}
        </div>
        {doctor.context && <div style={{ marginTop: 8, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, lineHeight: 1.4 }}>{doctor.context}</div>}
        {action && <div style={{ marginTop: 12 }}>{action}</div>}
      </div>
    </div>
  );
}

// Booking summary
function BookingCard({ booking }) {
  const t = booking.type === 'Vertretung' ? MB.vertretung : MB.ausbildung;
  const statusTone = booking.status === 'Bestätigt' ? 'success' : booking.status === 'Heute' ? 'warning' : 'neutral';
  return (
    <div className="mb-card mb-booking-card" style={{
      background: MB.surface.raised, border: `1px solid ${MB.line.hair}`,
      borderRadius: 14, overflow: 'hidden', boxShadow: MB.shadow.card, position: 'relative',
    }}>
      <div style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 4, background: t[600] }} />
      <div style={{ padding: '16px 16px 16px 22px' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>
          <TypePill type={booking.type} size="sm" />
          <Chip tone={statusTone} size="sm">{booking.status}</Chip>
        </div>
        <div style={{ fontFamily: MB.font, fontSize: 17, fontWeight: 700, color: MB.ink.primary, letterSpacing: -0.2 }}>{booking.title}</div>
        <div style={{ marginTop: 8, display: 'flex', flexWrap: 'wrap', gap: 14, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, fontVariantNumeric: 'tabular-nums' }}>
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}><Icon name="calendar" size={14} />{booking.dateRange}</span>
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}><Icon name="pin" size={14} />{booking.location}</span>
        </div>
      </div>
    </div>
  );
}

// News feed item — editorial (clean, magazine-style: category eyebrow, headline, dek)
function NewsCard({ item, compact, onOpen }) {
  return (
    <div onClick={onOpen} style={{ background: MB.surface.raised, border: `1px solid ${MB.line.hair}`, borderRadius: 14, overflow: 'hidden', boxShadow: MB.shadow.card, cursor: onOpen ? 'pointer' : 'default' }}>
      {!compact && (
        <div style={{ height: 132, background: MB.brand[50], borderBottom: `1px solid ${MB.brand[100]}`, position: 'relative', overflow: 'hidden' }}>
          <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', flexDirection: 'column', gap: 6 }}>
            <Icon name="image" size={28} color={MB.brand[600]} />
            <span style={{ fontFamily: 'ui-monospace, monospace', fontSize: 10, color: MB.brand[700], letterSpacing: 1, textTransform: 'uppercase', fontWeight: 600 }}>Editorial image</span>
          </div>
        </div>
      )}
      <div style={{ padding: 16 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, fontFamily: MB.font, fontSize: 11, fontWeight: 700, color: MB.brand[700], letterSpacing: 0.6, textTransform: 'uppercase' }}>
          <span>{item.category || 'News'}</span>
          <span style={{ width: 3, height: 3, borderRadius: 999, background: MB.ink.tertiary }} />
          <span style={{ color: MB.ink.tertiary, fontWeight: 600, letterSpacing: 0.4 }}>{item.source}</span>
        </div>
        <div style={{ marginTop: 8, fontFamily: MB.font, fontSize: 17, fontWeight: 700, color: MB.ink.primary, lineHeight: 1.25, letterSpacing: -0.2, textWrap: 'pretty' }}>{item.headline}</div>
        <div style={{ marginTop: 6, fontFamily: MB.font, fontSize: 14, color: MB.ink.secondary, lineHeight: 1.45, textWrap: 'pretty' }}>{item.summary}</div>
        {item.date && <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: 12, color: MB.ink.tertiary, fontVariantNumeric: 'tabular-nums' }}>{item.date}</div>}
      </div>
    </div>
  );
}

// News feed item — Fortbildung / training event (DFP-Punkte, CTA "Anmelden")
function TrainingCard({ item, onEnroll }) {
  const c = MB.ausbildung; // reuse the Ausbildung amber tone — "growth / learning"
  return (
    <div style={{ background: MB.surface.raised, border: `1px solid ${MB.line.hair}`, borderRadius: 14, overflow: 'hidden', boxShadow: MB.shadow.card, position: 'relative' }}>
      <div style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 4, background: c[600] }} />
      <div style={{ padding: '14px 16px 16px 20px' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
          <Chip tone="ausbildung" strong size="sm" leading={<Icon name="graduation" size={12} />}>Fortbildung</Chip>
          <span style={{ fontFamily: MB.font, fontSize: 11, fontWeight: 700, letterSpacing: 0.5, textTransform: 'uppercase', color: MB.ink.tertiary }}>{item.category}</span>
        </div>
        <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: 17, fontWeight: 700, color: MB.ink.primary, lineHeight: 1.25, letterSpacing: -0.2, textWrap: 'pretty' }}>{item.headline}</div>
        <div style={{ marginTop: 6, fontFamily: MB.font, fontSize: 14, color: MB.ink.secondary, lineHeight: 1.45, textWrap: 'pretty' }}>{item.summary}</div>

        <div style={{ marginTop: 12, padding: '10px 12px', background: c[50], border: `1px solid ${c[100]}`, borderRadius: 10, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, fontFamily: MB.font, fontVariantNumeric: 'tabular-nums' }}>
          <TrainingFact icon="calendar" k="Termin"     v={item.date} />
          <TrainingFact icon="clock"    k="Dauer"      v={item.duration} />
          <TrainingFact icon="badge-check" k="DFP-Punkte" v={`${item.dfp} Punkte`} accent={c[700]} />
          <TrainingFact icon="euro"     k="Kosten"     v={item.cost} />
        </div>

        <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: 12, color: MB.ink.tertiary }}>
          {item.source} · <span style={{ color: MB.ink.secondary, fontWeight: 600 }}>{item.enrolled.toLocaleString('de-AT')} angemeldet</span>
        </div>

        <div style={{ marginTop: 12, display: 'flex', gap: 8 }}>
          <Button kind="primary" tone={c} size="md" onClick={onEnroll}>Anmelden</Button>
          <Button kind="ghost" size="md">Details</Button>
        </div>
      </div>
    </div>
  );
}

function TrainingFact({ icon, k, v, accent }) {
  return (
    <div style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>
      <Icon name={icon} size={14} color={accent || MB.ink.tertiary} />
      <div style={{ minWidth: 0 }}>
        <div style={{ fontFamily: MB.font, fontSize: 11, fontWeight: 600, color: MB.ink.tertiary, letterSpacing: 0.3, textTransform: 'uppercase' }}>{k}</div>
        <div style={{ marginTop: 1, fontFamily: MB.font, fontSize: 13, fontWeight: 700, color: accent || MB.ink.primary, lineHeight: 1.2 }}>{v}</div>
      </div>
    </div>
  );
}

// News feed item — sponsored
function SponsoredCard({ item }) {
  return (
    <div style={{ background: MB.sponsored.bg, border: `1px solid ${MB.sponsored.border}`, borderRadius: 14, padding: 16 }}>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
        <span style={{ fontFamily: MB.font, fontSize: 11, fontWeight: 700, letterSpacing: 1, color: MB.sponsored.fg, textTransform: 'uppercase', padding: '3px 8px', background: 'rgba(0,0,0,0.05)', borderRadius: 4 }}>Anzeige</span>
        <span style={{ fontFamily: MB.font, fontSize: 12, color: MB.sponsored.fg }}>{item.advertiser}</span>
      </div>
      <div style={{ marginTop: 10, fontFamily: MB.font, fontSize: 16, fontWeight: 700, color: MB.ink.primary, lineHeight: 1.25, letterSpacing: -0.15, textWrap: 'pretty' }}>{item.headline}</div>
      <div style={{ marginTop: 4, fontFamily: MB.font, fontSize: 13, color: MB.ink.secondary, lineHeight: 1.45 }}>{item.summary}</div>
      <div style={{ marginTop: 12, display: 'flex', alignItems: 'center', gap: 10 }}>
        <Button kind="secondary" size="sm">Mehr erfahren</Button>
        <span style={{ fontFamily: MB.font, fontSize: 11, color: MB.sponsored.fg, opacity: 0.85, flex: 1, textAlign: 'right' }}>Zielgruppe: {item.targeting}</span>
      </div>
    </div>
  );
}

// Dashboard quicklink — uses Angebotstyp soft bg + strong icon
function Quicklink({ type, label, sub, onClick }) {
  const t = type === 'Vertretung' ? MB.vertretung : MB.ausbildung;
  return (
    <button onClick={onClick} style={{
      flex: 1, background: t[50], border: `1px solid ${t[100]}`, borderRadius: 14,
      padding: '14px 14px', display: 'flex', flexDirection: 'column', gap: 10, alignItems: 'flex-start',
      cursor: 'pointer', fontFamily: MB.font, textAlign: 'left', minWidth: 0,
    }}>
      <span style={{ width: 36, height: 36, borderRadius: 10, background: t[600], color: '#fff', display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}>
        <Icon name={type === 'Vertretung' ? 'stethoscope' : 'graduation'} size={20} color="#fff" />
      </span>
      <div>
        <div style={{ fontSize: 15, fontWeight: 700, color: t[700], letterSpacing: -0.15, lineHeight: 1.2 }}>{label}</div>
        <div style={{ marginTop: 2, fontSize: 12, color: MB.ink.secondary }}>{sub}</div>
      </div>
    </button>
  );
}

Object.assign(window, { ListingCard, ListingCardVertretung, ListingCardAusbildung, DoctorCard, BookingCard, NewsCard, SponsoredCard, TrainingCard, Quicklink });
