// ─────────────────────────────────────────────────────────────────────────────
//  CZF Draft Tool v2 — page-draft.jsx
//  - Fix filtre rôles (Meraki: "Support" → UTILITY)
//  - Création depuis match planifié
//  - Mode Fearless (champions pickés = bloqués au prochain game)
//  - Bans plus visibles
//  - Fluidité maximale (optimistic UI + polling)
// ─────────────────────────────────────────────────────────────────────────────

const DRAFT_SEQUENCE = [
  {team:'blue',type:'ban'},{team:'red',type:'ban'},{team:'blue',type:'ban'},{team:'red',type:'ban'},
  {team:'blue',type:'ban'},{team:'red',type:'ban'},
  {team:'blue',type:'pick'},{team:'red',type:'pick'},{team:'red',type:'pick'},{team:'blue',type:'pick'},
  {team:'blue',type:'pick'},{team:'red',type:'pick'},
  {team:'red',type:'ban'},{team:'blue',type:'ban'},{team:'red',type:'ban'},{team:'blue',type:'ban'},
  {team:'red',type:'pick'},{team:'blue',type:'pick'},{team:'blue',type:'pick'},{team:'red',type:'pick'},
];

const ROLES = ['ALL','TOP','JUNGLE','MIDDLE','BOTTOM','UTILITY'];
const ROLE_LABELS  = { ALL:'Tous', TOP:'Top', JUNGLE:'Jungle', MIDDLE:'Mid', BOTTOM:'ADC', UTILITY:'Support' };
const ROLE_ICONS   = {
  TOP:     'https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-static-assets/global/default/svg/position-top.svg',
  JUNGLE:  'https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-static-assets/global/default/svg/position-jungle.svg',
  MIDDLE:  'https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-static-assets/global/default/svg/position-middle.svg',
  BOTTOM:  'https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-static-assets/global/default/svg/position-bottom.svg',
  UTILITY: 'https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-static-assets/global/default/svg/position-utility.svg',
};
// Meraki uses "Support" not "Utility"
const MERAKI_ROLE_MAP = { SUPPORT: 'UTILITY' };

const BLUE = { main:'#3B7DD8', dim:'rgba(59,125,216,.15)', border:'rgba(59,125,216,.45)' };
const RED  = { main:'#E02020', dim:'rgba(224,32,32,.15)',  border:'rgba(224,32,32,.45)'  };
const GOLD = { main:'#C8A95A', dim:'rgba(200,169,90,.15)', border:'rgba(200,169,90,.4)'  };

// ── DDragon / Meraki loading ──────────────────────────────────────────────────
let _ddPatch = null, _ddChamps = null, _merakiRoles = null;

async function loadChampionData() {
  if (_ddChamps) return { champs:_ddChamps, roles:_merakiRoles };

  const versions = await fetch('https://ddragon.leagueoflegends.com/api/versions.json').then(r=>r.json());
  _ddPatch = versions[0];

  const dd = await fetch(`https://ddragon.leagueoflegends.com/cdn/${_ddPatch}/data/en_US/champion.json`).then(r=>r.json());
  _ddChamps = Object.values(dd.data).map(c => ({
    id: c.id, key: c.key, name: c.name,
    icon:   `https://ddragon.leagueoflegends.com/cdn/${_ddPatch}/img/champion/${c.id}.png`,
    splash: `https://ddragon.leagueoflegends.com/cdn/img/champion/loading/${c.id}_0.jpg`,
  })).sort((a,b) => a.name.localeCompare(b.name));

  try {
    const mk = await fetch('https://cdn.merakianalytics.com/riot/lol/resources/latest/en-US/champions.json').then(r=>r.json());
    _merakiRoles = {};
    Object.values(mk).forEach(c => {
      const roles = (c.positions || []).map(p => {
        const up = p.toUpperCase();
        return MERAKI_ROLE_MAP[up] || up;
      });
      // Meraki id matches DDragon id for most champs
      _merakiRoles[c.id] = roles;
    });
  } catch(e) { _merakiRoles = {}; }

  return { champs:_ddChamps, roles:_merakiRoles };
}

function iconUrl(id) {
  return `https://ddragon.leagueoflegends.com/cdn/${_ddPatch}/img/champion/${id}.png`;
}

// ── Draft state helpers ───────────────────────────────────────────────────────
function getActions(state, team, type) {
  return (state.actions||[]).filter(a => a.team===team && a.type===type);
}
function getCurrentStep(state) {
  if (!state || state.status==='done' || state.step>=20) return null;
  return DRAFT_SEQUENCE[state.step];
}
function isInFearlessPool(state, champId) {
  return (state.fearless_pool||[]).includes(champId);
}
function isUsedInGame(state, champId) {
  return (state.actions||[]).some(a=>a.champId===champId);
}

