/* Reports List — library of every saved report.
   Chrome matches Report Center 2.0: TopBar breadcrumb + ReportHeader-style
   page header + PageSection-style card wrapping the table. */

/* ---------- 37 saved-report rows (matches screenshot order) ---------- */
const REPORT_ROWS = [
  { brand: 'American Outdoor Products', reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'American Outdoor Products', merchantType: 'Seller', marketplace: 'Mexico',         shared: false },
  { brand: 'American Outdoor Products', reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'American Outdoor Products', merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'American Outdoor Products', reports: ['Retail + Ads'],                                               dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'American Outdoor Products', merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'American Outdoor Products', reports: ['American Outdoor Products'],                                  dataSet: null,          adData: 'Active', retailData: 'Active',   merchantName: 'American Outdoor Products', merchantType: 'Vendor', marketplace: 'United States',  shared: false },
  { brand: 'Anubis Rio',                reports: ['Anubis Rio'],                                                 dataSet: null,          adData: null,      retailData: 'Activate', merchantName: 'Anubis Rio',                merchantType: 'Seller', marketplace: 'United States',  shared: false, ghost: true },
  { brand: 'Ash Apothecary',            reports: ['Ash Apothecary'],                                             dataSet: null,          adData: null,      retailData: 'Activate', merchantName: 'Ash Apothecary',            merchantType: 'Seller', marketplace: 'United States',  shared: false, ghost: true },
  { brand: 'BLUNT USA',                 reports: ['BLUNT USA'],                                                  dataSet: null,          adData: null,      retailData: 'Activate', merchantName: 'BLUNT USA',                 merchantType: 'Seller', marketplace: 'United States',  shared: false, ghost: true },
  { brand: 'Function 101',              reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Function 101',              merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'Fuse Lenses',               reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Fuse Lenses',               merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'Home IQ USA',               reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Home IQ USA',               merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'Hydrapak, LLC',             reports: ['Retail + Ads','Retail Performance','Sponsored Ads','Share of Voice'], dataSet: 'Ads + Ops', adData: 'Active', retailData: 'Active', merchantName: 'Hydrapak, LLC',           merchantType: 'Seller', marketplace: 'United States',  shared: true  },
  { brand: 'Hydrapak, LLC',             reports: ['Retail + Ads','Sponsored Ads'],                               dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Hydrapak - CA',             merchantType: 'Seller', marketplace: 'Canada',         shared: true  },
  { brand: 'Hydrapak, LLC',             reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Hydrapak - DE Sporting',    merchantType: 'Seller', marketplace: 'Germany (Pan-EU)', shared: true },
  { brand: 'Hydrapak, LLC',             reports: ['Retail + Ads','Retail Performance'],                          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Hydrapak - IT Sporting',    merchantType: 'Seller', marketplace: 'Italy (Pan-EU)',  shared: false },
  { brand: 'Hydrapak, LLC',             reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Hydrapak - FR Sporting',    merchantType: 'Seller', marketplace: 'France',         shared: false },
  { brand: 'Hydro Cell',                reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Hydro Cell',                merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'JDM Distribution UK',       reports: ['Retail + Ads'],                                               dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'JDM Distribution UK LTD',   merchantType: 'Seller', marketplace: 'United Kingdom', shared: false },
  { brand: 'KIWA',                      reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'KIWA',                      merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'KOKOLU',                    reports: ['KOKOLU'],                                                     dataSet: null,          adData: null,      retailData: 'Activate', merchantName: 'KOKOLU',                    merchantType: 'Seller', marketplace: 'United States',  shared: false, ghost: true },
  { brand: 'Popi Co',                   reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Popi Co',                   merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'Popi Co',                   reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Popi Co',                   merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'Stretch Labs',              reports: ['Retail + Ads','Retail Performance','Sponsored Ads','Share of Voice'], dataSet: 'Ads + Ops', adData: 'Active', retailData: 'Active', merchantName: 'Stretch Labs',            merchantType: 'Seller', marketplace: 'United States',  shared: true  },
  { brand: 'Titan Casket',              reports: ['Retail + Ads','Sponsored Ads'],                               dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Titan Casket',              merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'YOLO BRICK ROAD',           reports: ['Retail + Ads','Retail Performance','Sponsored Ads'],          dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'YOLO BRICK ROAD',           merchantType: 'Seller', marketplace: 'United States',  shared: false },
  { brand: 'American Outdoor Products', reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'American Outdoor Products', merchantType: 'Seller', marketplace: 'United Kingdom', shared: false },
  { brand: 'American Outdoor Products', reports: ['Sponsored Ads'],                                              dataSet: 'Ads Only',    adData: 'Active', retailData: null,       merchantName: 'American Outdoor Products', merchantType: 'Seller', marketplace: 'Germany (Pan-EU)', shared: false },
  { brand: 'Function 101',              reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Function 101',              merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'Fuse Lenses',               reports: ['Share of Voice'],                                             dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Fuse Lenses',               merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'Hydro Cell',                reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Hydro Cell',                merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'Home IQ USA',               reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Home IQ USA',               merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'Hydrapak, LLC',             reports: ['Sponsored Ads'],                                              dataSet: 'Ads Only',    adData: 'Active', retailData: null,       merchantName: 'Hydrapak - DE Sporting',    merchantType: 'Seller', marketplace: 'Germany (Pan-EU)', shared: false },
  { brand: 'Hydrapak, LLC',             reports: ['Retail + Ads'],                                               dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'Hydrapak - FR Sporting',    merchantType: 'Seller', marketplace: 'France',         shared: false },
  { brand: 'Popi Co',                   reports: ['Sponsored Ads'],                                              dataSet: 'Ads Only',    adData: 'Active', retailData: null,       merchantName: 'Popi Co',                   merchantType: 'Seller', marketplace: 'United Kingdom', shared: false },
  { brand: 'Stretch Labs',              reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Stretch Labs',              merchantType: 'Seller', marketplace: 'Canada',         shared: true  },
  { brand: 'Titan Casket',              reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'Titan Casket',              merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'YOLO BRICK ROAD',           reports: ['Retail Performance'],                                         dataSet: 'Retail Only', adData: null,      retailData: 'Active',   merchantName: 'YOLO BRICK ROAD',           merchantType: 'Seller', marketplace: 'Canada',         shared: false },
  { brand: 'KIWA',                      reports: ['Retail + Ads','Sponsored Ads'],                               dataSet: 'Ads + Ops',   adData: 'Active', retailData: 'Active',   merchantName: 'KIWA',                      merchantType: 'Seller', marketplace: 'Canada',         shared: false },
];

/* ---------- Chip palette ---------- */
const reportChipPalette = {
  'Retail + Ads':       { bg: 'color-mix(in srgb, var(--rc-green) 13%, transparent)', fg: 'var(--rc-green-ink)', border: 'color-mix(in srgb, var(--rc-green) 28%, transparent)' },
  'Retail Performance': { bg: 'color-mix(in srgb, var(--rc-green) 13%, transparent)', fg: 'var(--rc-green-ink)', border: 'color-mix(in srgb, var(--rc-green) 28%, transparent)' },
  'Sponsored Ads':      { bg: 'color-mix(in srgb, var(--rc-green) 13%, transparent)', fg: 'var(--rc-green-ink)', border: 'color-mix(in srgb, var(--rc-green) 28%, transparent)' },
  'Share of Voice':     { bg: 'color-mix(in srgb, var(--rc-green) 13%, transparent)', fg: 'var(--rc-green-ink)', border: 'color-mix(in srgb, var(--rc-green) 28%, transparent)' },
};

const StatusPill = ({ label }) => {
  if (!label) return <span style={{ color: 'var(--rc-text-mute)', fontSize: 12 }}>N/A</span>;
  const active = label === 'Active';
  return (
    <span style={{
      display: 'inline-flex', alignItems: 'center',
      padding: '3px 10px', borderRadius: 4, fontSize: 11, fontWeight: 500,
      background: active ? 'var(--rc-green)' : 'var(--rc-chip-bg)',
      color: active ? '#fff' : 'var(--rc-text-sub)',
      border: active ? 'none' : '1px solid var(--rc-border)',
      letterSpacing: 0.2, whiteSpace: 'nowrap',
    }}>{label}</span>
  );
};

const ReportChip = ({ label, merchantName }) => {
  const pal = reportChipPalette[label];
  const href = `Report Center 2.0.html?merchant=${encodeURIComponent(merchantName || '')}&report=${encodeURIComponent(label)}`;
  if (pal) {
    return (
      <a href={href} style={{
        display: 'inline-flex', alignItems: 'center', gap: 5,
        padding: '3px 9px', borderRadius: 5, fontSize: 11, fontWeight: 500,
        background: pal.bg, color: pal.fg, border: `1px solid ${pal.border}`,
        textDecoration: 'none', whiteSpace: 'nowrap',
      }}>
        <span style={{ width: 5, height: 5, borderRadius: 9999, background: 'var(--rc-green)' }} />
        {label}
      </a>
    );
  }
  // Ghost — not yet saved
  return (
    <a href={href} style={{
      display: 'inline-flex', alignItems: 'center', gap: 6,
      padding: '3px 9px', borderRadius: 5, fontSize: 11,
      background: 'transparent', color: 'var(--rc-text-mute)',
      border: '1px dashed var(--rc-border)',
      textDecoration: 'none', whiteSpace: 'nowrap',
    }}>
      <svg width="10" height="10" viewBox="0 0 12 12" fill="none"><path d="M2 3h8M2 6h8M2 9h5" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round"/></svg>
      {label}
    </a>
  );
};

const SortCaret = ({ dir }) => (
  <svg width="10" height="10" viewBox="0 0 12 12" fill="none" style={{ marginLeft: 4 }}>
    <path d={dir === 'asc' ? 'M3 8l3-4 3 4' : 'M3 4l3 4 3-4'} stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
  </svg>
);

/* Filter-chip style matching BreadChip in TopBar */
const ActiveFilterChip = ({ label, onRemove, icon = 'sort' }) => (
  <span style={{
    display: 'inline-flex', alignItems: 'center', gap: 6,
    padding: '3px 9px', borderRadius: 5, fontSize: 11, fontWeight: 500,
    background: 'var(--rc-chip-bg)', border: '1px solid var(--rc-border)',
    color: 'var(--rc-text)', lineHeight: 1.2,
  }}>
    <ChipIcon name={icon} />
    {label}
    <button onClick={onRemove} style={{
      border: 0, background: 'transparent', color: 'var(--rc-text-mute)',
      cursor: 'pointer', padding: 0, display: 'inline-flex',
    }}>
      <Icon name="x" size={10} strokeWidth={2} />
    </button>
  </span>
);

const ChipIcon = ({ name }) => {
  if (name === 'sort') return (
    <svg width="10" height="10" viewBox="0 0 16 16" fill="none" style={{ color: 'var(--rc-text-mute)' }}>
      <g stroke="currentColor" strokeWidth="1.3" strokeLinecap="round">
        <path d="M5 3v10M3 5l2-2 2 2" />
        <path d="M11 13V3M9 11l2 2 2-2" />
      </g>
    </svg>
  );
  if (name === 'group') return (
    <svg width="10" height="10" viewBox="0 0 12 12" fill="currentColor" style={{ color: 'var(--rc-text-mute)' }}>
      <circle cx="3" cy="3" r="1" /><circle cx="6" cy="3" r="1" /><circle cx="9" cy="3" r="1" />
      <circle cx="3" cy="6" r="1" /><circle cx="6" cy="6" r="1" /><circle cx="9" cy="6" r="1" />
      <circle cx="3" cy="9" r="1" /><circle cx="6" cy="9" r="1" /><circle cx="9" cy="9" r="1" />
    </svg>
  );
  return <span style={{ width: 5, height: 5, borderRadius: 9999, background: 'var(--rc-text-mute)' }} />;
};

/* ---------- Top Bar specific to Reports list ---------- */
const ReportsTopBar = ({ role = 'admin' }) => {
  const roleLabel = { admin: 'Admin', editor: 'Editor', viewer: 'Viewer' }[role];
  return (
    <div style={{
      display: 'flex', alignItems: 'center', justifyContent: 'space-between',
      background: 'var(--rc-card)', borderBottom: '1px solid var(--rc-border)',
      padding: '6px 14px', fontSize: 12, minHeight: 42, flexShrink: 0,
    }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 6, color: 'var(--rc-text)', fontWeight: 600 }}>
          <Icon name="file" size={13} />
          <span>Reports</span>
        </div>
        <span style={{ color: 'var(--rc-border)' }}>/</span>
        <span style={{ color: 'var(--rc-text-sub)' }}>All merchants</span>
      </div>
      <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
        <Pill tone={role === 'admin' ? 'dark' : 'ghost'} size="sm">
          <Icon name={role === 'viewer' ? 'eye' : 'lock'} size={10} />
          {roleLabel}
        </Pill>
        <div style={{ width: 1, height: 14, background: 'var(--rc-border)', margin: '0 6px' }} />
        <IconBtn name="search" title="Search" />
        <IconBtn name="refresh" title="Refresh" />
        <IconBtn name="bell" title="Notifications" />
        <span style={{
          display: 'inline-flex', alignItems: 'center', gap: 4,
          padding: '4px 8px', fontSize: 12, color: 'var(--rc-text)', fontWeight: 500,
        }}>
          <span style={{ color: 'var(--rc-green-ink)' }}>$</span> USD
          <Icon name="chevronDown" size={10} />
        </span>
      </div>
    </div>
  );
};

/* ---------- Page header (ReportHeader echo) ---------- */
const ReportsPageHeader = () => (
  <div style={{
    background: 'var(--rc-card)',
    borderBottom: '1px solid var(--rc-border)',
    padding: '18px 24px 16px',
  }}>
    <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between' }}>
      <div>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 6, fontSize: 12, color: 'var(--rc-text-sub)' }}>
          <span>Workspace</span>
          <Icon name="chevronRight" size={11} />
          <span style={{ color: 'var(--rc-text)', fontWeight: 500 }}>Reports</span>
        </div>
        <div style={{ display: 'flex', alignItems: 'baseline', gap: 10 }}>
          <h1 style={{
            margin: 0, fontFamily: 'Poppins', fontSize: 22, fontWeight: 700,
            color: 'var(--rc-text)', letterSpacing: '-0.02em', lineHeight: 1.2,
          }}>Reports</h1>
          <span style={{ fontSize: 12, color: 'var(--rc-text-sub)' }}>
            Browse, group, and share the report library for your brands and merchants.
          </span>
        </div>
      </div>
      <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
        <Btn icon="plus" variant="outline" size="sm">Save View</Btn>
        <Btn icon="download" variant="outline" size="sm">Export</Btn>
        <Btn icon="plus" variant="primary" size="sm">New Report</Btn>
      </div>
    </div>
  </div>
);

/* ---------- Table (PageSection-style card) ---------- */
const Th = ({ children, style, onClick, sorted, dir }) => (
  <th onClick={onClick} style={{
    textAlign: 'left', padding: '9px 12px',
    fontSize: 11, fontWeight: 500,
    color: 'var(--rc-text-sub)', background: 'var(--rc-subtle)',
    borderBottom: '1px solid var(--rc-border)', whiteSpace: 'nowrap',
    cursor: onClick ? 'pointer' : 'default',
    ...style,
  }}>
    <span style={{ display: 'inline-flex', alignItems: 'center' }}>
      {children}
      {sorted && <SortCaret dir={dir} />}
    </span>
  </th>
);

const Td = ({ children, style }) => (
  <td style={{
    padding: '10px 12px', fontSize: 12,
    color: 'var(--rc-text)', whiteSpace: 'nowrap',
    verticalAlign: 'middle', borderTop: '1px solid var(--rc-border-soft)',
    ...style,
  }}>{children}</td>
);

const RLCheckbox = ({ checked, indeterminate, onChange, onClick }) => {
  const ref = React.useRef(null);
  React.useEffect(() => {
    if (ref.current) ref.current.indeterminate = !!indeterminate && !checked;
  }, [indeterminate, checked]);
  return (
    <span onClick={(e) => { e.stopPropagation(); onClick && onClick(e); }}
      style={{
        display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
        width: 14, height: 14, borderRadius: 3, cursor: 'pointer', flexShrink: 0,
        border: '1.5px solid ' + (checked || indeterminate ? 'var(--rc-green)' : 'var(--rc-border)'),
        background: checked || indeterminate ? 'var(--rc-green)' : 'var(--rc-card)',
        color: '#fff',
      }}>
      {checked && (
        <svg width="9" height="9" viewBox="0 0 12 12" fill="none"><path d="M2.5 6l2.5 2.5L9.5 3.5" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/></svg>
      )}
      {indeterminate && !checked && (
        <svg width="9" height="9" viewBox="0 0 12 12"><path d="M3 6h6" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/></svg>
      )}
      <input ref={ref} type="checkbox" checked={!!checked} onChange={onChange || (() => {})} style={{ display: 'none' }} />
    </span>
  );
};

const PageBtn = ({ children, onClick, active, disabled }) => (
  <button onClick={onClick} disabled={disabled} style={{
    minWidth: 24, height: 24, padding: '0 6px',
    border: '1px solid ' + (active ? 'var(--rc-green)' : 'var(--rc-border)'),
    background: active ? 'var(--rc-green)' : 'var(--rc-card)',
    color: active ? '#fff' : (disabled ? 'var(--rc-text-mute)' : 'var(--rc-text)'),
    borderRadius: 4, cursor: disabled ? 'not-allowed' : 'pointer',
    fontSize: 11, fontFamily: 'inherit', fontWeight: active ? 600 : 400,
  }}>{children}</button>
);

const DragHandle = () => (
  <span style={{ color: 'var(--rc-text-mute)', cursor: 'grab', display: 'inline-flex' }}>
    <svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor">
      <circle cx="5" cy="4" r="1"/><circle cx="11" cy="4" r="1"/>
      <circle cx="5" cy="8" r="1"/><circle cx="11" cy="8" r="1"/>
      <circle cx="5" cy="12" r="1"/><circle cx="11" cy="12" r="1"/>
    </svg>
  </span>
);

/* Bulk action button — outline style matching Btn but compact */
const BulkBtn = ({ children, icon, onClick, danger }) => (
  <button onClick={onClick} style={{
    display: 'inline-flex', alignItems: 'center', gap: 5,
    padding: '5px 10px', borderRadius: 6, cursor: 'pointer', fontFamily: 'inherit',
    border: '1px solid ' + (danger ? 'color-mix(in srgb, var(--rc-red) 35%, transparent)' : 'var(--rc-border)'),
    background: 'var(--rc-card)',
    color: danger ? 'var(--rc-red)' : 'var(--rc-text)',
    fontSize: 11, fontWeight: 500,
  }}>
    {icon && <Icon name={icon} size={11} />}
    {children}
  </button>
);

/* RC-RPT-011 — inline editable merchant name (admin/manager only).
   Double-click to edit; Enter saves; Esc cancels. Client-side only
   until Data Hub wires the persistence mutation. */
const EditableName = ({ value, canEdit, editing, onStartEdit, onSave, onCancel }) => {
  const [draft, setDraft] = React.useState(value);
  React.useEffect(() => { if (editing) setDraft(value); }, [editing, value]);
  const inputRef = React.useRef(null);
  React.useEffect(() => { if (editing && inputRef.current) { inputRef.current.focus(); inputRef.current.select(); } }, [editing]);
  if (editing) {
    return (
      <input
        ref={inputRef}
        value={draft}
        onChange={e => setDraft(e.target.value)}
        onKeyDown={e => {
          if (e.key === 'Enter') { e.preventDefault(); onSave(draft.trim() || value); }
          if (e.key === 'Escape') { e.preventDefault(); onCancel(); }
        }}
        onBlur={() => onSave(draft.trim() || value)}
        onClick={e => e.stopPropagation()}
        style={{
          padding: '4px 8px', borderRadius: 5,
          border: '1px solid var(--rc-green)',
          background: 'var(--rc-card)', color: 'var(--rc-text)',
          fontSize: 12, fontFamily: 'inherit', outline: 'none',
          minWidth: 180,
        }}
      />
    );
  }
  return (
    <span
      onDoubleClick={canEdit ? (e) => { e.stopPropagation(); onStartEdit(); } : undefined}
      title={canEdit ? 'Double-click to rename' : value}
      style={{
        display: 'inline-block',
        padding: '2px 0',
        borderRadius: 3,
        cursor: canEdit ? 'text' : 'default',
      }}
    >{value}</span>
  );
};

/* ---------- Main page ---------- */
const ReportsListApp = () => {
  const [theme, setTheme] = React.useState('light');
  const [sortCol, setSortCol] = React.useState('brand');
  const [sortDir, setSortDir] = React.useState('asc');
  const [page, setPage] = React.useState(1);
  const [groupBy, setGroupBy] = React.useState('brand'); // 'brand' | null
  const [expanded, setExpanded] = React.useState({ 'American Outdoor Products': true });
  const [selected, setSelected] = React.useState(new Set()); // row indexes
  const [shareOpen, setShareOpen] = React.useState(false);
  /* RC-RPT-011 — rename inline edit state */
  const [editingName, setEditingName] = React.useState(null); // { id, value }
  /* RC-RPT-013 — delete confirm modal state */
  const [deleteModal, setDeleteModal] = React.useState(null); // { name, ids, isCore }
  /* override map: id → renamed merchantName (client-side only until Data Hub) */
  const [renameMap, setRenameMap] = React.useState({});
  const pageSize = 10;

  // Assign stable ids
  const rowsById = React.useMemo(
    () => REPORT_ROWS.map((r, i) => ({ ...r, __id: i })),
    []
  );

  React.useEffect(() => {
    document.documentElement.setAttribute('data-rc-theme', theme);
  }, [theme]);

  const sortedRows = React.useMemo(() => {
    const rows = [...rowsById];
    const dir = sortDir === 'asc' ? 1 : -1;
    rows.sort((a, b) => {
      const av = (a[sortCol] ?? '').toString().toLowerCase();
      const bv = (b[sortCol] ?? '').toString().toLowerCase();
      return av < bv ? -dir : av > bv ? dir : 0;
    });
    return rows;
  }, [sortCol, sortDir, rowsById]);

  // Build grouped structure when groupBy active; else flat
  const grouped = React.useMemo(() => {
    if (!groupBy) return null;
    const map = new Map();
    sortedRows.forEach(r => {
      const key = r[groupBy];
      if (!map.has(key)) map.set(key, []);
      map.get(key).push(r);
    });
    // sort group keys alphabetically
    return [...map.entries()].sort((a, b) => a[0].localeCompare(b[0]));
  }, [sortedRows, groupBy]);

  // For grouped view we page by group keys (one page = 10 groups); for flat by rows
  const totalItems = groupBy ? grouped.length : sortedRows.length;
  const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
  const pageSlice = groupBy
    ? grouped.slice((page - 1) * pageSize, page * pageSize)
    : sortedRows.slice((page - 1) * pageSize, page * pageSize);

  const onSort = (col) => {
    if (sortCol === col) setSortDir(sortDir === 'asc' ? 'desc' : 'asc');
    else { setSortCol(col); setSortDir('asc'); }
  };

  const toggleGroup = (key) => setExpanded(prev => ({ ...prev, [key]: !prev[key] }));

  // Selection helpers
  const toggleRow = (id) => setSelected(prev => {
    const next = new Set(prev);
    next.has(id) ? next.delete(id) : next.add(id);
    return next;
  });
  const toggleRows = (ids, on) => setSelected(prev => {
    const next = new Set(prev);
    ids.forEach(id => on ? next.add(id) : next.delete(id));
    return next;
  });
  const clearSelection = () => setSelected(new Set());
  const selectAllIds = rowsById.map(r => r.__id);
  const allSelected = selected.size === rowsById.length;
  const anySelected = selected.size > 0;

  // Ids visible on the current page (needed for the header checkbox + "select page" bulk)
  const visibleIds = React.useMemo(() => {
    if (!groupBy) return pageSlice.map(r => r.__id);
    return pageSlice.flatMap(([, rows]) => rows.map(r => r.__id));
  }, [pageSlice, groupBy]);
  const allVisibleSelected = visibleIds.length > 0 && visibleIds.every(id => selected.has(id));
  const someVisibleSelected = visibleIds.some(id => selected.has(id));

  React.useEffect(() => { setPage(1); }, [groupBy]);

  window.__role = 'admin';

  return (
    <div style={{ display: 'flex', height: '100vh', background: 'var(--rc-bg)', color: 'var(--rc-text)' }}>
      <IconRail active="reports" theme={theme} onThemeToggle={() => setTheme(theme === 'dark' ? 'light' : 'dark')} />
      <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, overflow: 'hidden' }}>
        <ReportsTopBar role="admin" />
        <ReportsPageHeader />

        <div style={{ flex: 1, overflow: 'auto', background: 'var(--rc-bg)', padding: 16 }}>
          {/* PageSection-style card */}
          <section style={{
            background: 'var(--rc-card)',
            border: '1px solid var(--rc-border)',
            borderRadius: 12,
            overflow: 'hidden',
            boxShadow: '0 1px 2px rgba(15,23,42,0.04)',
          }}>
            {/* Section header — mirrors PageSection */}
            <div style={{
              padding: '10px 16px',
              borderBottom: '1px solid var(--rc-border)',
              display: 'flex', alignItems: 'center', justifyContent: 'space-between',
              gap: 12, flexWrap: 'wrap',
            }}>
              <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
                <h2 style={{
                  margin: 0, fontFamily: 'Poppins', fontSize: 14, fontWeight: 700,
                  color: 'var(--rc-text)', letterSpacing: '-0.01em',
                }}><span style={{ color: 'var(--rc-text-mute)', fontWeight: 500 }}>{sortedRows.length} reports{groupBy && ` · ${grouped.length} groups`}</span></h2>
              </div>
              <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
                <ActiveFilterChip label="Merchant Name · Asc" icon="sort" onRemove={() => {}} />
                <ActiveFilterChip label="Brand Name · Asc" icon="sort" onRemove={() => {}} />
                {groupBy && <ActiveFilterChip label={`Group by ${groupBy === 'brand' ? 'Brand Name' : groupBy}`} icon="group" onRemove={() => setGroupBy(null)} />}
                <button onClick={() => { setGroupBy(null); }} style={{
                  border: 0, background: 'transparent', color: 'var(--rc-chart-1)',
                  fontSize: 11, cursor: 'pointer', padding: '2px 4px', fontFamily: 'inherit',
                }}>Clear all</button>
                <div style={{ width: 1, height: 18, background: 'var(--rc-border)', margin: '0 2px' }} />
                <button style={{
                  display: 'inline-flex', alignItems: 'center', gap: 5,
                  padding: '4px 9px', border: '1px solid var(--rc-border)', borderRadius: 6,
                  background: 'var(--rc-card)', color: 'var(--rc-text-sub)',
                  fontSize: 11, fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit',
                }}>
                  <Icon name="filter" size={11} />
                  Filter
                </button>
                <button style={{
                  display: 'inline-flex', alignItems: 'center', gap: 5,
                  padding: '4px 9px', border: '1px solid var(--rc-border)', borderRadius: 6,
                  background: 'var(--rc-card)', color: 'var(--rc-text-sub)',
                  fontSize: 11, fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit',
                }}>
                  <svg width="11" height="11" viewBox="0 0 16 16" fill="none"><g stroke="currentColor" strokeWidth="1.3" strokeLinecap="round"><path d="M5 3v10M3 5l2-2 2 2"/><path d="M11 13V3M9 11l2 2 2-2"/></g></svg>
                  Sort
                </button>
                <button style={{
                  display: 'inline-flex', alignItems: 'center', gap: 5,
                  padding: '4px 9px', border: '1px solid var(--rc-border)', borderRadius: 6,
                  background: 'var(--rc-card)', color: 'var(--rc-text-sub)',
                  fontSize: 11, fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit',
                }}>
                  <svg width="11" height="11" viewBox="0 0 16 16" fill="none"><g stroke="currentColor" strokeWidth="1.3" fill="none"><path d="M3 3h10v10H3zM6.5 3v10M9.5 3v10"/></g></svg>
                  Columns
                </button>
                <button onClick={() => setGroupBy(groupBy === 'brand' ? null : 'brand')} style={{
                  display: 'inline-flex', alignItems: 'center', gap: 5,
                  padding: '4px 9px', borderRadius: 6,
                  border: '1px solid ' + (groupBy ? 'color-mix(in srgb, var(--rc-green) 35%, transparent)' : 'var(--rc-border)'),
                  background: groupBy ? 'color-mix(in srgb, var(--rc-green) 10%, transparent)' : 'var(--rc-card)',
                  color: groupBy ? 'var(--rc-green-ink)' : 'var(--rc-text-sub)',
                  fontSize: 11, fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit',
                }}>
                  <svg width="11" height="11" viewBox="0 0 12 12" fill="currentColor"><circle cx="3" cy="3" r="1"/><circle cx="6" cy="3" r="1"/><circle cx="9" cy="3" r="1"/><circle cx="3" cy="6" r="1"/><circle cx="6" cy="6" r="1"/><circle cx="9" cy="6" r="1"/><circle cx="3" cy="9" r="1"/><circle cx="6" cy="9" r="1"/><circle cx="9" cy="9" r="1"/></svg>
                  Group
                </button>
                <IconBtn name="download" title="Export" />
                <IconBtn name="moreH" title="More" />
              </div>
            </div>

            {/* Table */}
            <div style={{ overflowX: 'auto' }}>
              <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 12, minWidth: 1200 }}>
                <thead>
                  <tr>
                    <Th style={{ width: 36 }}>
                      <RLCheckbox
                        checked={allVisibleSelected}
                        indeterminate={someVisibleSelected}
                        onClick={() => toggleRows(visibleIds, !allVisibleSelected)}
                      />
                    </Th>
                    <Th onClick={() => onSort('brand')} sorted={sortCol === 'brand'} dir={sortDir}>Brand Name</Th>
                    <Th>Reports</Th>
                    <Th>Data Set</Th>
                    <Th>Ad Data</Th>
                    <Th>Retail Data</Th>
                    <Th onClick={() => onSort('merchantName')} sorted={sortCol === 'merchantName'} dir={sortDir}>Merchant Name</Th>
                    <Th>Merchant Type</Th>
                    <Th>Marketplace</Th>
                    <Th>Shared</Th>
                    <Th style={{ width: 40 }}>{' '}</Th>
                  </tr>
                </thead>
                <tbody>
                  {groupBy ? (
                    /* GROUPED view */
                    pageSlice.map(([groupKey, groupRows]) => {
                      const open = !!expanded[groupKey];
                      const groupIds = groupRows.map(r => r.__id);
                      const groupAll = groupIds.every(id => selected.has(id));
                      const groupSome = groupIds.some(id => selected.has(id));
                      return (
                        <React.Fragment key={groupKey}>
                          <tr onClick={() => toggleGroup(groupKey)}
                              style={{ cursor: 'pointer', background: open ? 'var(--rc-subtle)' : 'transparent' }}
                              onMouseEnter={e => { if (!open) e.currentTarget.style.background = 'var(--rc-hover)'; }}
                              onMouseLeave={e => { if (!open) e.currentTarget.style.background = 'transparent'; }}>
                            <Td>
                              <RLCheckbox
                                checked={groupAll}
                                indeterminate={groupSome}
                                onClick={() => toggleRows(groupIds, !groupAll)}
                              />
                            </Td>
                            <Td style={{ fontWeight: 600 }}>
                              <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>
                                <span style={{
                                  display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
                                  width: 18, height: 18, borderRadius: 9999,
                                  border: '1px solid var(--rc-border)', color: 'var(--rc-text-sub)',
                                }}>
                                  <Icon name={open ? 'chevronDown' : 'chevronRight'} size={10} strokeWidth={2} />
                                </span>
                                <span>{groupKey}</span>
                                <span style={{ color: 'var(--rc-text-mute)', fontWeight: 400 }}>({groupRows.length})</span>
                              </span>
                            </Td>
                            <Td colSpan={9}>&nbsp;</Td>
                          </tr>
                          {open && groupRows.map((row, i) => {
                            const isSel = selected.has(row.__id);
                            return (
                            <tr key={`${groupKey}-${i}`}
                              style={{ background: isSel ? 'color-mix(in srgb, var(--rc-green) 6%, transparent)' : 'transparent' }}
                              onMouseEnter={e => { if (!isSel) e.currentTarget.style.background = 'var(--rc-hover)'; }}
                              onMouseLeave={e => { e.currentTarget.style.background = isSel ? 'color-mix(in srgb, var(--rc-green) 6%, transparent)' : 'transparent'; }}>
                              <Td style={{ paddingLeft: 24 }}>
                                <RLCheckbox checked={isSel} onClick={() => toggleRow(row.__id)} />
                              </Td>
                              <Td style={{ color: 'var(--rc-text-mute)', fontSize: 11 }}>
                                <span style={{
                                  display: 'inline-block', width: 14, borderTop: '1px solid var(--rc-border)',
                                  verticalAlign: 'middle', marginRight: 6,
                                }} />
                                <span>↳</span>
                              </Td>
                              <Td>
                                <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
                                  {row.reports.map((r, j) => <ReportChip key={j} label={r} merchantName={row.merchantName} />)}
                                </div>
                              </Td>
                              <Td>{row.dataSet || <span style={{ color: 'var(--rc-text-mute)' }}>—</span>}</Td>
                              <Td><StatusPill label={row.adData} /></Td>
                              <Td><StatusPill label={row.retailData} /></Td>
                              <Td>
                                <EditableName
                                  value={renameMap[row.__id] || row.merchantName}
                                  canEdit={window.__role === 'admin'}
                                  editing={editingName?.id === row.__id}
                                  onStartEdit={() => setEditingName({ id: row.__id, value: renameMap[row.__id] || row.merchantName })}
                                  onSave={(v) => { setRenameMap(m => ({ ...m, [row.__id]: v })); setEditingName(null); }}
                                  onCancel={() => setEditingName(null)}
                                />
                              </Td>
                              <Td>{row.merchantType}</Td>
                              <Td>{row.marketplace}</Td>
                              <Td>{row.shared
                                ? <span style={{ color: 'var(--rc-text)' }}>Shared</span>
                                : <span style={{ color: 'var(--rc-text-mute)' }}>Not shared</span>}</Td>
                              <Td><DragHandle /></Td>
                            </tr>
                            );
                          })}
                        </React.Fragment>
                      );
                    })
                  ) : (
                    /* FLAT view */
                    pageSlice.map((row, i) => {
                      const isSel = selected.has(row.__id);
                      return (
                      <tr key={i}
                        style={{ background: isSel ? 'color-mix(in srgb, var(--rc-green) 6%, transparent)' : 'transparent' }}
                        onMouseEnter={e => { if (!isSel) e.currentTarget.style.background = 'var(--rc-hover)'; }}
                        onMouseLeave={e => { e.currentTarget.style.background = isSel ? 'color-mix(in srgb, var(--rc-green) 6%, transparent)' : 'transparent'; }}>
                        <Td>
                          <RLCheckbox checked={isSel} onClick={() => toggleRow(row.__id)} />
                        </Td>
                        <Td><span style={{ fontWeight: 600, color: 'var(--rc-text)' }}>{row.brand}</span></Td>
                        <Td>
                          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
                            {row.reports.map((r, j) => <ReportChip key={j} label={r} merchantName={row.merchantName} />)}
                          </div>
                        </Td>
                        <Td>{row.dataSet || <span style={{ color: 'var(--rc-text-mute)' }}>—</span>}</Td>
                        <Td><StatusPill label={row.adData} /></Td>
                        <Td><StatusPill label={row.retailData} /></Td>
                        <Td>
                          <EditableName
                            value={renameMap[row.__id] || row.merchantName}
                            canEdit={window.__role === 'admin'}
                            editing={editingName?.id === row.__id}
                            onStartEdit={() => setEditingName({ id: row.__id, value: renameMap[row.__id] || row.merchantName })}
                            onSave={(v) => { setRenameMap(m => ({ ...m, [row.__id]: v })); setEditingName(null); }}
                            onCancel={() => setEditingName(null)}
                          />
                        </Td>
                        <Td>{row.merchantType}</Td>
                        <Td>{row.marketplace}</Td>
                        <Td>{row.shared
                          ? <span style={{ color: 'var(--rc-text)' }}>Shared</span>
                          : <span style={{ color: 'var(--rc-text-mute)' }}>Not shared</span>}</Td>
                        <Td><DragHandle /></Td>
                      </tr>
                      );
                    })
                  )}
                </tbody>
              </table>
            </div>

            {/* Bulk action bar — appears when any rows selected */}
            {anySelected && (
              <div style={{
                display: 'flex', alignItems: 'center', gap: 10,
                padding: '9px 16px',
                borderTop: '1px solid var(--rc-border)',
                background: 'color-mix(in srgb, var(--rc-green) 7%, transparent)',
              }}>
                <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontSize: 12, fontWeight: 600, color: 'var(--rc-text)' }}>
                  <span style={{
                    display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
                    minWidth: 22, height: 20, padding: '0 6px', borderRadius: 4,
                    background: 'var(--rc-green)', color: '#fff', fontSize: 11, fontWeight: 600,
                  }}>{selected.size}</span>
                  selected
                </span>
                <button onClick={() => toggleRows(selectAllIds, true)} style={{
                  border: 0, background: 'transparent', color: 'var(--rc-chart-1)',
                  fontSize: 11, cursor: 'pointer', padding: '2px 4px', fontFamily: 'inherit',
                }}>
                  {allSelected ? '' : `Select all ${rowsById.length}`}
                </button>
                <div style={{ flex: 1 }} />
                <BulkBtn icon="share" onClick={() => setShareOpen(true)}>Share</BulkBtn>
                <BulkBtn icon="download">Export</BulkBtn>
                <BulkBtn icon="plus">Add to group</BulkBtn>
                <BulkBtn icon="file">Duplicate</BulkBtn>
                <div style={{ width: 1, height: 20, background: 'var(--rc-border)', margin: '0 2px' }} />
                <BulkBtn icon="x" danger onClick={() => {
                  const ids = [...selected];
                  const rows = rowsById.filter(r => ids.includes(r.__id));
                  // Core instance suppression: treat any row flagged "ghost" (activate path)
                  // or the first seeded row for each merchant × marketplace as core.
                  const hasCore = rows.some(r => r.ghost) || rows.length === rowsById.length;
                  setDeleteModal({
                    name: rows.length === 1 ? rows[0].merchantName : `${rows.length} reports`,
                    ids,
                    isCore: hasCore,
                  });
                }}>Delete</BulkBtn>
                <button onClick={clearSelection} title="Clear selection" style={{
                  width: 26, height: 26, border: 0, borderRadius: 6,
                  background: 'transparent', color: 'var(--rc-text-sub)',
                  cursor: 'pointer', display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
                }}>
                  <Icon name="x" size={13} strokeWidth={2} />
                </button>
              </div>
            )}

            {/* Pagination */}
            <div style={{
              display: 'flex', alignItems: 'center', justifyContent: 'space-between',
              padding: '10px 16px', borderTop: '1px solid var(--rc-border)',
              fontSize: 11, color: 'var(--rc-text-sub)',
            }}>
              <div>Showing {(page - 1) * pageSize + 1}–{Math.min(page * pageSize, totalItems)} of {totalItems} {groupBy ? 'groups' : 'results'}</div>
              <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
                <span>Rows per page 10 <Icon name="chevronDown" size={9} /></span>
                <div style={{ display: 'flex', gap: 2 }}>
                  <PageBtn onClick={() => setPage(1)} disabled={page === 1}>«</PageBtn>
                  <PageBtn onClick={() => setPage(Math.max(1, page - 1))} disabled={page === 1}>‹</PageBtn>
                  {Array.from({ length: totalPages }, (_, i) => i + 1).map(p => (
                    <PageBtn key={p} onClick={() => setPage(p)} active={p === page}>{p}</PageBtn>
                  ))}
                  <PageBtn onClick={() => setPage(Math.min(totalPages, page + 1))} disabled={page === totalPages}>›</PageBtn>
                  <PageBtn onClick={() => setPage(totalPages)} disabled={page === totalPages}>»</PageBtn>
                </div>
              </div>
            </div>
          </section>
        </div>
      </div>
      <ShareReportModal
        open={shareOpen}
        onClose={() => setShareOpen(false)}
        subjectCount={selected.size}
      />
      {/* RC-RPT-013 — delete report confirmation */}
      <DeleteReportConfirmModal
        open={!!deleteModal}
        onClose={() => setDeleteModal(null)}
        reportName={deleteModal?.name || ''}
        isCore={!!deleteModal?.isCore}
        onConfirm={() => {
          const ids = deleteModal?.ids || [];
          if (window.__rcToast && window.__rcToast.push) {
            window.__rcToast.push({
              tone: 'success',
              title: `Deleted ${ids.length} report${ids.length === 1 ? '' : 's'}`,
              detail: 'Client-side only — real delete lands with Data Hub.',
            });
          }
          clearSelection();
        }}
      />
    </div>
  );
};

ReactDOM.createRoot(document.getElementById('root')).render(<ReportsListApp />);
