// Report Screen — KPI grid, creator cards/table, strategy panel

function KpiCard({ label, value, sublabel, tone = 'neutral' }) {
  const accent = { neutral:'var(--ink-900)', brand:'var(--lime-500)', approve:'var(--approve-solid)', maybe:'var(--maybe-solid)', reject:'var(--reject-solid)', pending:'var(--pending-solid)' }[tone];
  return (
    <div style={{ position:'relative', overflow:'hidden', display:'flex', flexDirection:'column', gap:6, padding:'16px 16px 14px',
      background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', boxShadow:'var(--shadow-sm)' }}>
      <span style={{ position:'absolute', left:0, top:0, bottom:0, width:3, background:accent }} />
      <span style={{ font:'var(--type-caption)', color:'var(--text-secondary)' }}>{label}</span>
      <span className="tnum" style={{ font:'var(--weight-bold) var(--text-3xl)/1 var(--font-display)', color:'var(--text-strong)', letterSpacing:'var(--tracking-tight)' }}>{value}</span>
      {sublabel && <span style={{ font:'var(--type-caption)', color:'var(--text-muted)' }}>{sublabel}</span>}
    </div>
  );
}

function Avatar({ name='', platform }) {
  const PAL = [['#E7F0C8','#5C6B14'],['#DCEBF3','#2A5C7C'],['#F7DDD4','#93311F'],['#FAEBCF','#8A5A0C'],['#DCF3E3','#146B3A']];
  let h=0; for(let i=0;i<name.length;i++) h=(h*31+name.charCodeAt(i))>>>0;
  const [bg,fg]=PAL[h%PAL.length];
  const clean=name.replace(/^@/,'').replace(/[._-]+/g,' ').trim();
  const parts=clean.split(/\s+/);
  const init=((parts[0]?.[0]||'')+(parts[1]?.[0]||'')).toUpperCase()||clean.slice(0,2).toUpperCase();
  return (
    <div style={{ position:'relative', width:48, height:48, flexShrink:0 }}>
      <div style={{ width:48, height:48, borderRadius:'50%', background:bg, color:fg, display:'flex', alignItems:'center', justifyContent:'center', font:'var(--weight-bold) 17px/1 var(--font-display)', border:'1px solid rgba(0,0,0,0.06)' }}>{init}</div>
      {platform && <span style={{ position:'absolute', right:-2, bottom:-2, minWidth:18, height:18, padding:'0 3px', display:'flex', alignItems:'center', justifyContent:'center', borderRadius:'var(--radius-pill)', background:'var(--ink-950)', color:'var(--lime-500)', border:'2px solid var(--surface-card)', font:'var(--weight-bold) 7px/1 var(--font-mono)', letterSpacing:'0.03em' }}>{platform==='ig'?'IG':'TT'}</span>}
    </div>
  );
}

function ScoreBar({ label, value, tone='auto' }) {
  const pct = Math.max(0, Math.min(100, value));
  const c = { auto: pct>=80?'var(--approve-solid)':pct>=60?'var(--maybe-solid)':pct>=40?'var(--pending-solid)':'var(--reject-solid)', brand:'var(--lime-500)' }[tone] || (pct>=80?'var(--approve-solid)':pct>=60?'var(--maybe-solid)':'var(--reject-solid)');
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:4 }}>
      <div style={{ display:'flex', justifyContent:'space-between', font:'var(--type-caption)', color:'var(--text-secondary)' }}>
        <span>{label}</span><span className="tnum" style={{ fontFamily:'var(--font-mono)', fontWeight:700, color:'var(--text-strong)' }}>{value}</span>
      </div>
      <div style={{ height:5, borderRadius:'var(--radius-pill)', background:'var(--surface-muted)' }}>
        <div style={{ height:'100%', width:pct+'%', background:c, borderRadius:'var(--radius-pill)', transition:'width var(--dur-slow) var(--ease-out)' }} />
      </div>
    </div>
  );
}