// ── Timer ────────────────────────────────────────────────────────────────────
const DraftTimer = ({ seconds, active, type }) => {
  const color = !active ? 'rgba(255,255,255,.2)'
    : seconds<=5 ? RED.main : seconds<=10 ? GOLD.main : BLUE.main;
  return (
    <div style={{display:'flex',flexDirection:'column',alignItems:'center',gap:4}}>
      <div style={{fontFamily:'var(--fd)',fontSize:'3rem',fontWeight:900,color,lineHeight:1,
        transition:'color .3s',minWidth:60,textAlign:'center'}}>
        {active ? seconds : '--'}
      </div>
      <div style={{width:60,height:3,background:'rgba(255,255,255,.08)',borderRadius:2}}>
        {active&&<div style={{height:'100%',borderRadius:2,background:color,
          width:`${Math.max(0,seconds/30*100)}%`,transition:'width 1s linear,background .3s'}}/>}
      </div>
    </div>
  );
};

// ── ChampionSlot ─────────────────────────────────────────────────────────────
const ChampionSlot = ({ action, isCurrent, teamColor, type, size='md' }) => {
  const s = size==='lg'?72:size==='sm'?40:54;
  if (!action) return (
    <div style={{width:s,height:s,borderRadius:3,flexShrink:0,
      background: isCurrent
        ? (type==='ban' ? RED.dim : 'rgba(59,125,216,.2)')
        : 'rgba(255,255,255,.05)',
      border: isCurrent
        ? `2px solid ${type==='ban' ? RED.main : BLUE.main}`
        : '1px solid rgba(255,255,255,.12)',
      boxShadow: isCurrent ? `0 0 12px ${type==='ban' ? RED.main : BLUE.main}60` : 'none',
      display:'flex',alignItems:'center',justifyContent:'center',
      animation: isCurrent ? 'pulse-slot 1.2s ease-in-out infinite' : 'none',
    }}>
      {isCurrent&&<div style={{width:6,height:6,borderRadius:'50%',
        background:type==='ban'?RED.main:BLUE.main}}/>}
    </div>
  );

  return (
    <div style={{width:s,height:s,borderRadius:3,flexShrink:0,position:'relative',overflow:'hidden',
      border:`1.5px solid ${action.type==='ban' ? 'rgba(224,32,32,.5)' : teamColor.border}`,
    }}>
      <img src={iconUrl(action.champId)} alt={action.champName}
        style={{width:'100%',height:'100%',objectFit:'cover',
          filter:action.type==='ban'?'grayscale(1) brightness(.45)':'none'}}/>
      {action.type==='ban'&&(
        <div style={{position:'absolute',inset:0,display:'flex',alignItems:'center',
          justifyContent:'center',background:'rgba(0,0,0,.35)'}}>
          <div style={{width:'80%',height:2.5,background:RED.main,
            transform:'rotate(-45deg)',borderRadius:1}}/>
        </div>
      )}
      <div style={{position:'absolute',bottom:0,left:0,right:0,padding:'2px 3px',
        background:'linear-gradient(transparent,rgba(0,0,0,.85))',
        fontFamily:'var(--fd)',fontSize:'.45rem',color:'#fff',
        letterSpacing:'.04em',textAlign:'center',lineHeight:1.1}}>
        {action.champName.toUpperCase()}
      </div>
    </div>
  );
};

// ── BanStrip — bande de bans au dessus du panel ───────────────────────────────
const BanStrip = ({ bans, isBlue, state, currentStep }) => {
  const color = isBlue ? BLUE : RED;
  const team  = isBlue ? 'blue' : 'red';
  const slots = [0,1,2,3,4].map(i => bans[i]||null);
  const isCurrentBanSlot = (i) =>
    currentStep?.team===team && currentStep?.type==='ban' && bans.length===i;

  return (
    <div style={{display:'flex',gap:4,flexDirection:isBlue?'row':'row-reverse',flexWrap:'wrap'}}>
      {slots.map((a,i) => (
        <ChampionSlot key={i} action={a} type="ban" teamColor={color}
          isCurrent={isCurrentBanSlot(i)} size="sm"/>
      ))}
    </div>
  );
};

// ── PickStrip — picks en dessous ─────────────────────────────────────────────
const PickStrip = ({ picks, isBlue, state, currentStep }) => {
  const color = isBlue ? BLUE : RED;
  const team  = isBlue ? 'blue' : 'red';
  const slots = [0,1,2,3,4].map(i => picks[i]||null);
  const isCurrentPickSlot = (i) =>
    currentStep?.team===team && currentStep?.type==='pick' && picks.length===i;

  return (
    <div style={{display:'flex',gap:4,flexDirection:isBlue?'row':'row-reverse',flexWrap:'wrap'}}>
      {slots.map((a,i) => (
        <ChampionSlot key={i} action={a} type="pick" teamColor={color}
          isCurrent={isCurrentPickSlot(i)} size="md"/>
      ))}
    </div>
  );
};

