// Showrooms — leaderboard / comparison view across all locations
function Showrooms({ deals, showrooms, reps, stages, openDeal, setShowroom }) {
  // Aggregate per showroom
  const agg = showrooms.map(s => {
    const sDeals = deals.filter(d => d.showroom === s.id);
    const won = sDeals.filter(d => d.stage === 'sold');
    const lost = sDeals.filter(d => d.stage === 'lost');
    const active = sDeals.filter(d => d.stage !== 'sold' && d.stage !== 'lost');
    const wonVal = won.reduce((sm, d) => sm + d.value, 0);
    const pipelineVal = active.reduce((sm, d) => sm + d.value, 0);
    const closed = won.length + lost.length;
    const winRate = closed ? won.length / closed : 0;
    const avgDeal = won.length ? wonVal / won.length : 0;
    const stuck = active.filter(d => d.lastActivityDaysAgo > 21).length;
    // Activity volume
    const activityCount = sDeals.reduce((sm, d) => sm + d.activities.length, 0);
    // Stage conversion: number of deals that have reached each stage
    const stageOrder = ['possible','in_progress','sold'];
    const stageReached = stageOrder.map((sid, i) => {
      return sDeals.filter(d => {
        if (d.stage === 'lost') return false;
        return stageOrder.indexOf(d.stage) >= i;
      }).length;
    });
    return {
      ...s,
      sDeals, won, lost, active,
      wonVal, pipelineVal, wonCount: won.length, lostCount: lost.length, activeCount: active.length,
      winRate, avgDeal, stuck, activityCount,
      quotaPct: wonVal / s.target,
      stageReached,
    };
  }).sort((a, b) => b.wonVal - a.wonVal);

  // Top reps across showrooms
  const repAgg = reps.map(r => {
    const rDeals = deals.filter(d => d.rep === r.id);
    const won = rDeals.filter(d => d.stage === 'sold');
    const lost = rDeals.filter(d => d.stage === 'lost');
    const wonVal = won.reduce((sm, d) => sm + d.value, 0);
    const closed = won.length + lost.length;
    return {
      ...r,
      wonVal, wonCount: won.length, lostCount: lost.length,
      winRate: closed ? won.length / closed : 0,
      activeCount: rDeals.filter(d => d.stage !== 'sold' && d.stage !== 'lost').length,
      homeShowroom: showrooms.find(s => s.id === r.home),
      worksAt: r.works.map(id => showrooms.find(s => s.id === id)),
    };
  }).sort((a, b) => b.wonVal - a.wonVal);

  const maxStage = Math.max(...agg.flatMap(a => a.stageReached), 1);

  return (
    <div>
      {/* Big cards — one per showroom */}
      <div className="showroom-cards">
        {agg.map((s, i) => (
          <div key={s.id} className="sh-card" onClick={() => setShowroom(s.id)}>
            <span className={`sh-card-bar ${s.id}`}></span>
            <span className={`sh-card-rank ${i === 0 ? 'first' : ''}`}>#{i + 1}</span>
            <div className="sh-card-hd" style={{ paddingLeft: 8 }}>
              <div>
                <div className="sh-card-name">{s.name}</div>
                <div className="sh-card-state">{s.state} · since {s.openedYear}</div>
              </div>
            </div>
            <div className="sh-card-metrics" style={{ paddingLeft: 8 }}>
              <div className="sh-metric">
                <div className="lbl">Closed-won</div>
                <div className="val">{fmt.money(s.wonVal, true)}</div>
              </div>
              <div className="sh-metric">
                <div className="lbl">Pipeline</div>
                <div className="val">{fmt.money(s.pipelineVal, true)}</div>
              </div>
              <div className="sh-metric">
                <div className="lbl">Win rate</div>
                <div className="val">{fmt.pct(s.winRate, 0)}</div>
              </div>
              <div className="sh-metric">
                <div className="lbl">Avg deal</div>
                <div className="val">{fmt.money(s.avgDeal, true)}</div>
              </div>
            </div>
            <div className="sh-quota" style={{ paddingLeft: 8 }}>
              <div className="sh-quota-row">
                <span>Quota progress</span>
                <span className="num">{fmt.pct(s.quotaPct, 0)} of {fmt.money(s.target, true)}</span>
              </div>
              <div className="sh-quota-bar">
                <div className={`sh-quota-fill ${s.quotaPct >= 1 ? 'over' : ''}`} style={{ width: Math.min(s.quotaPct, 1.2) * 100 + '%' }}></div>
              </div>
              <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 8, fontSize: 11, color: 'var(--ink-3)' }}>
                <span><span className="num">{s.wonCount}</span> wins · <span className="num">{s.activeCount}</span> active</span>
                {s.stuck > 0 && <span style={{ color: 'var(--lost)' }}><span className="num">{s.stuck}</span> stuck</span>}
              </div>
            </div>
          </div>
        ))}
      </div>

      <div className="grid-2-eq">
        {/* Detailed comparison table */}
        <div className="card">
          <div className="card-hd">
            <div>
              <div className="card-title">Performance comparison</div>
              <div className="card-sub">All metrics side-by-side</div>
            </div>
          </div>
          <div className="tbl-wrap">
            <table className="tbl">
              <thead>
                <tr>
                  <th>Metric</th>
                  {agg.map(s => (
                    <th key={s.id} className="num-col">
                      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 6 }}>
                        <span style={{ width: 8, height: 8, borderRadius: 4, background: `var(--ss-${s.id}, oklch(0.5 0.1 200))` }} className={`ss-tab-dot ${s.id}`}></span>
                        {s.name}
                      </div>
                    </th>
                  ))}
                </tr>
              </thead>
              <tbody>
                <ComparisonRow label="Closed-won" rows={agg} get={s => fmt.money(s.wonVal, true)} best={Math.max(...agg.map(s => s.wonVal))} val={s => s.wonVal}/>
                <ComparisonRow label="Pipeline value" rows={agg} get={s => fmt.money(s.pipelineVal, true)} best={Math.max(...agg.map(s => s.pipelineVal))} val={s => s.pipelineVal}/>
                <ComparisonRow label="Win rate" rows={agg} get={s => fmt.pct(s.winRate, 0)} best={Math.max(...agg.map(s => s.winRate))} val={s => s.winRate}/>
                <ComparisonRow label="Avg deal size" rows={agg} get={s => fmt.money(s.avgDeal, true)} best={Math.max(...agg.map(s => s.avgDeal))} val={s => s.avgDeal}/>
                <ComparisonRow label="Deals closed" rows={agg} get={s => s.wonCount + s.lostCount} best={Math.max(...agg.map(s => s.wonCount + s.lostCount))} val={s => s.wonCount + s.lostCount}/>
                <ComparisonRow label="Active deals" rows={agg} get={s => s.activeCount} best={Math.max(...agg.map(s => s.activeCount))} val={s => s.activeCount}/>
                <ComparisonRow label="Activity volume" rows={agg} get={s => s.activityCount} best={Math.max(...agg.map(s => s.activityCount))} val={s => s.activityCount}/>
                <ComparisonRow label="Quota progress" rows={agg} get={s => fmt.pct(s.quotaPct, 0)} best={Math.max(...agg.map(s => s.quotaPct))} val={s => s.quotaPct}/>
                <ComparisonRow label="Stuck deals" rows={agg} get={s => s.stuck} worstHigh best={Math.min(...agg.map(s => s.stuck))} val={s => s.stuck} invert/>
              </tbody>
            </table>
          </div>
        </div>

        {/* Closed-won bar chart */}
        <div className="card">
          <div className="card-hd">
            <div>
              <div className="card-title">Closed-won by showroom</div>
              <div className="card-sub">Current period · AUD</div>
            </div>
          </div>
          <div className="card-pad">
            {agg.map(s => {
              const maxWon = Math.max(...agg.map(x => x.wonVal), 1);
              return (
                <div className="chart-row" key={s.id} style={{ gridTemplateColumns: '120px 1fr 90px' }}>
                  <div className="lbl">
                    <span className={`ss-tab-dot ${s.id}`} style={{ width: 8, height: 8, borderRadius: 4 }}></span>
                    {s.name}
                  </div>
                  <div className="bar-wrap" style={{ height: 26 }}>
                    <div
                      className="bar"
                      style={{
                        width: (s.wonVal / maxWon * 100) + '%',
                        background: `var(--ss-${s.id})`,
                      }}
                    >
                      {s.wonVal / maxWon > 0.18 && <span>{fmt.money(s.wonVal, true)}</span>}
                    </div>
                    {/* Target marker */}
                    <div style={{
                      position: 'absolute',
                      left: (s.target / maxWon * 100) + '%',
                      top: -3, bottom: -3,
                      width: 2, background: 'var(--ink)',
                    }}/>
                  </div>
                  <div className="val">
                    <span className="num">{s.wonCount}</span> wins
                  </div>
                </div>
              );
            })}
            <div style={{ display: 'flex', gap: 16, marginTop: 12, fontSize: 11, color: 'var(--ink-3)' }}>
              <span><span style={{ display: 'inline-block', width: 12, height: 2, background: 'var(--ink)', verticalAlign: 'middle', marginRight: 4 }}></span>Target</span>
              <span style={{ marginLeft: 'auto' }}>Team total: <span className="num" style={{ color: 'var(--ink-2)', fontWeight: 500 }}>{fmt.money(agg.reduce((s, x) => s + x.wonVal, 0), true)}</span></span>
            </div>

            <div className="divider"></div>

            <div style={{ fontSize: 11, color: 'var(--ink-3)', textTransform: 'uppercase', letterSpacing: '0.06em', marginBottom: 10, fontWeight: 500 }}>
              Activity volume (calls · emails · meetings)
            </div>
            {agg.map(s => {
              const maxAct = Math.max(...agg.map(x => x.activityCount), 1);
              return (
                <div className="chart-row" key={s.id + 'act'} style={{ gridTemplateColumns: '120px 1fr 90px' }}>
                  <div className="lbl">
                    <span className={`ss-tab-dot ${s.id}`} style={{ width: 8, height: 8, borderRadius: 4 }}></span>
                    {s.name}
                  </div>
                  <div className="bar-wrap" style={{ height: 22 }}>
                    <div className="bar" style={{ width: (s.activityCount / maxAct * 100) + '%', background: 'var(--ink-2)' }}>
                      {s.activityCount / maxAct > 0.18 && <span className="num">{s.activityCount}</span>}
                    </div>
                  </div>
                  <div className="val">
                    <span className="num">{(s.activityCount / s.sDeals.length).toFixed(1)}</span> per deal
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      </div>

      {/* Stage conversion comparison */}
      <div className="card" style={{ marginBottom: 18 }}>
        <div className="card-hd">
          <div>
            <div className="card-title">Stage conversion · by showroom</div>
            <div className="card-sub">% of deals that reached each stage · highest in row highlighted</div>
          </div>
        </div>
        <div className="card-pad">
          <StageConversionTable agg={agg}/>
        </div>
      </div>

      {/* Top reps overall */}
      <div className="card">
        <div className="card-hd">
          <div>
            <div className="card-title">Top sales reps · all showrooms</div>
            <div className="card-sub">Ranked by closed-won across the entire team</div>
          </div>
        </div>
        <div className="tbl-wrap" style={{ maxHeight: 'calc(100vh - 320px)', overflowY: 'auto' }}>
          <table className="tbl">
            <thead>
              <tr>
                <th>#</th>
                <th>Sales rep</th>
                <th>Home showroom</th>
                <th>Works at</th>
                <th className="num-col">Wins</th>
                <th className="num-col">Closed-won</th>
                <th className="num-col">Win rate</th>
                <th className="num-col">Active</th>
                <th className="num-col">Quota</th>
              </tr>
            </thead>
            <tbody>
              {repAgg.map((r, i) => (
                <tr key={r.id}>
                  <td className="mono" style={{ color: 'var(--ink-3)', fontSize: 11.5 }}>{String(i + 1).padStart(2, '0')}</td>
                  <td>
                    <div className="rep-cell">
                      <Avatar name={r.name} sz="sm"/>
                      <span style={{ fontWeight: 500 }}>{r.name}</span>
                    </div>
                  </td>
                  <td>
                    <span className="pill">
                      <span className={`ss-tab-dot ${r.home}`}></span>
                      {r.homeShowroom.name}
                    </span>
                  </td>
                  <td>
                    {r.worksAt.map(s => (
                      <span key={s.id} className="chip-soft" style={{ background: `oklch(0.95 0.02 90)` }}>
                        {s.name}
                      </span>
                    ))}
                  </td>
                  <td className="num-col">
                    <span className="num" style={{ color: 'var(--won)', fontWeight: 500 }}>{r.wonCount}</span>
                    <span style={{ color: 'var(--ink-3)' }} className="num"> / {r.lostCount}L</span>
                  </td>
                  <td className="num-col"><span className="num" style={{ fontWeight: 500 }}>{fmt.money(r.wonVal, true)}</span></td>
                  <td className="num-col"><span className="num">{fmt.pct(r.winRate, 0)}</span></td>
                  <td className="num-col"><span className="num">{r.activeCount}</span></td>
                  <td className="num-col">
                    <div style={{ display: 'flex', flexDirection: 'column', gap: 2, alignItems: 'flex-end' }}>
                      <span className="num" style={{ fontSize: 11, color: 'var(--ink-3)' }}>{fmt.pct(r.wonVal / r.quota, 0)}</span>
                      <div style={{ width: 70, height: 4, background: 'var(--surface-3)', borderRadius: 2 }}>
                        <div style={{ height: '100%', width: Math.min(r.wonVal / r.quota, 1.2) * 100 + '%', background: r.wonVal >= r.quota ? 'var(--won)' : 'var(--accent)', borderRadius: 2 }}/>
                      </div>
                    </div>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      </div>
    </div>
  );
}

function ComparisonRow({ label, rows, get, best, val, invert }) {
  return (
    <tr>
      <td style={{ fontWeight: 500, fontSize: 12.5 }}>{label}</td>
      {rows.map(s => {
        const v = val(s);
        const isBest = invert ? v === best : v === best && v > 0;
        return (
          <td key={s.id} className="num-col">
            <span
              className="num"
              style={isBest ? {
                fontWeight: 600,
                background: 'var(--won-soft)',
                color: 'oklch(0.32 0.1 155)',
                padding: '2px 8px',
                borderRadius: 4,
              } : null}
            >
              {get(s)}
            </span>
          </td>
        );
      })}
    </tr>
  );
}

function StageConversionTable({ agg }) {
  const stageLabels = ['Possible Sale', 'In Progress', 'Sold'];
  const stageIds = ['possible', 'in_progress', 'sold'];

  return (
    <div className="funnel-compare">
      <div className="fc-hd lbl-col">Stage</div>
      {agg.map(s => (
        <div className="fc-hd" key={s.id}>
          <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6 }}>
            <span className={`ss-tab-dot ${s.id}`}></span>
            {s.name}
          </div>
        </div>
      ))}
      {stageLabels.map((lbl, i) => {
        // Conversion at each stage = reached/start
        const values = agg.map(s => ({
          showroom: s,
          pct: s.stageReached[0] > 0 ? s.stageReached[i] / s.stageReached[0] : 0,
          count: s.stageReached[i],
        }));
        const maxPct = Math.max(...values.map(v => v.pct), 0.01);
        return (
          <React.Fragment key={stageIds[i]}>
            <div className="fc-stage-lbl">
              <span style={{ width: 8, height: 8, borderRadius: 4, background: `var(--s-${stageIds[i]})`, display: 'inline-block' }}></span>
              {lbl}
            </div>
            {values.map(v => {
              const isMax = v.pct === maxPct && v.pct > 0;
              return (
                <div
                  key={v.showroom.id}
                  className={`fc-cell ${isMax ? 'on-active' : ''}`}
                  style={isMax ? {
                    background: 'var(--ink)',
                    color: 'white',
                  } : {
                    background: `oklch(0.97 0.005 80 / ${Math.max(0.3, v.pct / maxPct)})`,
                  }}
                >
                  <div className="pct">{fmt.pct(v.pct, 0)}</div>
                  <div className="cnt"><span className="num">{v.count}</span> deals</div>
                </div>
              );
            })}
          </React.Fragment>
        );
      })}
    </div>
  );
}

window.Showrooms = Showrooms;
