// Conversion Report — stage progression, time-in-stage, lead→sale velocity
function ConversionReport({ contacts, deals, reps, showrooms, period }) {
  // Period filter to contacts/deals
  const today = new Date();
  function inPeriod(dateStr) {
    if (period === 'all') return true;
    if (!dateStr) return false;
    const d = new Date(dateStr);
    if (isNaN(d)) return false;
    const monthsBack = period === '1mo' ? 1 : period === '3mo' ? 3 : period === '12mo' ? 12 : 60;
    const cutoff = new Date(today); cutoff.setMonth(cutoff.getMonth() - monthsBack);
    return d >= cutoff;
  }
  // Contacts without a firstContact date are always included (common for Supabase-synced records)
  const periodContacts = contacts.filter(c => {
    const d = c.firstContact || c.lastContact;
    if (!d) return true;
    return inPeriod(d);
  });
  const periodDeals = deals.filter(d => inPeriod(d.created));

  // Stage progression counts within the period
  const newLeads = periodContacts.filter(c => c.firstContact).length;
  const qualified = periodContacts.filter(c => ['qualified', 'in_pipeline', 'customer_active', 'past_customer', 'lost_quote'].includes(c.lifecycle)).length;
  const quoted = periodContacts.filter(c => (c.dealCount || 0) > 0 || ['in_pipeline','customer_active','past_customer','dormant_customer_active','dormant_past_customer'].includes(c.lifecycle)).length;
  const sold = periodContacts.filter(c => ['past_customer', 'customer_active', 'dormant_past_customer'].includes(c.lifecycle)).length;

  // Time-in-stage analysis from deals
  function daysBetween(a, b) {
    if (!a || !b) return null;
    return Math.floor((new Date(b) - new Date(a)) / 86400000);
  }

  const stageTimes = { qualifying: [], quoting: [], closing: [] };
  for (const d of periodDeals) {
    // qualifying: contact firstContact → designApptDate
    if (d.designApptDate) {
      const contact = contacts.find(c => (c.dealIds || []).includes(d.id));
      if (contact && contact.firstContact) {
        const t = daysBetween(contact.firstContact, d.designApptDate);
        if (t !== null && t >= 0 && t < 365) stageTimes.qualifying.push(t);
      }
    }
    // quoting: designApptDate → quotePresentationDate
    if (d.designApptDate && d.quotePresentationDate) {
      const t = daysBetween(d.designApptDate, d.quotePresentationDate);
      if (t !== null && t >= 0 && t < 365) stageTimes.quoting.push(t);
    }
    // closing: quotePresentationDate → forecastDepositMonth (won)
    if (d.stage === 'sold' && d.quotePresentationDate && (d.forecastDepositMonth || d.lastActivity)) {
      const t = daysBetween(d.quotePresentationDate, d.forecastDepositMonth || d.lastActivity);
      if (t !== null && t >= 0 && t < 365) stageTimes.closing.push(t);
    }
  }

  const stats = (arr) => {
    if (arr.length === 0) return { count: 0, avg: 0, median: 0, min: 0, max: 0 };
    const sorted = [...arr].sort((a, b) => a - b);
    const sum = arr.reduce((a, b) => a + b, 0);
    return {
      count: arr.length,
      avg: Math.round(sum / arr.length),
      median: sorted[Math.floor(sorted.length / 2)],
      min: sorted[0],
      max: sorted[sorted.length - 1],
    };
  };
  const qStats = stats(stageTimes.qualifying);
  const quoteStats = stats(stageTimes.quoting);
  const closeStats = stats(stageTimes.closing);

  // By showroom — progression
  const byShowroom = showrooms.map(s => {
    const sc = periodContacts.filter(c => c.homeShowroom === s.id);
    return {
      ...s,
      newLeads: sc.length,
      qualified: sc.filter(c => ['qualified', 'in_pipeline', 'customer_active', 'past_customer', 'lost_quote'].includes(c.lifecycle)).length,
      quoted: sc.filter(c => c.dealCount > 0).length,
      sold: sc.filter(c => ['past_customer', 'customer_active', 'dormant_past_customer'].includes(c.lifecycle)).length,
    };
  });

  // By salesperson — progression + timing
  const bySalesperson = reps.map(r => {
    const rc = periodContacts.filter(c => c.owner === r.name);
    const rd = periodDeals.filter(d => d.rep === r.id);
    const rQualifying = [], rQuoting = [], rClosing = [];
    for (const d of rd) {
      if (d.designApptDate) {
        const contact = contacts.find(c => (c.dealIds || []).includes(d.id));
        if (contact && contact.firstContact) {
          const t = daysBetween(contact.firstContact, d.designApptDate);
          if (t !== null && t >= 0 && t < 365) rQualifying.push(t);
        }
      }
      if (d.designApptDate && d.quotePresentationDate) {
        const t = daysBetween(d.designApptDate, d.quotePresentationDate);
        if (t !== null && t >= 0 && t < 365) rQuoting.push(t);
      }
      if (d.stage === 'sold' && d.quotePresentationDate && (d.forecastDepositMonth || d.lastActivity)) {
        const t = daysBetween(d.quotePresentationDate, d.forecastDepositMonth || d.lastActivity);
        if (t !== null && t >= 0 && t < 365) rClosing.push(t);
      }
    }
    const avg = (a) => a.length ? Math.round(a.reduce((x, y) => x + y, 0) / a.length) : 0;
    return {
      ...r,
      newLeads: rc.length,
      qualified: rc.filter(c => ['qualified', 'in_pipeline', 'customer_active', 'past_customer', 'lost_quote'].includes(c.lifecycle)).length,
      quoted: rc.filter(c => (c.dealCount || 0) > 0 || ['in_pipeline','customer_active','past_customer','dormant_customer_active','dormant_past_customer'].includes(c.lifecycle)).length,
      sold: rc.filter(c => ['past_customer', 'customer_active', 'dormant_past_customer'].includes(c.lifecycle)).length,
      avgQualifying: avg(rQualifying),
      avgQuoting: avg(rQuoting),
      avgClosing: avg(rClosing),
      avgTotal: avg(rQualifying) + avg(rQuoting) + avg(rClosing),
    };
  }).sort((a, b) => b.sold - a.sold);

  const totalCycle = qStats.avg + quoteStats.avg + closeStats.avg;

  return (
    <div>
      <div className="grid-kpis">
        <Kpi label="New contacts" value={fmt.num(newLeads)} foot="entered the funnel" deltaPct={0.04}/>
        <Kpi label="Progressed → Qualified" value={fmt.num(qualified)} foot={`${fmt.pct(qualified / Math.max(newLeads, 1), 0)} of contacts`} deltaPct={0.02}/>
        <Kpi label="Progressed → Quoted" value={fmt.num(quoted)} foot={`${fmt.pct(quoted / Math.max(qualified, 1), 0)} of qualified`} deltaPct={0.01}/>
        <Kpi label="Converted to Sale" value={fmt.num(sold)} foot={`${fmt.pct(sold / Math.max(quoted, 1), 0)} of quoted`} deltaPct={0.03}/>
      </div>

      <div className="card" style={{ marginBottom: 18 }}>
        <div className="card-hd">
          <div>
            <div className="card-title">Average time at each stage</div>
            <div className="card-sub">Days between key milestones · {periodDeals.length} deals analysed in period</div>
          </div>
          <div style={{ fontSize: 12, color: 'var(--ink-3)' }}>
            Total avg cycle: <strong className="num" style={{ color: 'var(--ink)' }}>{totalCycle} days</strong>
          </div>
        </div>
        {(qStats.count + quoteStats.count + closeStats.count) === 0 ? (
          <div style={{ padding: '20px 18px', fontSize: 12.5, color: 'var(--ink-3)', textAlign: 'center', borderTop: '1px solid var(--border)' }}>
            Stage timing will populate once your team records design appointment and quote presentation dates on deals.
          </div>
        ) : (
          <React.Fragment>
        <div className="tbl-wrap">
          <table className="tbl">
            <thead>
              <tr>
                <th>Stage transition</th>
                <th className="num-col">Deals</th>
                <th className="num-col">Average</th>
                <th className="num-col">Median</th>
                <th className="num-col">Fastest</th>
                <th className="num-col">Slowest</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>
                  <div style={{ fontWeight: 500 }}>First Contact → Design Appt</div>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>Qualifying phase</div>
                </td>
                <td className="num-col"><span className="num">{qStats.count}</span></td>
                <td className="num-col"><span className="num" style={{ fontWeight: 600, color: 'var(--accent)' }}>{qStats.avg} days</span></td>
                <td className="num-col"><span className="num">{qStats.median}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--won)' }}>{qStats.min}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--lost)' }}>{qStats.max}d</span></td>
              </tr>
              <tr>
                <td>
                  <div style={{ fontWeight: 500 }}>Design Appt → Quote Presented</div>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>Quoting phase</div>
                </td>
                <td className="num-col"><span className="num">{quoteStats.count}</span></td>
                <td className="num-col"><span className="num" style={{ fontWeight: 600, color: 'var(--accent)' }}>{quoteStats.avg} days</span></td>
                <td className="num-col"><span className="num">{quoteStats.median}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--won)' }}>{quoteStats.min}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--lost)' }}>{quoteStats.max}d</span></td>
              </tr>
              <tr>
                <td>
                  <div style={{ fontWeight: 500 }}>Quote Presented → Sold</div>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>Closing phase</div>
                </td>
                <td className="num-col"><span className="num">{closeStats.count}</span></td>
                <td className="num-col"><span className="num" style={{ fontWeight: 600, color: 'var(--won)' }}>{closeStats.avg} days</span></td>
                <td className="num-col"><span className="num">{closeStats.median}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--won)' }}>{closeStats.min}d</span></td>
                <td className="num-col"><span className="num" style={{ color: 'var(--lost)' }}>{closeStats.max}d</span></td>
              </tr>
            </tbody>
          </table>
        </div>
          </React.Fragment>
        )}
      </div>

      <div className="grid-2">
        <div className="card">
          <div className="card-hd">
            <div>
              <div className="card-title">Progression by showroom</div>
              <div className="card-sub">Funnel by location, in selected period</div>
            </div>
          </div>
          <div className="tbl-wrap">
            <table className="tbl">
              <thead>
                <tr>
                  <th>Showroom</th>
                  <th className="num-col">New</th>
                  <th className="num-col">Qual.</th>
                  <th className="num-col">Quoted</th>
                  <th className="num-col">Sold</th>
                  <th className="num-col">Conv.</th>
                </tr>
              </thead>
              <tbody>
                {byShowroom.map(s => (
                  <tr key={s.id}>
                    <td><span className="pill"><span className={`ss-tab-dot ${s.id}`}></span>{s.name}</span></td>
                    <td className="num-col"><span className="num">{s.newLeads}</span></td>
                    <td className="num-col"><span className="num">{s.qualified}</span></td>
                    <td className="num-col"><span className="num">{s.quoted}</span></td>
                    <td className="num-col"><span className="num" style={{ color: 'var(--won)', fontWeight: 500 }}>{s.sold}</span></td>
                    <td className="num-col"><span className="num">{fmt.pct(s.sold / Math.max(s.newLeads, 1), 0)}</span></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        <div className="card">
          <div className="card-hd">
            <div>
              <div className="card-title">Progression &amp; speed by designer</div>
              <div className="card-sub">Funnel + average days per stage</div>
            </div>
          </div>
          <div className="tbl-wrap" style={{ maxHeight: 360, overflowY: 'auto' }}>
            <table className="tbl">
              <thead>
                <tr>
                  <th>Designer</th>
                  <th className="num-col">New</th>
                  <th className="num-col">Sold</th>
                  <th className="num-col">Conv.</th>
                  <th className="num-col" title="First contact → design appt">Qual.</th>
                  <th className="num-col" title="Design appt → quote">Quote</th>
                  <th className="num-col" title="Quote → sold">Close</th>
                  <th className="num-col">Total</th>
                </tr>
              </thead>
              <tbody>
                {bySalesperson.map(r => (
                  <tr key={r.id}>
                    <td><div style={{ display: 'flex', alignItems: 'center', gap: 6 }}><Avatar name={r.name} sz="sm"/><span style={{ fontSize: 12 }}>{r.name}</span></div></td>
                    <td className="num-col"><span className="num">{r.newLeads}</span></td>
                    <td className="num-col"><span className="num" style={{ color: 'var(--won)', fontWeight: 500 }}>{r.sold}</span></td>
                    <td className="num-col"><span className="num">{fmt.pct(r.sold / Math.max(r.newLeads, 1), 0)}</span></td>
                    <td className="num-col"><span className="num" style={{ color: 'var(--ink-3)' }}>{r.avgQualifying || '—'}{r.avgQualifying ? 'd' : ''}</span></td>
                    <td className="num-col"><span className="num" style={{ color: 'var(--ink-3)' }}>{r.avgQuoting || '—'}{r.avgQuoting ? 'd' : ''}</span></td>
                    <td className="num-col"><span className="num" style={{ color: 'var(--ink-3)' }}>{r.avgClosing || '—'}{r.avgClosing ? 'd' : ''}</span></td>
                    <td className="num-col"><span className="num" style={{ fontWeight: 600, color: r.avgTotal > 60 ? 'var(--lost)' : r.avgTotal > 0 ? 'var(--accent)' : 'var(--ink-3)' }}>{r.avgTotal ? r.avgTotal + 'd' : '—'}</span></td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
          <div style={{ padding: '10px 16px', fontSize: 11, color: 'var(--ink-3)', borderTop: '1px solid var(--border)' }}>
            <strong>Qual.</strong> = First contact → design appt · <strong>Quote</strong> = Design appt → quote presented · <strong>Close</strong> = Quote → sold
          </div>
        </div>
      </div>
    </div>
  );
}

window.ConversionReport = ConversionReport;