// ── TeamPanel ────────────────────────────────────────────────────────────────
const TeamPanel = ({ state, team, currentStep }) => {
  const isBlue = team==='blue';
  const color  = isBlue ? BLUE : RED;
  const name   = isBlue ? state.blueName : state.redName;
  const bans   = getActions(state, team, 'ban');
  const picks  = getActions(state, team, 'pick');

  return (
    <div style={{flex:1,minWidth:0,display:'flex',flexDirection:'column',gap:8,
      borderTop:`2px solid ${color.main}`,paddingTop:8}}>
      <div style={{display:'flex',alignItems:'center',gap:6,
        flexDirection:isBlue?'row':'row-reverse'}}>
        <div style={{width:8,height:8,borderRadius:'50%',background:color.main,flexShrink:0}}/>
        <div style={{fontFamily:'var(--fd)',fontSize:'1rem',letterSpacing:'.08em',
          color:color.main,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap',
          textAlign:isBlue?'left':'right'}}>{name.toUpperCase()}</div>
      </div>

      <div>
        <div style={{fontFamily:'var(--fc)',fontSize:'.55rem',letterSpacing:'.14em',
          textTransform:'uppercase',color:RED.main,marginBottom:4,fontWeight:700}}>— BANS</div>
        <BanStrip bans={bans} isBlue={isBlue} state={state} currentStep={currentStep}/>
      </div>

      <div>
        <div style={{fontFamily:'var(--fc)',fontSize:'.55rem',letterSpacing:'.14em',
          textTransform:'uppercase',color:'var(--muted)',marginBottom:4}}>PICKS</div>
        <PickStrip picks={picks} isBlue={isBlue} state={state} currentStep={currentStep}/>
      </div>
    </div>
  );
};

// ── ChampionGrid ─────────────────────────────────────────────────────────────
const ChampionGrid = ({ champs, roles, usedIds, fearlessIds, onSelect, canPick, currentStep }) => {
  const [search, setSearch] = React.useState('');
  const [role,   setRole]   = React.useState('ALL');
  const [hover,  setHover]  = React.useState(null);

  const filtered = React.useMemo(() => {
    return champs.filter(c => {
      if (search && !c.name.toLowerCase().includes(search.toLowerCase())) return false;
      if (role !== 'ALL') {
        const cr = roles?.[c.id] || [];
        if (!cr.includes(role)) return false;
      }
      return true;
    });
  }, [champs, search, role, roles]);

  const isBanPhase  = currentStep?.type === 'ban';
  const actionColor = isBanPhase ? RED : BLUE;
  const actionLabel = isBanPhase ? 'BANNIR' : 'PICKER';

  return (
    <div style={{display:'flex',flexDirection:'column',gap:8}}>
      <div style={{position:'relative'}}>
        <span style={{position:'absolute',left:'.6rem',top:'50%',transform:'translateY(-50%)',
          opacity:.4,pointerEvents:'none',fontSize:'.85rem'}}>🔍</span>
        <input value={search} onChange={e=>setSearch(e.target.value)}
          placeholder="Rechercher..."
          style={{width:'100%',boxSizing:'border-box',padding:'.45rem .5rem .45rem 2rem',
            background:'rgba(255,255,255,.06)',border:'1px solid rgba(255,255,255,.12)',
            borderRadius:3,fontFamily:'var(--fc)',fontSize:'.8rem',color:'var(--cream)',outline:'none'}}/>
      </div>

      <div style={{display:'flex',gap:3,flexWrap:'wrap'}}>
        {ROLES.map(r=>(
          <button key={r} onClick={()=>setRole(r)}
            style={{display:'flex',alignItems:'center',gap:3,padding:'.2rem .45rem',
              background:role===r?GOLD.dim:'rgba(255,255,255,.05)',
              border:role===r?`1px solid ${GOLD.border}`:'1px solid rgba(255,255,255,.08)',
              borderRadius:3,cursor:'pointer',
              color:role===r?GOLD.main:'var(--muted)',
              fontFamily:'var(--fc)',fontSize:'.6rem',fontWeight:600,letterSpacing:'.1em',
              textTransform:'uppercase'}}>
            {r!=='ALL'&&<img src={ROLE_ICONS[r]} alt={r} style={{width:12,height:12,opacity:.8,
              filter:role===r?'none':'grayscale(1)'}}/>}
            {ROLE_LABELS[r]}
          </button>
        ))}
        <span style={{marginLeft:'auto',fontFamily:'var(--fc)',fontSize:'.6rem',
          color:'var(--muted)',alignSelf:'center'}}>{filtered.length}/{champs.length}</span>
      </div>

      {fearlessIds && fearlessIds.size > 0 && (
        <div style={{fontFamily:'var(--fc)',fontSize:'.6rem',color:'#E8963B',
          padding:'.3rem .5rem',background:'rgba(232,150,59,.08)',
          border:'1px solid rgba(232,150,59,.2)',borderRadius:3}}>
          🔒 Mode Fearless — {fearlessIds.size} champion(s) non pickable(s) ce game
        </div>
      )}

      <div style={{display:'grid',gridTemplateColumns:'repeat(auto-fill,minmax(48px,1fr))',
        gap:3,maxHeight:360,overflowY:'auto',padding:'2px 1px'}}>
        {filtered.map(c => {
          const usedInGame  = usedIds.has(c.id);
          const fearLocked  = fearlessIds?.has(c.id) && !usedInGame;
          const canSelect   = canPick && !usedInGame && !(fearLocked && !isBanPhase);
          const isHov       = hover===c.id;

          return (
            <div key={c.id}
              onMouseEnter={()=>setHover(c.id)}
              onMouseLeave={()=>setHover(null)}
              onClick={()=>canSelect&&onSelect(c)}
              title={fearLocked ? `${c.name} — Fearless: non pickable` : c.name}
              style={{position:'relative',overflow:'hidden',borderRadius:3,
                cursor:canSelect?'pointer':usedInGame?'not-allowed':'default',
                border:isHov&&canSelect?`2px solid ${actionColor.main}`
                  :fearLocked?'2px solid rgba(232,150,59,.5)':'2px solid transparent',
                transform:isHov&&canSelect?'scale(1.06)':'scale(1)',
                transition:'transform .1s,border-color .1s',
                boxShadow:isHov&&canSelect?`0 0 10px ${actionColor.main}60`:'none',
              }}>
              <img src={c.icon} alt={c.name}
                style={{width:'100%',aspectRatio:'1',display:'block',objectFit:'cover',
                  filter:usedInGame?'grayscale(1) brightness(.25)'
                    :fearLocked?'sepia(.8) brightness(.6)':'none',
                  transition:'filter .15s'}}/>
              {usedInGame&&(
                <div style={{position:'absolute',inset:0,display:'flex',alignItems:'center',
                  justifyContent:'center'}}>
                  <div style={{width:'80%',height:2,background:'rgba(224,32,32,.7)',
                    transform:'rotate(-45deg)',borderRadius:1}}/>
                </div>
              )}
              {fearLocked&&!usedInGame&&(
                <div style={{position:'absolute',inset:0,display:'flex',alignItems:'center',
                  justifyContent:'center',background:'rgba(0,0,0,.2)'}}>
                  <span style={{fontSize:'.8rem'}}>🔒</span>
                </div>
              )}
              {isHov&&canSelect&&(
                <div style={{position:'absolute',bottom:0,left:0,right:0,
                  background:`${actionColor.main}DD`,padding:'2px',
                  fontFamily:'var(--fd)',fontSize:'.4rem',letterSpacing:'.08em',
                  color:'#fff',textAlign:'center'}}>{actionLabel}</div>
              )}
            </div>
          );
        })}
        {filtered.length===0&&(
          <div style={{gridColumn:'1/-1',textAlign:'center',padding:'2rem 0',
            color:'var(--muted)',fontFamily:'var(--fc)',fontSize:'.8rem'}}>
            Aucun champion trouvé
          </div>
        )}
      </div>
    </div>
  );
};

