/* Plan a trip · Session picker · Live session · Quick log. */

// ---------- SHARED SAMPLE DATA ----------
// v4: loadout concept retired. Each gun carries its own configuration
// (accessories, suppressor if any, default ammo). Sessions reference
// guns directly. Suppressed state is a per-session reconciliation
// question — asked at end of session for any gun with a suppressor.
const SAMPLE_GUNS = [
  { id:1, name:'Glock 19 Gen5', gunType:'pistol', caliber:'9mm',
    config:{ optic:'Trijicon RMR Type 2', light:'Streamlight TLR-7A', trigger:'Apex AEK',
             suppressor:{ name:'SilencerCo Omega 9K', serial:'OM9-44218' } },
    defaultAmmo:'9mm · Training · 115gr', plusN:50, planned:250 },
  { id:2, name:'SIG P365 XL', gunType:'pistol', caliber:'9mm',
    config:{ optic:'Sig Romeo Zero', suppressor:null },
    defaultAmmo:'9mm · Defensive · 124gr', plusN:50, planned:100 },
  { id:3, name:'11.5″ AR-15', gunType:'ar', caliber:'5.56',
    config:{ optic:'Primary Arms GLx 1-6× LPVO', stock:'BCM Mod 0', grip:'Magpul MOE', suppressor:null },
    defaultAmmo:'5.56 · Defensive · 62gr', plusN:30, planned:140 },
  { id:4, name:'Beretta 92FS', gunType:'pistol', caliber:'9mm',
    config:{ suppressor:null },
    defaultAmmo:'9mm · Training · 115gr', plusN:50, planned:50 },
  { id:5, name:'Ruger 10/22', gunType:'pcc', caliber:'.22LR',
    config:{ suppressor:null },
    defaultAmmo:'.22LR · Training · 40gr', plusN:50, planned:200 },
];

// Helper — describe a gun's configuration as a single line for cards.
function describeConfig(g) {
  const parts = [];
  if (g.config.optic) parts.push(g.config.optic);
  if (g.config.light) parts.push(g.config.light);
  if (g.config.trigger) parts.push(g.config.trigger);
  if (g.config.suppressor) parts.push(g.config.suppressor.name);
  return parts.length ? parts.join(' · ') : 'Stock';
}

// Reserves by full ammo type — lets the planner show "X rds on hand" inline.
const RESERVES = {
  '9mm · Training · 115gr':  1200,
  '9mm · Training · 124gr':   640,
  '9mm · Defensive · 124gr':  400,
  '9mm · Defensive · 147gr':  400,
  '9mm · Match · 147gr':      200,
  '5.56 · Training · 55gr':    80,
  '5.56 · Defensive · 62gr':  240,
  '5.56 · Match · 77gr':        0,
};

// v4.7: lot-level data for the optional "pick specific lots" drill-down
// in Plan Trip. A shooter who tracks by lot can drill in and say exactly
// which boxes they're bringing.
const LOTS = {
  '9mm · Training · 115gr': [
    { id:'lot-pmc-mar28',  brand:'PMC Bronze',       remaining:680, total:1000, cost:0.20, date:'Mar 28' },
    { id:'lot-fed-feb14',  brand:'Federal Champion', remaining:520, total:500,  cost:0.21, date:'Feb 14' },
  ],
  '9mm · Training · 124gr': [
    { id:'lot-win-jan22',  brand:'Winchester USA',   remaining:640, total:1000, cost:0.22, date:'Jan 22' },
  ],
  '9mm · Defensive · 124gr': [
    { id:'lot-hst-mar02',  brand:'Federal HST',      remaining:400, total:500,  cost:0.95, date:'Mar 02' },
  ],
  '9mm · Defensive · 147gr': [
    { id:'lot-spr-dec14',  brand:'Speer Gold Dot',   remaining:400, total:500,  cost:0.78, date:'Dec 14' },
  ],
  '9mm · Match · 147gr': [
    { id:'lot-syn-feb28',  brand:'Federal Syntech',  remaining:200, total:500,  cost:1.20, date:'Feb 28' },
  ],
  '5.56 · Defensive · 62gr': [
    { id:'lot-xm193',      brand:'Federal XM193',    remaining:240, total:500,  cost:0.42, date:'Mar 14' },
  ],
};

function PlanTrip({ go }) {
  const [selected, setSelected] = React.useState([1, 3]);
  // v4.2: multi-ammo per gun. Each selected gun has 1+ ammo entries.
  // gunAmmos: { gunId: [{ id, type, planned }, ...] }
  const [gunAmmos, setGunAmmos] = React.useState({
    1: [{id:'a1', type:'9mm · Training · 115gr', planned:250}],
    3: [{id:'a3', type:'5.56 · Defensive · 62gr', planned:140}],
  });
  const [purpose, setP] = React.useState('Drills');
  const [place, setPlace] = React.useState('Bell Range · Indoor 25yd');

  const toggle = (gunId) => {
    if (selected.includes(gunId)) {
      setSelected(s => s.filter(x => x !== gunId));
      setGunAmmos(ga => { const next = {...ga}; delete next[gunId]; return next; });
    } else {
      const gun = SAMPLE_GUNS.find(g => g.id === gunId);
      setSelected(s => [...s, gunId]);
      setGunAmmos(ga => ({...ga, [gunId]: [{id:'a'+Date.now(), type:gun.defaultAmmo, planned:gun.planned}]}));
    }
  };
  const addAmmoTo = (gunId) => {
    const gun = SAMPLE_GUNS.find(g => g.id === gunId);
    setGunAmmos(ga => ({...ga, [gunId]: [...(ga[gunId]||[]), {id:'a'+Date.now(), type:gun.defaultAmmo, planned:100}]}));
  };
  const updateAmmo = (gunId, entryId, field, value) => {
    setGunAmmos(ga => ({...ga, [gunId]: ga[gunId].map(e => e.id===entryId ? {...e, [field]:value} : e)}));
  };
  const removeAmmo = (gunId, entryId) => {
    setGunAmmos(ga => ({...ga, [gunId]: ga[gunId].filter(e => e.id!==entryId)}));
  };

  const selectedGuns = SAMPLE_GUNS.filter(g => selected.includes(g.id));
  const totalPlanned = Object.values(gunAmmos).flat().reduce((s,e)=>s+(parseInt(e.planned)||0),0);

  return (
    <>
      <TopBar title="Plan a trip"/>
      <div className="screen">
        <BackRow to="home" label="Home" go={go}/>
        <CollapsingHero
          eyebrow="Use · Plan a trip"
          headline="Plan a trip"
          summary={`${selectedGuns.length} gun${selectedGuns.length===1?'':'s'} · ${totalPlanned} rds planned`}
        />

        <LabelRule>When · Where</LabelRule>
        <div className="card">
          <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:8}}>
            <div>
              <div className="label-md">Date</div>
              <div style={{fontFamily:'var(--font-display)', fontSize:18, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:4}}>Today · May 13</div>
            </div>
            <div>
              <div className="label-md">Where <span style={{color:'var(--rh-brass-400)'}}>· Default</span></div>
              <div style={{fontFamily:'var(--font-display)', fontSize:18, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:4}}>{place}</div>
            </div>
          </div>
          <div style={{display:'flex', flexWrap:'wrap', gap:6, marginTop:10}}>
            {['Bell Range · Indoor 25yd','Outdoor · 100yd','Outdoor · 300yd','Home range'].map(p =>
              <Pill key={p} on={place===p} onClick={()=>setPlace(p)}>{p}</Pill>)}
          </div>
        </div>

        <LabelRule more="Manage gear">Guns · tap to add to trip</LabelRule>
        <div style={{display:'flex', flexDirection:'column', gap:10}}>
          {SAMPLE_GUNS.map(g => (
            <GunPickerWithAmmo
              key={g.id}
              gun={g}
              selected={selected.includes(g.id)}
              onToggle={()=>toggle(g.id)}
              ammos={gunAmmos[g.id] || []}
              onAddAmmo={()=>addAmmoTo(g.id)}
              onUpdateAmmo={(eid, field, value)=>updateAmmo(g.id, eid, field, value)}
              onRemoveAmmo={(eid)=>removeAmmo(g.id, eid)}
            />
          ))}
        </div>

        {selectedGuns.length > 0 && (
          <>
            <LabelRule>If this trip goes as planned</LabelRule>
            <div className="card" style={{background:'transparent', borderStyle:'dashed', borderColor:'var(--rh-brass-tint-32)'}}>
              <ImpactRow k="9mm reserve" v="2,840 → 2,440"/>
              <ImpactRow k="5.56 reserve" v="320 → 180" tone="warn"/>
              <ImpactRow k="Glock 19 rounds" v="3,142 → 3,542"/>
              <ImpactRow k="11.5″ AR rounds" v="2,418 → 2,558"/>
              <ImpactRow k="P365 service" v="due in 8 days → due in 5"/>
            </div>
          </>
        )}

        <LabelRule>Purpose · Goals</LabelRule>
        <div style={{display:'flex', gap:6, flexWrap:'wrap'}}>
          {['Zero','Drills','Reload practice','Distance','Plinking','Holster work'].map(p => (
            <Pill key={p} on={purpose===p} onClick={()=>setP(p)}>{p}</Pill>
          ))}
        </div>

        <div className="card" style={{marginTop:12, background:'transparent', borderStyle:'dashed', borderColor:'var(--rh-brass-tint-32)'}}>
          <div className="label-md" style={{color:'var(--rh-brass-400)'}}>Goal for this trip</div>
          <div style={{fontFamily:'var(--font-body)', fontSize:13, color:'var(--rh-bone-300)', marginTop:6}}>e.g. "Sub-2s draw to first shot, consistent."</div>
        </div>

        <div style={{marginTop:20, display:'grid', gridTemplateColumns:'1fr 1fr', gap:10}}>
          <Button variant="secondary" block onClick={()=>go('home')}>Save plan</Button>
          <Button variant="primary" block onClick={()=>go('picker')}>Start at range →</Button>
        </div>
      </div>
    </>
  );
}