function CreatorCardFull({ creator }) {
  const [expanded, setExpanded] = React.useState(false);
  const [shortlisted, setShortlisted] = React.useState(false);
  const fmt = n => n>=1e6?(n/1e6).toFixed(1)+'M':n>=1e3?(n/1e3).toFixed(n%1e3===0?0:1)+'K':String(n);
  return (
    <article style={{ display:'flex', flexDirection:'column', background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', boxShadow:'var(--shadow-sm)', overflow:'hidden' }}>
      {/* Header */}
      <div style={{ display:'flex', gap:12, padding:'18px 18px 0', alignItems:'flex-start' }}>
        <Avatar name={creator.username} platform={creator.platform} />
        <div style={{ flex:1, minWidth:0 }}>
          <div style={{ display:'flex', alignItems:'center', gap:8, flexWrap:'wrap' }}>
            <a href={creator.platformUrl || undefined} target="_blank" rel="noopener noreferrer" style={{ font:'var(--weight-bold) var(--text-md)/1.1 var(--font-display)', color:'var(--text-strong)', letterSpacing:'-0.01em' }}>{creator.username}</a>
            <Bdg tone="neutral" size="sm">{creator.platform==='ig'?'Instagram':'TikTok'}</Bdg>
          </div>
          <div style={{ font:'var(--type-body-sm)', color:'var(--text-secondary)', marginTop:4 }}>
            <span className="tnum"><strong style={{ color:'var(--text-body)', fontFamily:'var(--font-mono)' }}>{fmt(creator.followers)}</strong> Follower</span>
            {creator.engagement!=null && <><span style={{ margin:'0 6px', color:'var(--border-strong)' }}>·</span><span className="tnum">{creator.engagement}% ER</span></>}
          </div>
        </div>
        <RecBdg value={creator.recommendation} emphasis="strong" size="sm" />
      </div>

      {/* Scores */}
      <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:14, padding:'14px 18px' }}>
        <ScoreBar label="Match Score" value={creator.matchScore} />
        <ScoreBar label="Priority Score" value={creator.priorityScore} tone="brand" />
      </div>

      {/* DNA */}
      {creator.dna && <div style={{ padding:'0 18px 12px' }}>
        <div className="eyebrow" style={{ marginBottom:4 }}>Creator DNA</div>
        <p style={{ font:'var(--type-body-sm)', color:'var(--text-body)', textWrap:'pretty' }}>{creator.dna}</p>
      </div>}

      {/* Expanded */}
      {expanded && (
        <div style={{ display:'flex', flexDirection:'column', gap:12, padding:'0 18px 6px' }}>
          {creator.reasoning && (
            <div style={{ padding:14, background:'var(--surface-panel)', borderRadius:'var(--radius-md)', border:'1px solid var(--border)' }}>
              <div className="eyebrow" style={{ color:'var(--text-accent)', marginBottom:5 }}>AI Reasoning</div>
              <p style={{ font:'var(--type-body-sm)', color:'var(--text-body)' }}>{creator.reasoning}</p>
            </div>
          )}
          {creator.risks?.length > 0 && (
            <div>
              <div className="eyebrow" style={{ color:'var(--reject-fg)', marginBottom:6 }}>Risiko-Hinweise</div>
              {creator.risks.map((r,i) => (
                <div key={i} style={{ display:'flex', gap:8, alignItems:'flex-start', font:'var(--type-body-sm)', color:'var(--text-body)', marginBottom:4 }}>
                  <span style={{ color:'var(--reject-solid)', marginTop:1, flexShrink:0 }}>{Icons.warn}</span><span>{r}</span>
                </div>
              ))}
            </div>
          )}
        </div>
      )}

      {/* Contact */}
      <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:8, padding:'12px 18px', marginTop:'auto', borderTop:'1px solid var(--border)' }}>
        {creator.email
          ? <span className="tnum" style={{ font:'var(--weight-medium) var(--text-xs)/1 var(--font-mono)', color:'var(--text-body)', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{creator.email}</span>
          : <Bdg tone="pending" size="sm" variant="outline">{creator.contact||'Keine E-Mail'}</Bdg>}
        <div style={{ display:'flex', gap:6 }}>
          <IcoBtn icon={Icons.copy} title="Kontakt kopieren" variant="soft" size="sm" onClick={()=>creator.email && navigator.clipboard?.writeText(creator.email)} />
          <IcoBtn icon={Icons.external} title="Profil öffnen" variant="soft" size="sm" onClick={()=>creator.platformUrl && window.open(creator.platformUrl, '_blank', 'noopener,noreferrer')} />
        </div>
      </div>

      {/* Actions */}
      <div style={{ display:'flex', gap:8, padding:'0 18px 18px' }}>
        <Btn variant={shortlisted?'accent':'primary'} size="sm" onClick={()=>setShortlisted(s=>!s)} style={{ flex:1 }}>
          {shortlisted ? '✓ Shortlist' : 'Zur Shortlist'}
        </Btn>
        <Btn variant="secondary" size="sm" onClick={()=>setExpanded(e=>!e)} style={{ flex:1 }}>{expanded?'Weniger':'Details'}</Btn>
        <Btn variant="ghost" size="sm" style={{ color:'var(--reject-fg)' }}>Ablehnen</Btn>
      </div>
    </article>
  );
}