// ── DraftCreate ───────────────────────────────────────────────────────────────
const DraftCreate = ({ onCreated }) => {
  const [mode,     setMode]     = React.useState('free'); // 'free' | 'match'
  const [matches,  setMatches]  = React.useState([]);
  const [blueName, setBlueName] = React.useState('');
  const [redName,  setRedName]  = React.useState('');
  const [fearless, setFearless] = React.useState(false);
  const [loading,  setLoading]  = React.useState(false);
  const [error,    setError]    = React.useState(null);

  React.useEffect(() => {
    if (mode==='match') {
      fetch(`${CZF.API_BASE}/public/upcoming`).then(r=>r.json())
        .then(d=>setMatches(Array.isArray(d)?d:[])).catch(()=>setMatches([]));
    }
  }, [mode]);

  const selectMatch = (m) => { setBlueName(m.team1||''); setRedName(m.team2||''); };

  const create = async () => {
    if (!blueName.trim()||!redName.trim()) { setError('Remplis les deux noms.'); return; }
    setLoading(true); setError(null);
    try {
      const res = await fetch(`${CZF.API_BASE}/draft/create`, {
        method:'POST', headers:{'Content-Type':'application/json'},
        body: JSON.stringify({ blue_name:blueName.trim(), red_name:redName.trim(), fearless }),
      });
      const d = await res.json();
      if (!res.ok) throw new Error(d.error||'Erreur serveur');
      onCreated(d);
    } catch(e) { setError(e.message); }
    finally { setLoading(false); }
  };

  const inp = {
    width:'100%',boxSizing:'border-box',padding:'.55rem .7rem',
    background:'rgba(255,255,255,.06)',border:'1px solid rgba(255,255,255,.15)',
    borderRadius:3,fontFamily:'var(--fc)',fontSize:'.85rem',color:'var(--cream)',outline:'none',marginTop:4,
  };

  return (
    <div style={{maxWidth:520,margin:'0 auto',display:'flex',flexDirection:'column',gap:18}}>
      <div style={{textAlign:'center'}}>
        <div style={{fontFamily:'var(--fd)',fontSize:'2.2rem',letterSpacing:'.1em',color:'var(--cream)'}}>
          CRÉER UN DRAFT
        </div>
      </div>

      {/* Mode tabs */}
      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:6}}>
        {[
          {id:'free',  label:'Draft libre',          sub:'Hors tournoi, noms libres'},
          {id:'match', label:'Depuis un match CZF',  sub:'Sélectionne un match planifié'},
        ].map(t=>(
          <button key={t.id} onClick={()=>setMode(t.id)}
            style={{padding:'.7rem',borderRadius:3,cursor:'pointer',textAlign:'left',
              background:mode===t.id?GOLD.dim:'rgba(255,255,255,.04)',
              border:mode===t.id?`1px solid ${GOLD.border}`:'1px solid rgba(255,255,255,.1)'}}>
            <div style={{fontFamily:'var(--fd)',fontSize:'.9rem',letterSpacing:'.06em',
              color:mode===t.id?GOLD.main:'var(--cream)'}}>{t.label}</div>
            <div style={{fontFamily:'var(--fc)',fontSize:'.65rem',color:'var(--muted)',marginTop:2}}>{t.sub}</div>
          </button>
        ))}
      </div>

      {/* Match picker */}
      {mode==='match' && (
        <div>
          <label style={{fontFamily:'var(--fc)',fontSize:'.65rem',letterSpacing:'.1em',
            textTransform:'uppercase',color:'var(--muted)'}}>Match planifié</label>
          {matches.length===0
            ? <div style={{marginTop:6,fontFamily:'var(--fc)',fontSize:'.8rem',color:'var(--muted)',
                padding:'.5rem',background:'rgba(255,255,255,.04)',borderRadius:3}}>
                Aucun match planifié
              </div>
            : <div style={{display:'flex',flexDirection:'column',gap:4,marginTop:6}}>
                {matches.map((m,i)=>(
                  <button key={i} onClick={()=>selectMatch(m)}
                    style={{display:'flex',alignItems:'center',justifyContent:'space-between',
                      padding:'.5rem .7rem',background:'rgba(255,255,255,.05)',
                      border:`1px solid ${(blueName===m.team1&&redName===m.team2)?GOLD.border:'rgba(255,255,255,.1)'}`,
                      borderRadius:3,cursor:'pointer',
                      color:(blueName===m.team1&&redName===m.team2)?GOLD.main:'var(--cream)'}}>
                    <span style={{fontFamily:'var(--fc)',fontSize:'.8rem'}}>
                      {m.team1} <span style={{color:'var(--muted)'}}>vs</span> {m.team2}
                    </span>
                    <span style={{fontFamily:'var(--fc)',fontSize:'.65rem',color:'var(--muted)'}}>
                      {m.date||''} {m.bo_type||''}
                    </span>
                  </button>
                ))}
              </div>
          }
        </div>
      )}

      {/* Team names */}
      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:12}}>
        <div>
          <label style={{fontFamily:'var(--fc)',fontSize:'.65rem',letterSpacing:'.1em',
            textTransform:'uppercase',color:BLUE.main}}>Équipe Bleue</label>
          <input value={blueName} onChange={e=>setBlueName(e.target.value)}
            placeholder="Nom équipe bleue" style={{...inp,borderColor:BLUE.border}}/>
        </div>
        <div>
          <label style={{fontFamily:'var(--fc)',fontSize:'.65rem',letterSpacing:'.1em',
            textTransform:'uppercase',color:RED.main}}>Équipe Rouge</label>
          <input value={redName} onChange={e=>setRedName(e.target.value)}
            placeholder="Nom équipe rouge" style={{...inp,borderColor:RED.border}}/>
        </div>
      </div>

      {/* Fearless toggle */}
      <div style={{display:'flex',alignItems:'center',gap:10,padding:'.6rem .8rem',
        background:fearless?'rgba(232,150,59,.1)':'rgba(255,255,255,.04)',
        border:`1px solid ${fearless?'rgba(232,150,59,.35)':'rgba(255,255,255,.1)'}`,
        borderRadius:3,cursor:'pointer'}} onClick={()=>setFearless(f=>!f)}>
        <div style={{width:32,height:18,borderRadius:9,
          background:fearless?'#E8963B':'rgba(255,255,255,.15)',
          position:'relative',transition:'background .2s',flexShrink:0}}>
          <div style={{width:14,height:14,borderRadius:'50%',background:'#fff',
            position:'absolute',top:2,left:fearless?16:2,transition:'left .2s'}}/>
        </div>
        <div>
          <div style={{fontFamily:'var(--fd)',fontSize:'.85rem',letterSpacing:'.06em',
            color:fearless?'#E8963B':'var(--cream)'}}>MODE FEARLESS</div>
          <div style={{fontFamily:'var(--fc)',fontSize:'.62rem',color:'var(--muted)',marginTop:1}}>
            Champions pickés = bloqués aux games suivants
          </div>
        </div>
      </div>

      {error&&<div style={{background:RED.dim,border:`1px solid ${RED.border}`,borderRadius:3,
        padding:'.5rem .7rem',fontFamily:'var(--fc)',fontSize:'.8rem',color:'#ff7070'}}>{error}</div>}

      <button onClick={create} disabled={loading}
        style={{padding:'.75rem',background:GOLD.main,border:'none',borderRadius:3,
          fontFamily:'var(--fd)',fontSize:'1.1rem',letterSpacing:'.1em',
          color:'var(--paper-ink)',cursor:loading?'not-allowed':'pointer',opacity:loading?.6:1}}>
        {loading?'CRÉATION...':'CRÉER LA SALLE'}
      </button>
    </div>
  );
};