// ---------- GUN PICKER (with multi-ammo expansion when selected) ----------
// v4.2: supports MULTIPLE ammo entries per gun. Users routinely bring two
// types — e.g., 200 training + 100 defensive to validate a carry load.
// Each ammo entry has its own type + plan-to-bring. + Add another ammo type.
function GunPickerWithAmmo({ gun, selected, onToggle, ammos, onAddAmmo, onUpdateAmmo, onRemoveAmmo }) {
  const hasSuppressor = !!gun.config.suppressor;

  return (
    <div style={{
      background: selected ? 'var(--bg-elevated-1)' : 'transparent',
      border:'1px solid',
      borderColor: selected ? 'var(--rh-brass)' : 'var(--border-default)',
      borderLeftWidth: selected ? 3 : 1,
      borderLeftColor: selected ? 'var(--rh-brass)' : 'var(--border-default)',
      borderRadius: 2,
      overflow:'hidden',
      transition:'all 120ms ease',
    }}>
      {/* Pick row — always visible */}
      <div onClick={onToggle} style={{
        cursor:'pointer',
        padding:'10px 12px',
        display:'grid', gridTemplateColumns:'1fr auto auto', gap:10, alignItems:'center',
      }}>
        <div>
          <div style={{fontFamily:'var(--font-display)', fontSize:17, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>{gun.name}</div>
          <div className="label-md" style={{marginTop:3, color:'var(--rh-bone-500)', fontSize:9}}>{gun.caliber} · {describeConfig(gun)}</div>
        </div>
        {hasSuppressor && (
          <span style={{
            padding:'3px 7px',
            background:'var(--rh-steel-tint-12)',
            color:'var(--rh-steel-400)',
            border:'1px solid var(--rh-steel-tint-24)',
            fontFamily:'var(--font-ui)', fontSize:8, letterSpacing:'0.22em',
            fontWeight:600, textTransform:'uppercase', lineHeight:1,
          }}>SUP READY</span>
        )}
        <span style={{
          width:20, height:20, borderRadius:2,
          border:`1px solid ${selected ? 'var(--rh-brass)' : 'var(--border-strong)'}`,
          background: selected ? 'var(--rh-brass)' : 'transparent',
          display:'flex', alignItems:'center', justifyContent:'center',
          color:'var(--rh-obsidian)',
        }}>
          {selected && <I.check s={14}/>}
        </span>
      </div>

      {/* Inline AMMO ENTRIES — one card per ammo, "+ Add another" at bottom */}
      {selected && (
        <div style={{
          padding:'12px 14px',
          borderTop:'1px solid var(--rh-brass-tint-32)',
          background:'var(--rh-obsidian-900)',
        }}>
          <div className="label-md" style={{color:'var(--rh-bone-500)', marginBottom:8}}>
            Ammo for this trip {ammos.length > 1 && <span style={{color:'var(--rh-brass-400)'}}>· {ammos.length} types</span>}
          </div>

          <div style={{display:'flex', flexDirection:'column', gap:8}}>
            {ammos.map((entry, idx) => (
              <AmmoEntry
                key={entry.id}
                idx={idx}
                gun={gun}
                entry={entry}
                canRemove={ammos.length > 1}
                onUpdate={(field, value)=>onUpdateAmmo(entry.id, field, value)}
                onRemove={()=>onRemoveAmmo(entry.id)}
              />
            ))}
          </div>

          {/* + Add another ammo type — clear CTA */}
          <button
            onClick={onAddAmmo}
            style={{
              width:'100%', marginTop:10, padding:'10px',
              background:'transparent',
              border:'1px dashed var(--rh-brass-tint-32)',
              borderRadius:2, cursor:'pointer',
              fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.16em',
              textTransform:'uppercase', fontWeight:600,
              color:'var(--rh-brass-400)',
              display:'inline-flex', alignItems:'center', justifyContent:'center', gap:6,
            }}>
            <I.plus s={12}/>
            Add another ammo type
          </button>
        </div>
      )}
    </div>
  );
}

// ---------- AMMO ENTRY (one ammo type within a gun's plan) ----------
function AmmoEntry({ idx, gun, entry, canRemove, onUpdate, onRemove }) {
  const [editing, setEditing] = React.useState(false);
  const [lotPickerOpen, setLotPickerOpen] = React.useState(false);
  const reserve = RESERVES[entry.type] || 0;
  const planned = parseInt(entry.planned) || 0;
  const alternates = gun.caliber==='9mm'
    ? ['9mm · Training · 115gr','9mm · Training · 124gr','9mm · Defensive · 124gr','9mm · Defensive · 147gr','9mm · Match · 147gr']
    : gun.caliber==='5.56'
    ? ['5.56 · Training · 55gr','5.56 · Defensive · 62gr','5.56 · Match · 77gr']
    : ['.22LR · Training · 40gr','.22LR · Match · 40gr'];
  const reserveLow = reserve < planned;
  const isDefault = entry.type === gun.defaultAmmo;
  const availableLots = LOTS[entry.type] || [];
  const selectedLotIds = entry.lotIds || [];
  const toggleLot = (lotId) => {
    const next = selectedLotIds.includes(lotId)
      ? selectedLotIds.filter(x=>x!==lotId)
      : [...selectedLotIds, lotId];
    onUpdate('lotIds', next);
  };

  return (
    <div style={{padding:'10px 12px', background:'var(--bg-elevated-1)', border:'1px solid var(--border-default)', borderRadius:2}}>
      <div style={{display:'grid', gridTemplateColumns:'1fr auto auto', gap:8, alignItems:'center'}}>
        <div>
          <div style={{display:'flex', alignItems:'baseline', gap:8}}>
            <span className="label-md" style={{color:'var(--rh-brass-400)', fontSize:8, letterSpacing:'0.22em'}}>AMMO {idx+1}</span>
            {isDefault && <span className="label-md" style={{color:'#A6C293', fontSize:8, letterSpacing:'0.22em'}}>· DEFAULT</span>}
          </div>
          <div style={{fontFamily:'var(--font-display)', fontSize:15, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:3}}>{entry.type}</div>
        </div>
        <button
          onClick={()=>setEditing(e=>!e)}
          style={{
            padding:'6px 10px',
            background: editing ? 'var(--rh-brass)' : 'transparent',
            color: editing ? 'var(--rh-obsidian)' : 'var(--rh-brass-400)',
            border:`1px solid ${editing ? 'var(--rh-brass)' : 'var(--rh-brass-tint-32)'}`,
            borderRadius:2, cursor:'pointer',
            fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.16em',
            textTransform:'uppercase', fontWeight:600,
          }}>
          {editing ? 'Done ✓' : 'Change ↓'}
        </button>
        {canRemove && (
          <button
            onClick={onRemove}
            title="Remove this ammo entry"
            style={{
              padding:'6px 8px',
              background:'transparent',
              color:'var(--rh-bone-500)',
              border:'1px solid var(--border-default)',
              borderRadius:2, cursor:'pointer',
              fontFamily:'var(--font-ui)', fontSize:11,
            }}>
            ×
          </button>
        )}
      </div>

      {editing && (
        <div style={{marginTop:10, display:'flex', flexWrap:'wrap', gap:6}}>
          {alternates.map(a => (
            <Pill key={a} on={entry.type===a} onClick={()=>onUpdate('type', a)}>{a}</Pill>
          ))}
        </div>
      )}

      <div style={{height:1, background:'var(--border-hairline)', margin:'10px 0'}}/>

      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:10, alignItems:'flex-end'}}>
        <div>
          <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>Plan to bring</div>
          <div style={{marginTop:4, display:'flex', alignItems:'center', gap:6}}>
            <input
              value={entry.planned}
              onChange={e=>onUpdate('planned', e.target.value)}
              type="number"
              style={{width:80, background:'var(--bg-elevated-2)', border:'1px solid var(--border-default)', color:'var(--fg-1)', padding:'6px 8px', borderRadius:2, fontFamily:'var(--font-display)', fontSize:20, textAlign:'center'}}/>
            <span className="label-md">RDS</span>
          </div>
        </div>
        <div style={{textAlign:'right'}}>
          <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>On hand · this type</div>
          <div style={{fontFamily:'var(--font-display)', fontSize:20, color: reserveLow ? '#E5B07E' : '#A6C293', letterSpacing:'0.02em', marginTop:4, fontVariantNumeric:'tabular-nums'}}>{reserve.toLocaleString()}</div>
          {reserveLow && <div className="label-md" style={{marginTop:3, fontSize:8, color:'#E5B07E'}}>SHORT BY {planned - reserve}</div>}
        </div>
      </div>

      {/* v4.7: optional lot-level picker. For shooters who track specific
          boxes/lots and want to pick exactly which ones they're bringing. */}
      {availableLots.length > 0 && (
        <>
          <div style={{height:1, background:'var(--border-hairline)', margin:'10px 0'}}/>
          <button
            onClick={()=>setLotPickerOpen(o=>!o)}
            style={{
              width:'100%',
              padding:'7px 10px',
              background:'transparent',
              border:'1px dashed var(--rh-brass-tint-32)',
              borderRadius:2, cursor:'pointer',
              fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.16em',
              textTransform:'uppercase', fontWeight:600,
              color:'var(--rh-brass-400)',
              display:'inline-flex', alignItems:'center', justifyContent:'space-between', gap:6,
            }}>
            <span>{lotPickerOpen ? 'Hide specific lots' : 'Pick specific lots'}</span>
            <span style={{fontSize:11}}>
              {selectedLotIds.length > 0 ? `${selectedLotIds.length} picked` : 'optional'} {lotPickerOpen ? '↑' : '↓'}
            </span>
          </button>

          {lotPickerOpen && (
            <div style={{marginTop:8, display:'flex', flexDirection:'column', gap:6}}>
              <div className="rh-body-sm" style={{color:'var(--rh-bone-500)', fontSize:11}}>
                Which boxes from your stock are you bringing? Selecting specific lots tightens cost + brand attribution for this trip.
              </div>
              {availableLots.map(lot => {
                const picked = selectedLotIds.includes(lot.id);
                return (
                  <div
                    key={lot.id}
                    onClick={()=>toggleLot(lot.id)}
                    style={{
                      cursor:'pointer',
                      padding:'10px 12px',
                      background: picked ? 'var(--bg-elevated-1)' : 'transparent',
                      border:'1px solid',
                      borderColor: picked ? 'var(--rh-brass)' : 'var(--border-default)',
                      borderLeftWidth: picked ? 3 : 1,
                      borderLeftColor: picked ? 'var(--rh-brass)' : 'var(--border-default)',
                      borderRadius:2,
                      display:'grid', gridTemplateColumns:'1fr auto auto', gap:10, alignItems:'center',
                    }}>
                    <div>
                      <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>{lot.brand}</div>
                      <div className="label-md" style={{marginTop:3, color:'var(--rh-bone-500)', fontSize:8}}>Purchased {lot.date} · ${lot.cost.toFixed(2)}/rd</div>
                    </div>
                    <div style={{textAlign:'right'}}>
                      <div style={{fontFamily:'var(--font-display)', fontSize:16, color: picked ? 'var(--rh-brass-400)' : 'var(--rh-bone-300)', letterSpacing:'0.02em', lineHeight:1}}>{lot.remaining}</div>
                      <div className="label-md" style={{marginTop:3, fontSize:8, color:'var(--rh-bone-500)'}}>OF {lot.total}</div>
                    </div>
                    <span style={{
                      width:18, height:18, borderRadius:2,
                      border:`1px solid ${picked ? 'var(--rh-brass)' : 'var(--border-strong)'}`,
                      background: picked ? 'var(--rh-brass)' : 'transparent',
                      display:'flex', alignItems:'center', justifyContent:'center',
                      color:'var(--rh-obsidian)',
                    }}>
                      {picked && <I.check s={12}/>}
                    </span>
                  </div>
                );
              })}
            </div>
          )}
        </>
      )}
    </div>
  );
}