function TableView({ creators }) {
  const fmt = n => n>=1e3?(n/1e3).toFixed(n%1e3===0?0:1)+'K':String(n);
  return (
    <div style={{ overflowX:'auto', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', background:'var(--surface-card)' }}>
      <table style={{ width:'100%', borderCollapse:'collapse', minWidth:760 }}>
        <thead>
          <tr>{['Plattform','Username','Follower','Match','Priority','ER','Empfehlung','E-Mail','Aktion'].map(h => (
            <th key={h} style={{ textAlign:h==='Match'||h==='Priority'||h==='ER'||h==='Follower'?'right':'left', padding:'10px 14px', background:'var(--surface-panel)', borderBottom:'1px solid var(--border-strong)', font:'var(--weight-semibold) var(--text-2xs)/1 var(--font-sans)', letterSpacing:'var(--tracking-caps)', textTransform:'uppercase', color:'var(--text-muted)', whiteSpace:'nowrap' }}>{h}</th>
          ))}</tr>
        </thead>
        <tbody>
          {creators.map((c, ri) => (
            <tr key={c.username} style={{ borderBottom: ri<creators.length-1?'1px solid var(--border)':'none' }}>
              <td style={{ padding:'11px 14px' }}><Bdg size="sm" tone="neutral">{c.platform==='ig'?'IG':'TT'}</Bdg></td>
              <td style={{ padding:'11px 14px', font:'var(--weight-medium) var(--text-sm)/1 var(--font-mono)', color:'var(--text-strong)' }}>{c.username}</td>
              <td style={{ padding:'11px 14px', textAlign:'right', font:'var(--weight-medium) var(--text-sm)/1 var(--font-mono)', fontVariantNumeric:'tabular-nums', color:'var(--text-body)' }}>{fmt(c.followers)}</td>
              <td style={{ padding:'11px 14px', textAlign:'right', font:'var(--weight-bold) var(--text-sm)/1 var(--font-mono)', fontVariantNumeric:'tabular-nums', color:'var(--text-strong)' }}>{c.matchScore}</td>
              <td style={{ padding:'11px 14px', textAlign:'right', font:'var(--weight-medium) var(--text-sm)/1 var(--font-mono)', fontVariantNumeric:'tabular-nums', color:'var(--text-body)' }}>{c.priorityScore}</td>
              <td style={{ padding:'11px 14px', textAlign:'right', font:'var(--weight-medium) var(--text-sm)/1 var(--font-mono)', fontVariantNumeric:'tabular-nums', color:'var(--text-secondary)' }}>{c.engagement}%</td>
              <td style={{ padding:'11px 14px' }}><RecBdg value={c.recommendation} size="sm" /></td>
              <td style={{ padding:'11px 14px', font:'var(--text-sm)/1 var(--font-mono)', color:'var(--text-secondary)' }}>{c.email ? <span style={{ color:'var(--approve-fg)' }}>✓</span> : '—'}</td>
              <td style={{ padding:'11px 14px' }}>
                <div style={{ display:'flex', gap:6 }}>
                  <IcoBtn icon={Icons.external} title="Profil" variant="ghost" size="sm" onClick={()=>c.platformUrl && window.open(c.platformUrl, '_blank', 'noopener,noreferrer')} />
                  <IcoBtn icon={Icons.copy} title="Kontakt" variant="ghost" size="sm" onClick={()=>c.email && navigator.clipboard?.writeText(c.email)} />
                </div>
              </td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

function StrategyPanel({ campaign }) {
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:16 }}>
      <div style={{ background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', padding:20 }}>
        <div className="eyebrow" style={{ marginBottom:12 }}>Kampagne</div>
        <div style={{ display:'flex', flexDirection:'column', gap:8 }}>
          {[
            ['Brief', campaign.brief],
            ['Plattformen', Array.isArray(campaign.platforms) ? campaign.platforms.join(' & ') : campaign.platforms],
            ['Region', campaign.region],
            ['Follower', `${campaign.followerMin || 0} – ${campaign.followerMax || '∞'}`],
            ['Modus', campaign.analysisMode],
          ].map(([k,v]) => (
            <div key={k} style={{ display:'flex', gap:8, font:'var(--type-body-sm)' }}>
              <span style={{ color:'var(--text-muted)', minWidth:80 }}>{k}</span>
              <span style={{ color:'var(--text-body)', fontWeight:500 }}>{v}</span>
            </div>
          ))}
        </div>
      </div>
      <div style={{ background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', padding:20 }}>
        <div className="eyebrow" style={{ marginBottom:12 }}>Generierte Hashtags</div>
        <div style={{ display:'flex', flexWrap:'wrap', gap:6 }}>
          {campaign.hashtags.map(h => (
            <span key={h} style={{ display:'inline-flex', alignItems:'center', height:26, padding:'0 10px', borderRadius:'var(--radius-pill)', background:'var(--surface-panel)', border:'1px solid var(--border-strong)', font:'var(--weight-medium) var(--text-xs)/1 var(--font-mono)', color:'var(--text-body)' }}>{h}</span>
          ))}
        </div>
      </div>
      <div style={{ background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', padding:20, gridColumn:'span 2' }}>
        <div className="eyebrow" style={{ marginBottom:8 }}>Ideale Creator-Persona</div>
        <p style={{ font:'var(--type-body)', color:'var(--text-body)', lineHeight:'var(--leading-relaxed)' }}>{campaign.persona}</p>
        <div className="eyebrow" style={{ marginTop:16, marginBottom:8, color:'var(--reject-fg)' }}>Content Red Flags</div>
        <div style={{ display:'flex', flexWrap:'wrap', gap:8 }}>
          {campaign.redFlags.map(f => (
            <Bdg key={f} tone="reject" variant="soft" size="sm">{f}</Bdg>
          ))}
        </div>
      </div>
    </div>
  );
}


function EmptyReport({ normalized, onNew }) {
  return (
    <div style={{ flex:1, overflow:'auto', background:'var(--surface-app)', display:'flex', flexDirection:'column' }}>
      <div style={{ padding:'20px 32px', borderBottom:'1px solid var(--border)', background:'var(--surface-card)', display:'flex', alignItems:'center', gap:16 }}>
        <div style={{ flex:1 }}>
          <div style={{ font:'var(--type-h3)', color:'var(--text-strong)' }}>Kein echter Report vorhanden</div>
          <div style={{ font:'var(--type-body-sm)', color:'var(--text-secondary)', marginTop:3 }}>Es werden keine Sample- oder Platzhalterdaten angezeigt.</div>
        </div>
        <Btn variant="primary" size="sm" onClick={onNew} iconLeft={Icons.plus}>Neue Kampagne</Btn>
      </div>
      <div style={{ padding:'40px 32px', display:'flex', justifyContent:'center' }}>
        <div style={{ width:'100%', maxWidth:760, background:'var(--surface-card)', border:'1px solid var(--border)', borderRadius:'var(--radius-lg)', padding:28, boxShadow:'var(--shadow-sm)' }}>
          <div style={{ width:56, height:56, borderRadius:'50%', background:'var(--pending-bg)', color:'var(--pending-fg)', border:'1px solid var(--pending-solid)', display:'flex', alignItems:'center', justifyContent:'center', marginBottom:16 }}>{Icons.info}</div>
          <div style={{ font:'var(--type-h2)', color:'var(--text-strong)' }}>Empty State</div>
          <p style={{ font:'var(--type-body)', color:'var(--text-secondary)', marginTop:8 }}>Starte einen Preflight-bestätigten Job oder öffne einen vorhandenen Run. Ohne Backend-Ergebnis bleibt der Report leer.</p>
          <div style={{ marginTop:18, display:'grid', gridTemplateColumns:'repeat(4, 1fr)', gap:10 }}>
            <KpiCard label="Gefunden" value={normalized.kpis?.found || 0} />
            <KpiCard label="Gescored" value={normalized.kpis?.scored || 0} />
            <KpiCard label="Approved" value={normalized.kpis?.approved || 0} tone="approve" />
            <KpiCard label="Warnings" value={normalized.kpis?.warnings || 0} tone="reject" />
          </div>
          {normalized.stopReason && <div style={{ marginTop:18, padding:14, border:'1px solid var(--border)', borderRadius:'var(--radius-md)', background:'var(--surface-panel)' }}><div className="eyebrow">Stop-Grund</div><div style={{ font:'var(--type-body-sm)', color:'var(--text-body)', marginTop:6 }}>{normalized.stopReason}</div></div>}
          {normalized.missing?.length > 0 && <div style={{ marginTop:14 }}><div className="eyebrow" style={{ color:'var(--reject-fg)', marginBottom:8 }}>Missing Config</div><div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>{normalized.missing.map((item)=> <Bdg key={item} tone="reject" size="sm" variant="soft">{item}</Bdg>)}</div></div>}
          {normalized.diagnostics?.length > 0 && <div style={{ marginTop:14 }}><div className="eyebrow" style={{ marginBottom:8 }}>Diagnostics</div><div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>{normalized.diagnostics.map((item)=> <Bdg key={item} tone={String(item).includes('error') || String(item).includes('0') ? "pending" : "neutral"} size="sm" variant="soft">{item}</Bdg>)}</div></div>}
          {normalized.campaign?.hashtags?.length > 0 && <div style={{ marginTop:14 }}><div className="eyebrow" style={{ marginBottom:8 }}>Suchqueries</div><div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>{normalized.campaign.hashtags.map((item)=> <Bdg key={item} tone="brand" size="sm" variant="soft">{item}</Bdg>)}</div></div>}
        </div>
      </div>
    </div>
  );
}

function downloadText(filename, text, type='application/json') {
  const blob = new Blob([text], { type });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename;
  a.click();
  URL.revokeObjectURL(url);
}

function csvEscape(value) {
  return `"${String(value ?? '').replace(/"/g, '""')}"`;
}

function ReportScreen({ onNew, reportData }) {
  const [view, setView] = React.useState('cards');
  const normalized = window.DiscoveryApi.normalizeReport(reportData);
  const { creators, campaign, kpis } = normalized;
  const hasReport = Boolean(reportData) && (creators.length > 0 || normalized.status !== 'empty');
  const downloadJson = () => downloadText(`${normalized.runId || 'discovery-report'}.json`, JSON.stringify(reportData, null, 2));
  const downloadCsv = () => {
    const rows = [['platform','username','followers','matchScore','priorityScore','email','profileUrl'], ...creators.map((c)=>[c.platform,c.username,c.followers,c.matchScore,c.priorityScore,c.email,c.platformUrl])];
    downloadText(`${normalized.runId || 'discovery-creators'}.csv`, rows.map((row)=>row.map(csvEscape).join(',')).join('\n'), 'text/csv');
  };
  if (!hasReport || creators.length === 0) return <EmptyReport normalized={normalized} onNew={onNew} />;

  return (
    <div style={{ flex:1, overflow:'auto', background:'var(--surface-app)', display:'flex', flexDirection:'column' }}>
      {/* Top bar */}
      <div style={{ padding:'20px 32px', borderBottom:'1px solid var(--border)', background:'var(--surface-card)', display:'flex', alignItems:'center', gap:16, flexWrap:'wrap', position:'sticky', top:0, zIndex:10 }}>
        <div style={{ flex:1 }}>
          <div style={{ font:'var(--type-h3)', color:'var(--text-strong)' }}>Report — Influencer Discovery</div>
          <div style={{ font:'var(--type-body-sm)', color:'var(--text-secondary)', marginTop:3 }}>{Array.isArray(campaign.platforms) ? campaign.platforms.join(' & ') : campaign.platforms} · {campaign.region} · {campaign.followerMin || 0}–{campaign.followerMax || '∞'} Follower · {campaign.analysisMode}</div>
        </div>
        <div style={{ display:'flex', gap:8 }}>
          <Btn variant="secondary" size="sm" onClick={downloadCsv} iconLeft={Icons.download}>CSV</Btn>
          <Btn variant="secondary" size="sm" onClick={downloadJson} iconLeft={Icons.download}>JSON</Btn>
          <Btn variant="primary" size="sm" onClick={onNew} iconLeft={Icons.plus}>Neue Kampagne</Btn>
        </div>
      </div>

      <div style={{ padding:'28px 32px', display:'flex', flexDirection:'column', gap:24 }}>
        {/* KPIs */}
        <div style={{ display:'grid', gridTemplateColumns:'repeat(7, 1fr)', gap:10 }}>
          <KpiCard label="Gefunden" value={kpis.found} />
          <KpiCard label="Qualifiziert" value={kpis.filtered} sublabel="nach Filter" />
          <KpiCard label="Gescored" value={kpis.scored} />
          <KpiCard label="Approved" value={kpis.approved} tone="approve" sublabel="Strong Yes" />
          <KpiCard label="Mit E-Mail" value={kpis.email} tone="brand" />
          <KpiCard label="Health Checks" value={kpis.healthCheck} tone="pending" sublabel="offen" />
          <KpiCard label="Warnungen" value={kpis.warnings} tone="reject" />
        </div>

        {/* Tabs */}
        <div style={{ display:'flex', gap:2, borderBottom:'1px solid var(--border)', paddingBottom:0 }}>
          {[['cards','Creator-Karten'],['table','Tabellenansicht'],['strategy','Suchstrategie']].map(([id,lbl]) => (
            <button key={id} onClick={()=>setView(id)} style={{
              height:38, padding:'0 16px', border:'none', cursor:'pointer',
              background:'transparent', font:`var(--weight-${view===id?'semibold':'medium'}) var(--text-sm)/1 var(--font-sans)`,
              color: view===id?'var(--text-strong)':'var(--text-secondary)',
              borderBottom: view===id?'2px solid var(--brand)':'2px solid transparent',
              transition:'color var(--dur-fast)',
            }}>{lbl}</button>
          ))}
        </div>

        {/* Content */}
        {view === 'cards' && (
          <div style={{ display:'grid', gridTemplateColumns:'repeat(auto-fill, minmax(340px, 1fr))', gap:16 }}>
            {creators.map(c => <CreatorCardFull key={c.username} creator={c} />)}
          </div>
        )}
        {view === 'table' && <TableView creators={creators} />}
        {view === 'strategy' && <StrategyPanel campaign={campaign} />}
      </div>
    </div>
  );
}

Object.assign(window, { ReportScreen });