// ── DraftLinks ────────────────────────────────────────────────────────────────
const DraftLinks = ({ roomData, onEnter }) => {
  const [copied, setCopied] = React.useState(null);
  const base = window.location.origin + window.location.pathname;
  const mkUrl = (team) => `${base}#draft?room=${roomData.room_id}&team=${team}`;

  const links = { blue:mkUrl('blue'), red:mkUrl('red'), spec:mkUrl('spectator') };

  const copy = (k) => {
    navigator.clipboard.writeText(links[k])
      .then(()=>{ setCopied(k); setTimeout(()=>setCopied(null),2000); });
  };

  const row = (key, label, color) => (
    <div key={key}>
      <div style={{fontFamily:'var(--fc)',fontSize:'.6rem',letterSpacing:'.12em',
        textTransform:'uppercase',color:color.main||color,marginBottom:4}}>{label}</div>
      <div style={{display:'flex',gap:6}}>
        <div style={{flex:1,padding:'.55rem .7rem',background:color.dim||'rgba(255,255,255,.05)',
          border:`1px solid ${color.border||'rgba(255,255,255,.15)'}`,borderRadius:3,
          fontFamily:'var(--fc)',fontSize:'.7rem',color:'var(--cream)',
          overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'}}>
          {links[key]}
        </div>
        <button onClick={()=>copy(key)}
          style={{padding:'.55rem .8rem',background:copied===key?'rgba(0,200,100,.2)':'rgba(255,255,255,.07)',
            border:'1px solid rgba(255,255,255,.15)',borderRadius:3,cursor:'pointer',
            fontFamily:'var(--fc)',fontSize:'.7rem',color:'var(--cream)',whiteSpace:'nowrap'}}>
          {copied===key?'✓ Copié':'Copier'}
        </button>
      </div>
    </div>
  );

  return (
    <div style={{maxWidth:560,margin:'0 auto',display:'flex',flexDirection:'column',gap:14}}>
      <div style={{textAlign:'center',fontFamily:'var(--fd)',fontSize:'2rem',
        letterSpacing:'.1em',color:'var(--cream)'}}>
        DRAFT CRÉÉ ✓ {roomData.fearless&&<span style={{fontSize:'1rem',color:'#E8963B'}}>⚡ FEARLESS</span>}
      </div>
      {row('blue','Lien Équipe Bleue', BLUE)}
      {row('red', 'Lien Équipe Rouge', RED)}
      {row('spec','Lien Spectateur',   {main:GOLD.main,dim:GOLD.dim,border:GOLD.border})}
      <button onClick={()=>onEnter(roomData.room_id,'spectator')}
        style={{marginTop:6,padding:'.6rem',background:'transparent',
          border:'1px solid rgba(255,255,255,.15)',borderRadius:3,
          fontFamily:'var(--fc)',fontSize:'.8rem',color:'var(--muted)',cursor:'pointer'}}>
        Voir en spectateur →
      </button>
    </div>
  );
};

// ── DraftRoom ────────────────────────────────────────────────────────────────
const DraftRoom = ({ roomId, myTeam, champs, roles }) => {
  const [state,    setState]    = React.useState(null);
  const [timer,    setTimer]    = React.useState(30);
  const [loading,  setLoading]  = React.useState(true);
  const [pending,  setPending]  = React.useState(false); // optimistic lock
  const timerRef = React.useRef(null);
  const stepRef  = React.useRef(-1);
  const pollRef  = React.useRef(null);

  // ── Polling optimisé ──
  const poll = React.useCallback(async () => {
    try {
      const r = await fetch(`${CZF.API_BASE}/public/draft?room=${roomId}`);
      const d = await r.json();
      if (d && !d.error) {
        setState(prev => {
          if (prev && prev.step===d.step && prev.status===d.status) return prev; // no-op
          return d;
        });
        setLoading(false);
        if (d.step !== stepRef.current) {
          stepRef.current = d.step;
          setTimer(30); setPending(false);
          clearInterval(timerRef.current);
          if (d.status==='active' && d.step<20) {
            timerRef.current = setInterval(()=>setTimer(t=>Math.max(0,t-1)),1000);
          }
        }
      }
    } catch(e) {}
  }, [roomId]);

  React.useEffect(() => {
    poll();
    pollRef.current = setInterval(poll, 1200);
    return () => { clearInterval(pollRef.current); clearInterval(timerRef.current); };
  }, [poll]);

  const handleSelect = async (champ) => {
    if (!state||state.status!=='active'||pending) return;
    const cur = getCurrentStep(state);
    if (!cur||cur.team!==myTeam) return;
    // Fearless: can't pick a fearless-locked champ
    if (cur.type==='pick' && isInFearlessPool(state, champ.id)) return;
    setPending(true);
    // Optimistic update
    setState(prev => {
      if (!prev) return prev;
      const newActions = [...prev.actions, {
        step:prev.step, team:cur.team, type:cur.type,
        champId:champ.id, champName:champ.name
      }];
      const newStep = prev.step+1;
      return { ...prev, actions:newActions, step:newStep,
        status: newStep>=20?'done':'active' };
    });
    try {
      await fetch(`${CZF.API_BASE}/draft/action`, {
        method:'POST', headers:{'Content-Type':'application/json'},
        body: JSON.stringify({ room_id:roomId, team:myTeam,
          champ_id:champ.id, champ_name:champ.name }),
      });
    } catch(e) { setPending(false); poll(); }
  };

  const startDraft = async () => {
    await fetch(`${CZF.API_BASE}/draft/start`, {
      method:'POST', headers:{'Content-Type':'application/json'},
      body: JSON.stringify({ room_id:roomId }),
    });
    poll();
  };

  const nextGame = async () => {
    await fetch(`${CZF.API_BASE}/draft/next-game`, {
      method:'POST', headers:{'Content-Type':'application/json'},
      body: JSON.stringify({ room_id:roomId }),
    });
    poll();
  };

  if (loading) return (
    <div style={{textAlign:'center',padding:'4rem',color:'var(--muted)',
      fontFamily:'var(--fc)'}}>Chargement...</div>
  );
  if (!state) return (
    <div style={{textAlign:'center',padding:'4rem',color:'#ff7070',
      fontFamily:'var(--fc)'}}>Salle introuvable.</div>
  );

  const currentStep = getCurrentStep(state);
  const isMyTurn    = currentStep?.team===myTeam && myTeam!=='spectator' && !pending;
  const usedIds     = new Set((state.actions||[]).map(a=>a.champId));
  const fearlessIds = new Set(state.fearless_pool||[]);

  const phaseColor = !currentStep ? 'var(--muted)'
    : currentStep.type==='ban' ? RED.main : BLUE.main;

  const phaseLabel = state.status==='done' ? 'DRAFT TERMINÉ'
    : state.status==='waiting' ? 'EN ATTENTE DU LANCEMENT'
    : currentStep
      ? `${(currentStep.team==='blue'?state.blueName:state.redName).toUpperCase()} — ${currentStep.type==='ban'?'BAN':'PICK'}`
      : '';

  return (
    <div style={{display:'flex',flexDirection:'column',gap:10}}>

      {/* Fearless badge */}
      {state.fearless && (
        <div style={{textAlign:'center',padding:'.3rem',background:'rgba(232,150,59,.08)',
          border:'1px solid rgba(232,150,59,.2)',borderRadius:3,
          fontFamily:'var(--fc)',fontSize:'.65rem',color:'#E8963B',letterSpacing:'.1em'}}>
          ⚡ MODE FEARLESS — Game {state.game_number||1}
          {fearlessIds.size>0&&` — ${fearlessIds.size} champion(s) verrouillé(s)`}
        </div>
      )}

      {/* Phase indicator */}
      <div style={{textAlign:'center',padding:'.55rem',borderRadius:3,
        background:currentStep?`${phaseColor}18`:'rgba(255,255,255,.04)',
        border:`1px solid ${currentStep?phaseColor+'40':'rgba(255,255,255,.1)'}`}}>
        <div style={{fontFamily:'var(--fd)',fontSize:'1.1rem',letterSpacing:'.12em',
          color:phaseColor}}>{phaseLabel}</div>
        {isMyTurn&&<div style={{fontFamily:'var(--fc)',fontSize:'.7rem',
          color:GOLD.main,marginTop:2}}>C'est ton tour !</div>}
        {pending&&<div style={{fontFamily:'var(--fc)',fontSize:'.7rem',
          color:'var(--muted)',marginTop:2}}>En cours...</div>}
      </div>

      {/* Main layout */}
      <div style={{display:'grid',gridTemplateColumns:'1fr auto 1fr',gap:10,alignItems:'start'}}>
        <TeamPanel state={state} team="blue" currentStep={currentStep}/>
        <div style={{display:'flex',flexDirection:'column',alignItems:'center',gap:6,minWidth:52,paddingTop:8}}>
          <DraftTimer seconds={timer} active={!!currentStep&&state.status==='active'}
            type={currentStep?.type}/>
          <div style={{fontFamily:'var(--fd)',fontSize:'1.2rem',letterSpacing:'.2em',
            color:'rgba(255,255,255,.12)'}}>VS</div>
          <div style={{fontFamily:'var(--fc)',fontSize:'.55rem',letterSpacing:'.1em',
            color:'var(--muted)',textAlign:'center'}}>
            {state.step<20?`${state.step}/20`:'FIN'}
          </div>
        </div>
        <TeamPanel state={state} team="red" currentStep={currentStep}/>
      </div>

      {/* Actions */}
      {state.status==='waiting' && myTeam!=='spectator' && (
        <div style={{textAlign:'center',padding:'1.2rem'}}>
          <button onClick={startDraft}
            style={{padding:'.7rem 2.5rem',background:GOLD.main,border:'none',
              borderRadius:3,fontFamily:'var(--fd)',fontSize:'1rem',letterSpacing:'.1em',
              color:'var(--paper-ink)',cursor:'pointer'}}>
            LANCER LE DRAFT
          </button>
        </div>
      )}
      {state.status==='waiting' && myTeam==='spectator' && (
        <div style={{textAlign:'center',padding:'1.5rem',color:'var(--muted)',
          fontFamily:'var(--fc)',fontSize:'.8rem'}}>
          En attente du lancement...
        </div>
      )}

      {state.status==='active' && (
        <div style={{marginTop:4}}>
          <div style={{fontFamily:'var(--fc)',fontSize:'.6rem',letterSpacing:'.12em',
            textTransform:'uppercase',color:isMyTurn?phaseColor:'var(--muted)',
            marginBottom:6,textAlign:'center',opacity:isMyTurn?1:.5}}>
            {isMyTurn
              ? `Sélectionne un champion à ${currentStep?.type==='ban'?'bannir':'picker'}`
              : 'En attente de l\'adversaire...'}
          </div>
          <ChampionGrid champs={champs} roles={roles} usedIds={usedIds}
            fearlessIds={fearlessIds} canPick={isMyTurn}
            onSelect={handleSelect} currentStep={currentStep}/>
        </div>
      )}

      {state.status==='done' && (
        <div style={{textAlign:'center',padding:'1.2rem',
          background:GOLD.dim,border:`1px solid ${GOLD.border}`,borderRadius:4}}>
          <div style={{fontFamily:'var(--fd)',fontSize:'1.4rem',letterSpacing:'.1em',
            color:GOLD.main}}>DRAFT TERMINÉ</div>
          {state.fearless && myTeam!=='spectator' && (
            <button onClick={nextGame} style={{marginTop:10,padding:'.6rem 1.5rem',
              background:'#E8963B',border:'none',borderRadius:3,cursor:'pointer',
              fontFamily:'var(--fd)',fontSize:'.85rem',letterSpacing:'.08em',
              color:'var(--paper-ink)'}}>
              ⚡ GAME SUIVANT (FEARLESS)
            </button>
          )}
        </div>
      )}

      <style>{`@keyframes pulse-slot{0%,100%{opacity:.5}50%{opacity:1}}`}</style>
    </div>
  );
};

// ── DraftPage (main) ──────────────────────────────────────────────────────────
window.DraftPage = function DraftPage() {
  const [screen,   setScreen]   = React.useState('loading');
  const [champs,   setChamps]   = React.useState([]);
  const [roles,    setRoles]    = React.useState({});
  const [roomData, setRoomData] = React.useState(null);
  const [roomId,   setRoomId]   = React.useState(null);
  const [myTeam,   setMyTeam]   = React.useState('spectator');

  React.useEffect(()=>{
    loadChampionData().then(({champs,roles})=>{
      setChamps(champs); setRoles(roles);
    }).catch(()=>{});

    const hash = window.location.hash;
    const qi   = hash.indexOf('?');
    if (qi!==-1) {
      const p = new URLSearchParams(hash.slice(qi+1));
      const r = p.get('room'), t = p.get('team')||'spectator';
      if (r) { setRoomId(r); setMyTeam(t); setScreen('room'); return; }
    }
    setScreen('menu');
  },[]);

  const handleCreated = (d) => { setRoomData(d); setScreen('links'); };
  const handleEnter   = (id,team) => { setRoomId(id); setMyTeam(team); setScreen('room'); };

  return (
    <div style={{maxWidth:1100,margin:'0 auto',padding:'1.5rem 1rem'}}>

      {/* Header */}
      <div style={{marginBottom:'1.5rem',display:'flex',alignItems:'center',gap:10}}>
        <div>
          <div style={{fontFamily:'var(--fd)',fontSize:'1.8rem',letterSpacing:'.1em',
            color:'var(--cream)',lineHeight:1}}>DRAFT CZF</div>
          <div style={{fontFamily:'var(--fc)',fontSize:'.7rem',color:'var(--muted)',marginTop:2}}>
            Outil de draft officiel — Clash des Zéros de la Faille
          </div>
        </div>
        {screen!=='menu' && screen!=='loading' && (
          <button onClick={()=>setScreen('menu')}
            style={{marginLeft:'auto',padding:'.4rem .7rem',background:'transparent',
              border:'1px solid rgba(255,255,255,.15)',borderRadius:3,cursor:'pointer',
              fontFamily:'var(--fc)',fontSize:'.72rem',color:'var(--muted)'}}>
            ← Retour
          </button>
        )}
      </div>

      {screen==='loading'&&(
        <div style={{textAlign:'center',padding:'4rem',color:'var(--muted)',
          fontFamily:'var(--fc)'}}>Chargement des champions...</div>
      )}
      {screen==='menu'&&(
        <div style={{maxWidth:400,margin:'0 auto',display:'flex',flexDirection:'column',gap:10}}>
          <div style={{textAlign:'center',fontFamily:'var(--fc)',fontSize:'.85rem',
            color:'var(--muted)',marginBottom:6}}>
            Crée ou rejoins une salle de draft pour ton match CZF.
          </div>
          <button onClick={()=>setScreen('create')}
            style={{padding:'.9rem',background:GOLD.main,border:'none',borderRadius:3,
              fontFamily:'var(--fd)',fontSize:'1rem',letterSpacing:'.1em',
              color:'var(--paper-ink)',cursor:'pointer'}}>
            ＋ CRÉER UN DRAFT
          </button>
          <div style={{textAlign:'center',fontFamily:'var(--fc)',fontSize:'.72rem',color:'var(--muted)'}}>
            ou utilise un lien partagé par un capitaine
          </div>
        </div>
      )}
      {screen==='create' && <DraftCreate onCreated={handleCreated}/>}
      {screen==='links' && roomData && <DraftLinks roomData={roomData} onEnter={handleEnter}/>}
      {screen==='room' && roomId && (
        <DraftRoom roomId={roomId} myTeam={myTeam} champs={champs} roles={roles}/>
      )}
    </div>
  );
};