function ImpactRow({ k, v, tone }) {
  const color = tone==='warn' ? '#E5B07E' : tone==='crit' ? 'var(--rh-dusty-red)' : 'var(--rh-bone-300)';
  return (
    <div style={{display:'flex', justifyContent:'space-between', padding:'5px 0', borderBottom:'1px solid var(--border-hairline)'}}>
      <span className="label-md" style={{color:'var(--rh-bone-500)'}}>{k}</span>
      <span style={{fontFamily:'var(--font-display)', fontSize:13, color, letterSpacing:'0.02em'}}>{v}</span>
    </div>
  );
}

// ---------- SESSION PICKER ----------
function SessionPicker({ go }) {
  return (
    <>
      <TopBar title="Session"/>
      <div className="screen">
        <BackRow to="home" label="Home" go={go}/>
        <div className="screen-hero" style={{paddingTop:0}}>
          <div className="eyebrow">Use · Capture</div>
          <h1 className="hero-title">How are you <span className="red">logging?</span></h1>
          <div className="hero-sub">Same data either way. Pick what fits the moment.</div>
        </div>

        <div className="card brass" onClick={()=>go('live')} style={{cursor:'pointer', marginTop:8}}>
          <div style={{display:'flex', alignItems:'center', gap:14}}>
            <div style={{width:48, height:48, borderRadius:'50%', border:'1px solid var(--rh-dusty-red)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--rh-dusty-red)'}}>
              <span style={{width:14, height:14, background:'var(--rh-dusty-red)', borderRadius:'50%', display:'inline-block'}}/>
            </div>
            <div style={{flex:1}}>
              <div style={{fontFamily:'var(--font-display)', fontSize:26, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>Live session</div>
              <div className="rh-body-sm" style={{marginTop:4}}>On the range, right now. Big buttons, glove-friendly.</div>
            </div>
            <X.fwd s={16}/>
          </div>
        </div>

        <div className="card" onClick={()=>go('log')} style={{cursor:'pointer', marginTop:10}}>
          <div style={{display:'flex', alignItems:'center', gap:14}}>
            <div style={{width:48, height:48, borderRadius:'50%', border:'1px solid var(--rh-brass)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--rh-brass)'}}>
              <X.edit s={20}/>
            </div>
            <div style={{flex:1}}>
              <div style={{fontFamily:'var(--font-display)', fontSize:26, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>Quick log</div>
              <div className="rh-body-sm" style={{marginTop:4}}>Drove home, log it after. ~30 seconds.</div>
            </div>
            <X.fwd s={16}/>
          </div>
        </div>

        <LabelRule>Today's plan loaded</LabelRule>
        <div className="card">
          <div style={{display:'flex', justifyContent:'space-between', padding:'6px 0'}}>
            <span className="label-md">Where</span><span style={{fontFamily:'var(--font-display)', color:'var(--fg-1)', fontSize:14, letterSpacing:'0.02em'}}>Indoor · 25yd</span>
          </div>
          <div style={{display:'flex', justifyContent:'space-between', padding:'6px 0', borderTop:'1px solid var(--border-hairline)'}}>
            <span className="label-md">Firearms</span><span style={{fontFamily:'var(--font-display)', color:'var(--fg-1)', fontSize:14, letterSpacing:'0.02em'}}>Glock 19 · 11.5″ AR</span>
          </div>
          <div style={{display:'flex', justifyContent:'space-between', padding:'6px 0', borderTop:'1px solid var(--border-hairline)'}}>
            <span className="label-md">Ammo</span><span style={{fontFamily:'var(--font-display)', color:'var(--fg-1)', fontSize:14, letterSpacing:'0.02em'}}>250 · 140</span>
          </div>
        </div>
      </div>
    </>
  );
}

// ---------- LIVE SESSION ----------
// v4.2: gun-driven WITH multi-ammo support. Each session gun has 1+ ammo
// entries. When a gun has 2+ ammos, a small switcher appears so the user
// can mark which ammo they're shooting right now. Counts tracked per
// (gun, ammoEntry) pair.
function LiveSession({ go }) {
  // For prototype: 3 guns in session, Glock 19 brings TWO ammo types.
  const sessionGuns = [
    { ...SAMPLE_GUNS.find(g=>g.id===1),
      ammos:[
        {id:'a1', type:'9mm · Training · 115gr', planned:200},
        {id:'a2', type:'9mm · Defensive · 124gr', planned:50},
      ]
    },
    { ...SAMPLE_GUNS.find(g=>g.id===2),
      ammos:[{id:'a3', type:'9mm · Defensive · 124gr', planned:100}]
    },
    { ...SAMPLE_GUNS.find(g=>g.id===3),
      ammos:[{id:'a4', type:'5.56 · Defensive · 62gr', planned:140}]
    },
  ];

  const [active, setActive] = React.useState(1);
  // activeAmmo[gunId] = ammoEntryId
  const [activeAmmo, setActiveAmmo] = React.useState({1:'a1', 2:'a3', 3:'a4'});
  // counts[gunAmmoKey] = rounds. key = `${gunId}:${ammoEntryId}`
  const [counts, setCounts] = React.useState({'1:a1':87, '1:a2':40, '2:a3':0, '3:a4':0});
  const [malf, setM] = React.useState(0);

  const activeGun = sessionGuns.find(g => g.id === active);
  const activeAmmoId = activeAmmo[active];
  const activeAmmoEntry = activeGun.ammos.find(a => a.id === activeAmmoId);
  const key = `${active}:${activeAmmoId}`;
  const ac = counts[key] || 0;
  const remaining = (activeAmmoEntry?.planned || 0) - ac;
  const hasSuppressor = !!activeGun.config.suppressor;
  // Total across all ammos for this gun
  const gunTotal = activeGun.ammos.reduce((s,a)=>s+(counts[`${active}:${a.id}`]||0), 0);

  const addN = (n) => setCounts(c => ({...c, [key]: Math.max(0, (c[key]||0) + n)}));

  return (
    <>
      <TopBar title="Live"/>
      <div className="screen">
        <div className="screen-hero" style={{padding:'2px 0 8px'}}>
          <div className="eyebrow" style={{color:'#A6C293', display:'flex', alignItems:'center', gap:6}}>
            <span style={{width:8, height:8, background:'#6B8E5A', borderRadius:'50%', display:'inline-block', boxShadow:'0 0 0 3px rgba(107,142,90,0.25)'}}/>
            Live session
          </div>
          <h1 className="hero-title" style={{fontSize:34}}>Bell Range · <span className="red">25yd</span></h1>
        </div>

        {/* ACTIVE GUN SWITCHER — replaces the old loadout switcher */}
        <div style={{marginBottom:10}}>
          <div className="label-md" style={{color:'var(--rh-bone-500)', marginBottom:6}}>Active gun · tap to switch</div>
          <div style={{display:'flex', flexDirection:'column', gap:6}}>
            {sessionGuns.map(g => {
              const isActive = g.id===active;
              const gunHasSup = !!g.config.suppressor;
              return (
                <button key={g.id} onClick={()=>setActive(g.id)} style={{
                  width:'100%',
                  padding:'10px 12px',
                  background: isActive ? 'var(--rh-brass)' : 'var(--bg-elevated-1)',
                  color: isActive ? 'var(--rh-obsidian)' : 'var(--rh-bone-300)',
                  border:`1px solid ${isActive ? 'var(--rh-brass)' : 'var(--border-default)'}`,
                  borderLeftWidth: isActive ? 4 : 1,
                  borderLeftColor: isActive ? 'var(--rh-brass)' : 'var(--border-default)',
                  borderRadius:2, cursor:'pointer',
                  display:'grid', gridTemplateColumns:'1fr auto auto', gap:10, alignItems:'center',
                }}>
                  <div style={{textAlign:'left'}}>
                    <div style={{fontFamily:'var(--font-display)', fontSize:15, letterSpacing:'0.02em'}}>{g.name}</div>
                    <div style={{fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.14em', marginTop:2, opacity: isActive ? 0.75 : 0.6}}>{g.caliber} · {describeConfig(g)}</div>
                  </div>
                  {gunHasSup && (
                    <span style={{
                      padding:'3px 7px',
                      background: isActive ? 'rgba(13,13,15,0.2)' : 'var(--rh-steel-tint-12)',
                      color: isActive ? 'var(--rh-obsidian)' : 'var(--rh-steel-400)',
                      border:`1px solid ${isActive ? 'rgba(13,13,15,0.3)' : 'var(--rh-steel-tint-24)'}`,
                      fontSize:8, letterSpacing:'0.22em', fontWeight:600,
                    }}>SUP READY</span>
                  )}
                  <span style={{fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.14em', fontWeight:600, opacity: isActive ? 0.75 : 0.6}}>
                    {g.ammos.reduce((s,a)=>s+(counts[`${g.id}:${a.id}`]||0),0)}/{g.ammos.reduce((s,a)=>s+a.planned,0)}
                  </span>
                </button>
              );
            })}
          </div>
        </div>

        {/* ACTIVE GUN CARD */}
        <div className="card" style={{borderLeft:'3px solid var(--rh-brass)', padding:'12px 14px'}}>
          <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-start', gap:10}}>
            <div>
              <div className="label-md" style={{fontSize:8, color:'var(--rh-brass-400)', letterSpacing:'0.28em'}}>· {activeGun.name.toUpperCase()} ·</div>
              <div className="label-md" style={{marginTop:6, color:'var(--rh-bone-300)', fontSize:10}}>{activeGun.caliber} · {gunTotal} rds total</div>
            </div>
            {hasSuppressor && (
              <span style={{
                padding:'4px 8px',
                background:'var(--rh-steel-tint-12)',
                color:'var(--rh-steel-400)',
                border:'1px solid var(--rh-steel-tint-24)',
                fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.22em',
                textTransform:'uppercase', fontWeight:600, lineHeight:1,
              }}>SUP READY</span>
            )}
          </div>
        </div>

        {/* AMMO SWITCHER — only when this gun has 2+ ammos */}
        {activeGun.ammos.length > 1 && (
          <div style={{marginTop:10}}>
            <div className="label-md" style={{color:'var(--rh-bone-500)', marginBottom:6}}>Active ammo · which one you're shooting now</div>
            <div style={{display:'flex', flexDirection:'column', gap:6}}>
              {activeGun.ammos.map((a, idx) => {
                const isActiveAmmo = a.id === activeAmmoId;
                const ammoCount = counts[`${active}:${a.id}`] || 0;
                return (
                  <button key={a.id} onClick={()=>setActiveAmmo(s=>({...s, [active]: a.id}))} style={{
                    width:'100%', padding:'10px 12px',
                    background: isActiveAmmo ? 'var(--rh-brass)' : 'var(--bg-elevated-1)',
                    color: isActiveAmmo ? 'var(--rh-obsidian)' : 'var(--rh-bone-300)',
                    border:`1px solid ${isActiveAmmo ? 'var(--rh-brass)' : 'var(--border-default)'}`,
                    borderLeftWidth: isActiveAmmo ? 3 : 1,
                    borderRadius:2, cursor:'pointer',
                    display:'grid', gridTemplateColumns:'auto 1fr auto', gap:10, alignItems:'center',
                  }}>
                    <span style={{fontFamily:'var(--font-display)', fontSize:13, letterSpacing:'0.02em', opacity: isActiveAmmo ? 1 : 0.7}}>AMMO {idx+1}</span>
                    <span style={{textAlign:'left', fontFamily:'var(--font-display)', fontSize:13, letterSpacing:'0.02em'}}>{a.type}</span>
                    <span style={{fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.14em', fontWeight:600, opacity: isActiveAmmo ? 0.75 : 0.6}}>{ammoCount}/{a.planned}</span>
                  </button>
                );
              })}
            </div>
          </div>
        )}

        {/* BIG ROUNDS COUNTER + PRIMARY +N BUTTON */}
        <div className="card brass" style={{marginTop:10, padding:'14px 16px'}}>
          <div className="label-md" style={{textAlign:'center'}}>
            {activeGun.ammos.length > 1 ? `Rounds fired · AMMO ${activeGun.ammos.findIndex(a=>a.id===activeAmmoId)+1}` : 'Rounds fired · this gun'}
          </div>
          <div style={{fontFamily:'var(--font-display)', fontSize:96, color:'var(--fg-1)', letterSpacing:'0.02em', textAlign:'center', lineHeight:1, fontVariantNumeric:'tabular-nums', margin:'4px 0'}}>{ac}</div>
          <div style={{display:'flex', justifyContent:'center', gap:20, fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.14em', color:'var(--rh-bone-500)', fontWeight:600, marginBottom:14}}>
            <span>BROUGHT · {activeAmmoEntry?.planned || 0}</span>
            <span style={{color: remaining<0 ? 'var(--rh-dusty-red)' : '#A6C293'}}>LEFT · {remaining}</span>
          </div>

          <button
            onClick={()=>addN(activeGun.plusN)}
            style={{
              width:'100%', padding:'16px',
              background:'var(--rh-dusty-red)', color:'var(--rh-bone-100)',
              border:0, borderRadius:2, cursor:'pointer',
              fontFamily:'var(--font-display)', fontSize:32,
              letterSpacing:'0.04em',
            }}>
            +{activeGun.plusN}
          </button>
          <div className="label-md" style={{textAlign:'center', marginTop:6, fontSize:8, color:'var(--rh-bone-500)'}}>
            One box · {activeAmmoEntry?.type || ''}
          </div>

          <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:6, marginTop:10}}>
            <Button variant="secondary" onClick={()=>addN(-10)}>−10</Button>
            <Button variant="secondary" onClick={()=>addN(1)}>+1</Button>
            <Button variant="secondary" onClick={()=>addN(10)}>+10</Button>
          </div>
        </div>

        {/* MALFUNCTION button - opens real logging screen (type + ammo + notes) */}
        <div style={{marginTop:10}}>
          <button
            onClick={()=>go('malfunction')}
            style={{
              width:'100%', padding:'14px',
              background:'var(--rh-red-tint-12)',
              border:'1px solid rgba(195,58,46,0.4)',
              borderRadius:2, cursor:'pointer',
              fontFamily:'var(--font-ui)', fontSize:13, letterSpacing:'0.18em',
              textTransform:'uppercase', fontWeight:600,
              color:'#E48A82',
              display:'flex', alignItems:'center', justifyContent:'center', gap:10,
            }}>
            <I.warn s={18}/>
            Log malfunction
            {malf > 0 && <span style={{background:'rgba(195,58,46,0.3)', padding:'2px 8px', borderRadius:2, fontSize:11}}>{malf}</span>}
          </button>
        </div>

        <LabelRule>Working on</LabelRule>
        <div className="card" style={{display:'flex', flexWrap:'wrap', gap:6}}>
          <Pill on>Sub-2s draw</Pill>
          <Pill on>Reload practice</Pill>
          <Pill>+ Add goal</Pill>
        </div>

        <div style={{marginTop:14}}>
          <Button variant="primary" block onClick={()=>go('reconcile')}>End & save →</Button>
        </div>
      </div>
    </>
  );
}

// ---------- QUICK LOG (after the fact) ----------
// v3.2: loadout-based retroactive log. Pick loadouts, enter rounds (with
// suppressed split), pick ammo brand if mid-session brand was used.
function QuickLog({ go }) {
  // v4.2: gun-based, multi-ammo per gun, inline suppressed reconciliation.
  // gunAmmos: { gunId: [{ id, type, rounds, supMode, supSplit }, ...] }
  const [selected, setSelected] = React.useState([]);
  const [gunAmmos, setGunAmmos] = React.useState({});

  const toggle = (gunId) => {
    if (selected.includes(gunId)) {
      setSelected(s => s.filter(x => x !== gunId));
      setGunAmmos(ga => { const next = {...ga}; delete next[gunId]; return next; });
    } else {
      const gun = SAMPLE_GUNS.find(g => g.id === gunId);
      setSelected(s => [...s, gunId]);
      setGunAmmos(ga => ({...ga, [gunId]: [{id:'a'+Date.now(), type:gun.defaultAmmo, rounds:'', supMode:null, supSplit:''}]}));
    }
  };
  const addAmmoTo = (gunId) => {
    const gun = SAMPLE_GUNS.find(g => g.id === gunId);
    setGunAmmos(ga => ({...ga, [gunId]: [...(ga[gunId]||[]), {id:'a'+Date.now(), type:gun.defaultAmmo, rounds:'', supMode:null, supSplit:''}]}));
  };
  const updateAmmo = (gunId, entryId, field, value) => {
    setGunAmmos(ga => ({...ga, [gunId]: ga[gunId].map(e => e.id===entryId ? {...e, [field]:value} : e)}));
  };
  const removeAmmo = (gunId, entryId) => {
    setGunAmmos(ga => ({...ga, [gunId]: ga[gunId].filter(e => e.id!==entryId)}));
  };
  const selectedGuns = SAMPLE_GUNS.filter(g => selected.includes(g.id));
  const totalRounds = Object.values(gunAmmos).flat().reduce((s,e)=>s+(parseInt(e.rounds)||0),0);

  return (
    <>
      <TopBar title="Quick log"/>
      <div className="screen">
        <BackRow to="picker" label="Session" go={go}/>
        <CollapsingHero
          eyebrow="Use · Log a past session"
          headline="Quick log"
          summary={`${selectedGuns.length} gun${selectedGuns.length===1?'':'s'} · ${totalRounds} rds`}
        />

        <LabelRule>When</LabelRule>
        <div style={{display:'flex', gap:6, flexWrap:'wrap'}}>
          <Pill on>Today</Pill><Pill>Yesterday</Pill><Pill>Earlier this week</Pill><Pill>Pick a date</Pill>
        </div>

        <LabelRule>Where</LabelRule>
        <div style={{display:'flex', gap:6, flexWrap:'wrap'}}>
          <Pill on>Bell Range · Indoor 25yd</Pill><Pill>Outdoor · 100yd</Pill><Pill>Home</Pill>
        </div>

        <LabelRule>Guns used · tap to select</LabelRule>
        <div style={{display:'flex', flexDirection:'column', gap:8}}>
          {SAMPLE_GUNS.map(g => {
            const isSel = selected.includes(g.id);
            const hasSup = !!g.config.suppressor;
            return (
              <div
                key={g.id}
                onClick={()=>toggle(g.id)}
                style={{
                  cursor:'pointer',
                  background: isSel ? 'var(--bg-elevated-1)' : 'transparent',
                  border:'1px solid',
                  borderColor: isSel ? 'var(--rh-brass)' : 'var(--border-default)',
                  borderLeftWidth: isSel ? 3 : 1,
                  borderLeftColor: isSel ? 'var(--rh-brass)' : 'var(--border-default)',
                  borderRadius:2,
                  padding:'10px 12px',
                  display:'grid', gridTemplateColumns:'1fr auto auto', gap:10, alignItems:'center',
                }}>
                <div>
                  <div style={{fontFamily:'var(--font-display)', fontSize:15, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>{g.name}</div>
                  <div className="label-md" style={{marginTop:3, color:'var(--rh-bone-500)', fontSize:8}}>{g.caliber} · {g.defaultAmmo}</div>
                </div>
                {hasSup && (
                  <span style={{
                    padding:'3px 7px',
                    background:'var(--rh-steel-tint-12)',
                    color:'var(--rh-steel-400)',
                    border:'1px solid var(--rh-steel-tint-24)',
                    fontFamily:'var(--font-ui)', fontSize:8, letterSpacing:'0.22em',
                    fontWeight:600, textTransform:'uppercase', lineHeight:1,
                  }}>SUP READY</span>
                )}
                <span style={{
                  width:18, height:18, borderRadius:2,
                  border:`1px solid ${isSel ? 'var(--rh-brass)' : 'var(--border-strong)'}`,
                  background: isSel ? 'var(--rh-brass)' : 'transparent',
                  display:'flex', alignItems:'center', justifyContent:'center',
                  color:'var(--rh-obsidian)',
                }}>
                  {isSel && <I.check s={12}/>}
                </span>
              </div>
            );
          })}
        </div>

        {selectedGuns.length > 0 && (
          <>
            <LabelRule>Rounds fired</LabelRule>
            <div style={{display:'flex', flexDirection:'column', gap:8}}>
              {selectedGuns.map(g => (
                <QuickLogGunRow
                  key={g.id}
                  gun={g}
                  ammos={gunAmmos[g.id] || []}
                  onAddAmmo={()=>addAmmoTo(g.id)}
                  onUpdateAmmo={(eid, field, val)=>updateAmmo(g.id, eid, field, val)}
                  onRemoveAmmo={(eid)=>removeAmmo(g.id, eid)}
                />
              ))}
            </div>
          </>
        )}

        <LabelRule>Malfunctions · Notes (optional)</LabelRule>
        <div className="card">
          <div style={{display:'flex', gap:6, flexWrap:'wrap'}}>
            <Pill>FTF</Pill><Pill>FTE</Pill><Pill>Double feed</Pill><Pill>Light strike</Pill><Pill on>None</Pill>
          </div>
          <div style={{height:1, background:'var(--border-hairline)', margin:'10px 0'}}/>
          <textarea placeholder="What worked. What didn't. What to revisit." rows={3} style={{width:'100%', background:'transparent', border:0, color:'var(--fg-1)', fontFamily:'var(--font-body)', fontSize:13, resize:'none', outline:'none'}}/>
        </div>

        <div style={{marginTop:18}}>
          <Button variant="primary" block onClick={()=>go('cascade')}>Save session →</Button>
        </div>
      </div>
    </>
  );
}

// ---------- QUICK LOG GUN ROW (multi-ammo) ----------
// v4.2: per-gun row in Quick Log. Holds 1+ ammo entries. Each ammo has its
// own rounds-fired input + (if gun has suppressor) inline suppressed
// reconciliation (All/None/Mixed + split).
function QuickLogGunRow({ gun, ammos, onAddAmmo, onUpdateAmmo, onRemoveAmmo }) {
  const hasSup = !!gun.config.suppressor;
  return (
    <div className="card" style={{padding:'12px 14px'}}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-start', gap:8}}>
        <div>
          <div style={{fontFamily:'var(--font-display)', fontSize:16, color:'var(--fg-1)', letterSpacing:'0.02em'}}>{gun.name}</div>
          <div className="label-md" style={{marginTop:3, color:'var(--rh-bone-500)', fontSize:8}}>{gun.caliber} · {describeConfig(gun)}</div>
        </div>
        {hasSup && (
          <span style={{padding:'3px 7px', background:'var(--rh-steel-tint-12)', color:'var(--rh-steel-400)', border:'1px solid var(--rh-steel-tint-24)', fontFamily:'var(--font-ui)', fontSize:8, letterSpacing:'0.22em', fontWeight:600, textTransform:'uppercase', lineHeight:1}}>SUP READY</span>
        )}
      </div>

      <div style={{display:'flex', flexDirection:'column', gap:8, marginTop:10}}>
        {ammos.map((entry, idx) => (
          <QuickLogAmmoEntry
            key={entry.id}
            idx={idx}
            gun={gun}
            entry={entry}
            canRemove={ammos.length > 1}
            hasSup={hasSup}
            onUpdate={(field, val)=>onUpdateAmmo(entry.id, field, val)}
            onRemove={()=>onRemoveAmmo(entry.id)}
          />
        ))}
      </div>

      <button
        onClick={onAddAmmo}
        style={{
          width:'100%', marginTop:10, padding:'9px',
          background:'transparent',
          border:'1px dashed var(--rh-brass-tint-32)',
          borderRadius:2, cursor:'pointer',
          fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.16em',
          textTransform:'uppercase', fontWeight:600,
          color:'var(--rh-brass-400)',
          display:'inline-flex', alignItems:'center', justifyContent:'center', gap:6,
        }}>
        <I.plus s={12}/>
        Add another ammo type
      </button>
    </div>
  );
}

function QuickLogAmmoEntry({ idx, gun, entry, canRemove, hasSup, onUpdate, onRemove }) {
  const [editingType, setEditingType] = React.useState(false);
  const total = parseInt(entry.rounds) || 0;
  const alternates = gun.caliber==='9mm'
    ? ['9mm · Training · 115gr','9mm · Training · 124gr','9mm · Defensive · 124gr','9mm · Defensive · 147gr','9mm · Match · 147gr']
    : gun.caliber==='5.56'
    ? ['5.56 · Training · 55gr','5.56 · Defensive · 62gr','5.56 · Match · 77gr']
    : ['.22LR · Training · 40gr','.22LR · Match · 40gr'];

  return (
    <div style={{padding:'10px 12px', background:'var(--bg-elevated-2)', border:'1px solid var(--border-default)', borderRadius:2}}>
      <div style={{display:'grid', gridTemplateColumns:'1fr auto auto', gap:8, alignItems:'center'}}>
        <div>
          <div className="label-md" style={{color:'var(--rh-brass-400)', fontSize:8, letterSpacing:'0.22em'}}>AMMO {idx+1}</div>
          <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:3}}>{entry.type}</div>
        </div>
        <button onClick={()=>setEditingType(e=>!e)} style={{padding:'5px 9px', background:editingType?'var(--rh-brass)':'transparent', color:editingType?'var(--rh-obsidian)':'var(--rh-brass-400)', border:`1px solid ${editingType?'var(--rh-brass)':'var(--rh-brass-tint-32)'}`, borderRadius:2, cursor:'pointer', fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.16em', textTransform:'uppercase', fontWeight:600}}>
          {editingType ? 'Done' : 'Change'}
        </button>
        {canRemove && (
          <button onClick={onRemove} title="Remove" style={{padding:'5px 7px', background:'transparent', color:'var(--rh-bone-500)', border:'1px solid var(--border-default)', borderRadius:2, cursor:'pointer', fontFamily:'var(--font-ui)', fontSize:11}}>×</button>
        )}
      </div>
      {editingType && (
        <div style={{marginTop:8, display:'flex', flexWrap:'wrap', gap:6}}>
          {alternates.map(a => <Pill key={a} on={entry.type===a} onClick={()=>onUpdate('type', a)}>{a}</Pill>)}
        </div>
      )}

      <div style={{height:1, background:'var(--border-hairline)', margin:'10px 0'}}/>

      <div style={{display:'grid', gridTemplateColumns:'1fr auto auto', gap:10, alignItems:'center'}}>
        <div className="label-md" style={{color:'var(--rh-bone-500)'}}>Rounds fired</div>
        <input
          value={entry.rounds}
          onChange={e=>onUpdate('rounds', e.target.value)}
          type="number"
          style={{width:90, background:'var(--rh-obsidian-700)', border:'1px solid var(--border-default)', color:'var(--fg-1)', padding:'7px', borderRadius:2, fontFamily:'var(--font-display)', fontSize:18, textAlign:'center'}}/>
        <span className="label-md">RDS</span>
      </div>

      {hasSup && total > 0 && (
        <>
          <div style={{height:1, background:'var(--border-hairline)', margin:'10px 0'}}/>
          <div className="label-md" style={{color:'var(--rh-steel-400)'}}>Suppressed?</div>
          <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:6, marginTop:6}}>
            {[{id:'all',label:'All'},{id:'none',label:'None'},{id:'mixed',label:'Mixed'}].map(opt => (
              <button key={opt.id} onClick={()=>onUpdate('supMode', opt.id)} style={{
                padding:'7px', background: entry.supMode===opt.id ? 'var(--rh-steel)' : 'var(--rh-obsidian-700)',
                color: entry.supMode===opt.id ? 'var(--rh-obsidian)' : 'var(--rh-bone-300)',
                border:`1px solid ${entry.supMode===opt.id ? 'var(--rh-steel)' : 'var(--border-default)'}`,
                borderRadius:2, cursor:'pointer',
                fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.14em',
                textTransform:'uppercase', fontWeight:600,
              }}>{opt.label}</button>
            ))}
          </div>
          {entry.supMode==='mixed' && (
            <div style={{marginTop:8, display:'flex', alignItems:'center', gap:10}}>
              <input
                type="number"
                value={entry.supSplit}
                onChange={e=>onUpdate('supSplit', e.target.value)}
                placeholder={`Of ${total} rds, how many sup?`}
                style={{flex:1, background:'var(--rh-obsidian-700)', border:'1px solid var(--rh-steel-tint-24)', color:'var(--rh-steel-400)', padding:'7px', borderRadius:2, fontFamily:'var(--font-display)', fontSize:16, textAlign:'center'}}/>
              <span className="label-md">SUP RDS</span>
            </div>
          )}
        </>
      )}
    </div>
  );
}

// ---------- SESSION RECONCILE ----------
// v4: end-of-session step BEFORE the cascade. For each gun used in the
// session that has a suppressor in its config, ask "did you actually
// shoot it suppressed today?" — All / None / Mixed. Mixed prompts for
// a split. Skipped entirely if no gun has a suppressor.
function SessionReconcile({ go }) {
  // Pull guns + counts that would have come from LiveSession state.
  // For the prototype, hardcode the session: Glock 19 (with suppressor) + AR.
  const sessionData = [
    { gun: SAMPLE_GUNS.find(g => g.id===1), rounds: 247 },  // Glock 19 — has suppressor
    { gun: SAMPLE_GUNS.find(g => g.id===3), rounds: 80 },   // AR — no suppressor
  ];

  // Only guns with a suppressor in config need the reconciliation
  const gunsNeedingReconcile = sessionData.filter(s => !!s.gun.config.suppressor);
  const passive = sessionData.filter(s => !s.gun.config.suppressor);

  // Per-gun reconciliation state: { gunId: { mode: 'all'|'none'|'mixed'|null, supRounds: number } }
  const [recon, setRecon] = React.useState(
    Object.fromEntries(gunsNeedingReconcile.map(s => [s.gun.id, { mode:null, supRounds:'' }]))
  );

  const setMode = (id, mode) => setRecon(r => ({...r, [id]: {...r[id], mode}}));
  const setSplit = (id, supRounds) => setRecon(r => ({...r, [id]: {...r[id], supRounds}}));

  const allAnswered = gunsNeedingReconcile.every(s => recon[s.gun.id]?.mode);

  // If no gun has a suppressor, skip this whole screen
  if (gunsNeedingReconcile.length === 0) {
    React.useEffect(() => { go('cascade'); }, []);
    return null;
  }

  return (
    <>
      <TopBar title="Reconcile"/>
      <div className="screen">
        <div className="screen-hero" style={{padding:'8px 0 8px'}}>
          <div className="eyebrow">Almost done</div>
          <h1 className="hero-title" style={{fontSize:34}}>Quick <span className="red">check.</span></h1>
          <div className="hero-sub" style={{marginTop:6}}>You shot a gun that has a suppressor. Tell us how today went so the record stays accurate.</div>
        </div>

        {gunsNeedingReconcile.map(s => {
          const state = recon[s.gun.id];
          const mode = state.mode;
          const sup = parseInt(state.supRounds) || 0;
          const unsup = Math.max(0, s.rounds - sup);

          return (
            <div key={s.gun.id} className="card" style={{marginTop:6}}>
              <div style={{display:'flex', justifyContent:'space-between', alignItems:'baseline'}}>
                <div>
                  <div className="label-md" style={{color:'var(--rh-bone-500)', fontSize:9}}>{s.gun.name}</div>
                  <div style={{fontFamily:'var(--font-display)', fontSize:20, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:3}}>{s.rounds} rounds fired</div>
                </div>
                <div style={{
                  padding:'4px 8px',
                  background:'var(--rh-steel-tint-12)',
                  color:'var(--rh-steel-400)',
                  border:'1px solid var(--rh-steel-tint-24)',
                  fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.22em',
                  fontWeight:600, textTransform:'uppercase', lineHeight:1,
                }}>{s.gun.config.suppressor.name}</div>
              </div>

              <div className="label-md" style={{marginTop:14, color:'var(--rh-bone-500)'}}>Suppressed today?</div>
              <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:6, marginTop:8}}>
                {[
                  {id:'all',   label:'All', desc:`${s.rounds} sup`},
                  {id:'none',  label:'None', desc:`${s.rounds} unsup`},
                  {id:'mixed', label:'Mixed', desc:'Split it'},
                ].map(opt => (
                  <button key={opt.id} onClick={()=>setMode(s.gun.id, opt.id)} style={{
                    padding:'12px 8px',
                    background: mode===opt.id ? 'var(--rh-steel)' : 'var(--bg-elevated-2)',
                    color: mode===opt.id ? 'var(--rh-obsidian)' : 'var(--rh-bone-300)',
                    border:`1px solid ${mode===opt.id ? 'var(--rh-steel)' : 'var(--border-default)'}`,
                    borderRadius:2, cursor:'pointer',
                    display:'flex', flexDirection:'column', alignItems:'center', gap:4,
                  }}>
                    <span style={{fontFamily:'var(--font-display)', fontSize:18, letterSpacing:'0.02em'}}>{opt.label}</span>
                    <span style={{fontFamily:'var(--font-ui)', fontSize:9, letterSpacing:'0.14em', fontWeight:600, opacity:0.8}}>{opt.desc}</span>
                  </button>
                ))}
              </div>

              {mode==='mixed' && (
                <div style={{marginTop:14, paddingTop:14, borderTop:'1px solid var(--border-hairline)'}}>
                  <div className="label-md" style={{color:'var(--rh-bone-500)'}}>Of {s.rounds} rounds, how many were suppressed?</div>
                  <div style={{marginTop:10, display:'flex', alignItems:'center', gap:10}}>
                    <input
                      type="number"
                      value={state.supRounds}
                      onChange={e=>setSplit(s.gun.id, e.target.value)}
                      placeholder="e.g. 100"
                      style={{flex:1, background:'var(--bg-elevated-2)', border:'1px solid var(--rh-steel-tint-24)', color:'var(--rh-steel-400)', padding:'10px', borderRadius:2, fontFamily:'var(--font-display)', fontSize:20, textAlign:'center'}}/>
                    <span className="label-md">SUP RDS</span>
                  </div>
                  {state.supRounds && (
                    <div style={{display:'flex', justifyContent:'space-between', marginTop:10, fontFamily:'var(--font-ui)', fontSize:10, letterSpacing:'0.14em', fontWeight:600}}>
                      <span style={{color:'var(--fg-1)'}}>UNSUP · {unsup}</span>
                      <span style={{color:'var(--rh-steel-400)'}}>SUP · {sup}</span>
                    </div>
                  )}
                </div>
              )}
            </div>
          );
        })}

        {passive.length > 0 && (
          <div className="card" style={{marginTop:14, background:'transparent', borderStyle:'dashed', borderColor:'var(--border-default)', padding:'10px 12px'}}>
            <div className="label-md" style={{color:'var(--rh-bone-500)'}}>Skipped — no suppressor on these</div>
            {passive.map(s => (
              <div key={s.gun.id} style={{fontFamily:'var(--font-ui)', fontSize:11, color:'var(--rh-bone-300)', letterSpacing:'0.10em', marginTop:6}}>
                {s.gun.name} · {s.rounds} rds
              </div>
            ))}
          </div>
        )}

        <div style={{marginTop:18}}>
          <Button variant="primary" block onClick={()=>go('cascade')} icon={allAnswered ? <I.check s={14}/> : null}>
            {allAnswered ? 'Continue →' : 'Answer for each gun first'}
          </Button>
        </div>
      </div>
    </>
  );
}

// ---------- MALFUNCTION LOGGING ----------
// v3.5: real malfunction flow. Captures type + ammo brand + optional notes,
// then routes back to LiveSession. The malfunction event is attached to the
// gun + ammo + suppressed state in effect at the moment.
function MalfunctionLog({ go }) {
  const [type, setType] = React.useState('');
  const [brand, setBrand] = React.useState('PMC Bronze');
  const [notes, setNotes] = React.useState('');

  // Sample context — in real app this would come from the live session state
  const ctx = {
    loadout: 'Glock 19',
    gun: 'Glock 19 Gen5',
    ammo: '9mm · Training · 115gr',
    suppressed: false,
    roundNumber: 127,
  };

  const types = [
    {id:'ftf',    label:'Failure to fire',  hint:'Light primer strike, click no bang'},
    {id:'ftfeed', label:'Failure to feed',  hint:'Round didn\'t chamber'},
    {id:'fte',    label:'Failure to extract', hint:'Spent case stayed in chamber'},
    {id:'fteject',label:'Failure to eject', hint:'Case didn\'t clear ejection port'},
    {id:'stove',  label:'Stovepipe',         hint:'Case caught vertical in port'},
    {id:'dblfeed',label:'Double feed',       hint:'Two rounds trying to chamber'},
    {id:'optic',  label:'Optic issue',       hint:'Dot died, dim, shifted'},
    {id:'mag',    label:'Magazine issue',    hint:'Mag drop, spring, feed lips'},
    {id:'other',  label:'Other',             hint:'Something else'},
  ];

  // Sample brands available for the active caliber
  const brandsForCaliber = ['PMC Bronze','Federal Champion','Winchester USA','Federal HST','Speer Gold Dot','Other'];

  const canSave = !!type;

  return (
    <>
      <TopBar title="Malfunction"/>
      <div className="screen">
        <BackRow to="live" label="Live session" go={go}/>

        <div className="screen-hero" style={{padding:'0 0 6px'}}>
          <div className="eyebrow" style={{color:'#E48A82'}}>Live session · Log a malfunction</div>
          <h1 className="hero-title" style={{fontSize:34}}>What just <span className="red">happened?</span></h1>
        </div>

        {/* Context card — shows what's auto-attached */}
        <div className="card" style={{padding:'12px 14px', borderLeft:'3px solid var(--rh-bone-500)'}}>
          <div className="label-md" style={{color:'var(--rh-bone-500)', fontSize:9}}>Auto-attached to event</div>
          <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:8, marginTop:6}}>
            <div>
              <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>Loadout</div>
              <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:2}}>{ctx.loadout}</div>
            </div>
            <div>
              <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>Gun</div>
              <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:2}}>{ctx.gun}</div>
            </div>
            <div>
              <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>At round</div>
              <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--fg-1)', letterSpacing:'0.02em', marginTop:2}}>#{ctx.roundNumber}</div>
            </div>
            <div>
              <div className="label-md" style={{fontSize:8, color: ctx.suppressed ? 'var(--rh-steel-400)' : 'var(--rh-bone-500)'}}>Suppressed</div>
              <div style={{fontFamily:'var(--font-display)', fontSize:14, color: ctx.suppressed ? 'var(--rh-steel-400)' : 'var(--rh-bone-300)', letterSpacing:'0.02em', marginTop:2}}>{ctx.suppressed ? 'Yes' : 'No'}</div>
            </div>
          </div>
        </div>

        {/* Type picker — the actual malfunction kind */}
        <LabelRule>Type · what failed</LabelRule>
        <div style={{display:'flex', flexDirection:'column', gap:6}}>
          {types.map(t => (
            <div
              key={t.id}
              onClick={()=>setType(t.id)}
              style={{
                cursor:'pointer',
                padding:'10px 12px',
                background: type===t.id ? 'rgba(195,58,46,0.10)' : 'var(--bg-elevated-1)',
                border:'1px solid',
                borderColor: type===t.id ? 'var(--rh-dusty-red)' : 'var(--border-default)',
                borderLeftWidth: type===t.id ? 3 : 1,
                borderLeftColor: type===t.id ? 'var(--rh-dusty-red)' : 'var(--border-default)',
                borderRadius:2,
                display:'grid', gridTemplateColumns:'1fr auto', gap:10, alignItems:'center',
              }}>
              <div>
                <div style={{fontFamily:'var(--font-ui)', fontSize:13, color: type===t.id ? 'var(--fg-1)' : 'var(--rh-bone-300)', textTransform:'uppercase', letterSpacing:'0.10em', fontWeight:600}}>{t.label}</div>
                <div className="rh-body-sm" style={{marginTop:2, color:'var(--rh-bone-500)', fontSize:11}}>{t.hint}</div>
              </div>
              <span style={{
                width:16, height:16, borderRadius:'50%',
                border:`1px solid ${type===t.id ? 'var(--rh-dusty-red)' : 'var(--border-strong)'}`,
                background: type===t.id ? 'var(--rh-dusty-red)' : 'transparent',
              }}/>
            </div>
          ))}
        </div>

        {/* Ammo brand confirmation — defaults to current loadout's ammo */}
        <LabelRule>Ammo brand · confirm or change</LabelRule>
        <div className="card" style={{padding:'10px 12px'}}>
          <div className="label-md" style={{fontSize:8, color:'var(--rh-bone-500)'}}>Default · from loadout</div>
          <div style={{fontFamily:'var(--font-display)', fontSize:14, color:'var(--rh-bone-300)', letterSpacing:'0.02em', marginTop:2, marginBottom:10}}>{ctx.ammo}</div>
          <div style={{display:'flex', flexWrap:'wrap', gap:6}}>
            {brandsForCaliber.map(b => (
              <Pill key={b} on={brand===b} onClick={()=>setBrand(b)}>{b}</Pill>
            ))}
          </div>
        </div>

        {/* Optional notes */}
        <LabelRule>Notes (optional)</LabelRule>
        <div className="card">
          <textarea
            value={notes}
            onChange={e=>setNotes(e.target.value)}
            placeholder="e.g. mag #4 dropped, third round of fresh mag, slide stayed forward"
            rows={3}
            style={{width:'100%', background:'transparent', border:0, color:'var(--fg-1)', fontFamily:'var(--font-body)', fontSize:13, resize:'none', outline:'none'}}/>
        </div>

        <div className="rh-body-sm" style={{textAlign:'center', marginTop:12, color:'var(--rh-bone-500)', fontSize:11}}>
          Saving attaches this event to the gun's Service Record and the ammo brand's reliability stats.
        </div>

        <div style={{marginTop:14, display:'grid', gridTemplateColumns:'1fr 2fr', gap:10}}>
          <Button variant="secondary" block onClick={()=>go('live')}>Cancel</Button>
          <Button variant="primary" block onClick={()=>go('live')} icon={canSave ? <I.check s={14}/> : null}>
            {canSave ? 'Save & return' : 'Pick a type first'}
          </Button>
        </div>
      </div>
    </>
  );
}

// ---------- POST-SESSION CASCADE ----------
// v3.2: After saving a session, show the user EVERYTHING that just changed
// because of this trip. This is the central UX moment that makes the
// "connected system" thesis visible. Pulled from the marketing deck p.2.
function Cascade({ go }) {
  return (
    <>
      <TopBar title="Session saved"/>
      <div className="screen" style={{paddingTop:20}}>
        <div style={{display:'flex', justifyContent:'center', marginBottom:18}}>
          <div style={{
            width:64, height:64, borderRadius:'50%',
            background:'rgba(107,142,90,0.14)',
            border:'1px solid rgba(107,142,90,0.4)',
            display:'flex', alignItems:'center', justifyContent:'center',
            color:'#A6C293',
          }}>
            <I.check s={28}/>
          </div>
        </div>

        <div style={{textAlign:'center'}}>
          <div className="eyebrow">Range Session · #4287</div>
          <h1 className="hero-title" style={{fontSize:38, marginTop:6}}>This trip <span className="red">moved the system.</span></h1>
        </div>

        <div className="card brass" style={{marginTop:16, padding:'14px 16px'}}>
          <div className="label-md" style={{color:'var(--rh-brass-400)'}}>Today · Bell Range · 25yd · 02:24</div>
          <div style={{display:'flex', justifyContent:'space-between', marginTop:8}}>
            <span style={{fontFamily:'var(--font-display)', fontSize:30, color:'var(--fg-1)', letterSpacing:'0.02em', lineHeight:1}}>327</span>
            <span className="label-md" style={{alignSelf:'flex-end'}}>ROUNDS FIRED</span>
          </div>
        </div>

        <LabelRule>What changed</LabelRule>
        <div className="card" style={{padding:'4px 14px'}}>
          <CascadeRow icon={<I.package s={14}/>} k="9mm inventory" v="1,809 → 1,562 rds" sub="247 rds consumed"/>
          <CascadeRow icon={<I.package s={14}/>} k="5.56 inventory" v="440 → 360 rds" sub="80 rds · NOW BELOW PAR · supply alert raised" tone="warn"/>
          <CascadeRow icon={<I.target s={14}/>} k="Glock 19 round count" v="4,040 → 4,287" sub="cleaning due in 213 rds"/>
          <CascadeRow icon={<I.target s={14}/>} k="11.5″ AR-15 round count" v="2,418 → 2,498" sub="suppressed: +0"/>
          <CascadeRow icon={<I.cog s={14}/>} k="Glock 19 · reliability streak" v="1,247 → 1,494 rds clean" sub="0 malfunctions" tone="ok"/>
          <CascadeRow icon={<I.ring s={14}/>} k="Roundhouse Record" v="78.0% → 78.4%" sub="+1 session · +1 milestone" tone="ok" last/>
        </div>

        <LabelRule>Goals advanced</LabelRule>
        <div className="card" style={{padding:'4px 14px'}}>
          <CascadeRow icon={<span style={{color:'var(--rh-brass-400)'}}>◆</span>} k="Sub-2s draw" v="73% → 76%" sub="+3% · 5 reps consistent"/>
          <CascadeRow icon={<span style={{color:'var(--rh-brass-400)'}}>◆</span>} k="1.5s split times" v="41% → 44%" sub="+3% · best run: 1.52s" last/>
        </div>

        <div style={{marginTop:20, display:'grid', gridTemplateColumns:'1fr 1fr', gap:10}}>
          <Button variant="secondary" block onClick={()=>go('firearm')}>Open Service Record</Button>
          <Button variant="primary" block onClick={()=>go('home')}>Done</Button>
        </div>

        <div className="rh-body-sm" style={{textAlign:'center', marginTop:14, color:'var(--rh-bone-500)'}}>
          The record gets stronger. Every trip builds on the last.
        </div>
      </div>
    </>
  );
}

function CascadeRow({ icon, k, v, sub, tone, last }) {
  const color = tone==='warn' ? '#E5B07E' : tone==='ok' ? '#A6C293' : 'var(--fg-1)';
  return (
    <div style={{display:'grid', gridTemplateColumns:'20px 1fr', gap:10, padding:'10px 0', borderBottom: last ? 'none' : '1px solid var(--border-hairline)'}}>
      <span style={{color:'var(--rh-bone-500)', marginTop:2}}>{icon}</span>
      <div>
        <div style={{display:'flex', justifyContent:'space-between', alignItems:'baseline', gap:8}}>
          <span className="label-md" style={{color:'var(--rh-bone-500)', letterSpacing:'0.16em'}}>{k}</span>
          <span style={{fontFamily:'var(--font-display)', fontSize:14, color, letterSpacing:'0.02em'}}>{v}</span>
        </div>
        <div className="rh-body-sm" style={{marginTop:3, color:'var(--rh-bone-500)'}}>{sub}</div>
      </div>
    </div>
  );
}

window.PlanTrip = PlanTrip;
window.SessionPicker = SessionPicker;
window.LiveSession = LiveSession;
window.QuickLog = QuickLog;
window.MalfunctionLog = MalfunctionLog;
window.SessionReconcile = SessionReconcile;
window.Cascade = Cascade;
