// freeBuilderView.jsx - free lineup lab for hypothetical rosters

const BUILDER_ROLE_FILTERS = ['ALL','AWP','IGL','ENT','RIF','SUP','LRK'];
const BUILDER_METRICS = [
  ['AIM','aim'], ['ENT','entry'], ['CLU','clutch'], ['UTL','util'], ['AWP','awp'], ['IGL','igl'], ['CON','cons'],
];

function builderSlug(value) {
  return String(value || '')
    .toLowerCase()
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '');
}

function builderTeamMap() {
  const map = new Map();
  (window.DRAFT_TEAMS || []).forEach(team => map.set(team.id, team));
  return map;
}

function builderAvg(players, key) {
  if (!players.length) return 0;
  return Math.round(players.reduce((sum, p) => sum + (p.s?.[key] || 0), 0) / players.length);
}

function builderRoleMetric(role) {
  return role === 'AWP' ? 'awp'
       : role === 'IGL' ? 'igl'
       : role === 'ENT' ? 'entry'
       : role === 'SUP' ? 'util'
       : role === 'LRK' ? 'clutch'
       : 'aim';
}

function builderRoleFit(players) {
  if (!players.length) return 0;
  return Math.round(players.reduce((sum, p) => sum + (p.s?.[builderRoleMetric(p.role)] || 0), 0) / players.length);
}

function builderCounts(players, key) {
  const counts = {};
  players.forEach(p => { counts[p[key]] = (counts[p[key]] || 0) + 1; });
  return Object.entries(counts).sort((a, b) => b[1] - a[1]);
}

function builderProfile(players) {
  const roleCounts = {};
  const slotCounts = {};
  players.forEach(p => {
    roleCounts[p.role] = (roleCounts[p.role] || 0) + 1;
    const slot = window.getLineSlot(p);
    slotCounts[slot] = (slotCounts[slot] || 0) + 1;
  });
  const line = window.getLineBreakdown(players);
  return {
    overall: line.strength,
    firepower: builderAvg(players, 'aim'),
    utility: Math.round((builderAvg(players, 'util') + builderAvg(players, 'igl')) / 2),
    clutch: builderAvg(players, 'clutch'),
    consistency: builderAvg(players, 'cons'),
    awp: builderAvg(players, 'awp'),
    roleFit: builderRoleFit(players),
    roleCounts,
    slotCounts,
    missing: line.missingSlots,
    duplicated: line.duplicateSlots,
    line,
  };
}

function FreeBuilderView({ teamName = 'Meu Time', defaultMatchFormat = 'MR16', onComplete }) {
  const isMobile = window.useIsMobileView?.(820) || false;
  const [query, setQuery] = React.useState('');
  const [roleFilter, setRoleFilter] = React.useState('ALL');
  const [selected, setSelected] = React.useState([]);
  const [matchFormat, setMatchFormat] = React.useState(defaultMatchFormat || 'MR16');
  const [focusedPlayerId, setFocusedPlayerId] = React.useState(null);

  const teamMap = React.useMemo(() => builderTeamMap(), []);
  const selectedIds = React.useMemo(() => new Set(selected.map(p => p.id)), [selected]);
  const selectedNames = React.useMemo(() => new Set(selected.map(p => builderSlug(p.name))), [selected]);
  const selectedProfile = React.useMemo(() => builderProfile(selected), [selected]);
  const formats = Object.values(window.MATCH_FORMATS || {});

  const playerRows = React.useMemo(() => {
    return (window.PLAYERS || []).map(player => {
      const team = teamMap.get(player.team);
      const haystack = builderSlug([
        player.name, player.role, player.era, player.country,
        team?.name, team?.year, team?.achievement, team?.region,
      ].filter(Boolean).join(' '));
      return { player, team, haystack };
    });
  }, [teamMap]);

  const filteredPlayers = React.useMemo(() => {
    const q = builderSlug(query.trim());
    return playerRows
      .filter(row => roleFilter === 'ALL' || row.player.role === roleFilter)
      .filter(row => !q || row.haystack.includes(q))
      .sort((a, b) => {
        const aSelected = selectedIds.has(a.player.id) ? 1 : 0;
        const bSelected = selectedIds.has(b.player.id) ? 1 : 0;
        if (aSelected !== bSelected) return bSelected - aSelected;
        return b.player.overall - a.player.overall;
      })
      .slice(0, query.trim() ? 60 : 36);
  }, [playerRows, query, roleFilter, selectedIds]);

  function togglePlayer(player) {
    if (selectedIds.has(player.id)) {
      setSelected(list => list.filter(p => p.id !== player.id));
      return;
    }
    if (selectedNames.has(builderSlug(player.name))) return;
    if (selected.length >= 5) return;
    setSelected(list => [...list, player]);
    setFocusedPlayerId(player.id);
    window.setTimeout(() => setFocusedPlayerId(null), 520);
  }

  const canStart = selected.length === 5;
  const missingCore = selectedProfile.missing.length ? selectedProfile.missing.join(' / ') : 'estrutura completa';
  function handleStartMajor() {
    if (!canStart) return;
    onComplete(selected, matchFormat);
  }

  return (
    <main style={{ maxWidth:1220, margin:'0 auto', padding:isMobile ? '14px 14px 38px' : '22px 24px 56px' }}>
      <div className="mobile-rise" style={{ display:'flex', flexDirection:isMobile ? 'column' : 'row',
        justifyContent:'space-between', alignItems:isMobile ? 'stretch' : 'flex-end',
        gap:16, marginBottom:16 }}>
        <div>
          <h2 style={{ fontFamily:'var(--font-cond)', fontSize:isMobile ? 24 : 29, fontWeight:900,
            color:'var(--text-1)', letterSpacing:'0.055em', textTransform:'uppercase',
            marginBottom:5, lineHeight:1 }}>
            Laboratório de Lineup
          </h2>
          <p style={{ color:'var(--text-3)', fontSize:12, maxWidth:620, lineHeight:1.45 }}>
            Monte qualquer combinação de jogadores para testar cenários hipotéticos no mesmo Major.
          </p>
        </div>
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:6,
          padding:4, background:'var(--bg-2)', border:'1px solid var(--border-2)',
          borderRadius:'var(--r-lg)', width:isMobile ? '100%' : 286 }}>
          {formats.map(fmt => {
            const active = matchFormat === fmt.id;
            return (
              <button key={fmt.id} data-sound="option" onClick={() => setMatchFormat(fmt.id)}
                style={{ padding:'8px 10px', borderRadius:'var(--r-md)',
                  border:`1px solid ${active ? 'rgba(244,165,35,0.36)' : 'transparent'}`,
                  background:active ? 'rgba(244,165,35,0.12)' : 'transparent',
                  color:active ? 'var(--accent)' : 'var(--text-2)', cursor:'pointer',
                  fontFamily:'var(--font-cond)', fontSize:12, fontWeight:900,
                  letterSpacing:'0.1em', textTransform:'uppercase' }}>
                {fmt.label} <span style={{ color:'var(--text-3)', fontFamily:'var(--font-mono)', fontSize:10 }}>{fmt.perfectScore}</span>
              </button>
            );
          })}
        </div>
      </div>

      <div style={{ display:'grid', gridTemplateColumns:isMobile ? '1fr' : '380px minmax(0,1fr)',
        gap:14, alignItems:'start' }}>
        <BuilderSelectedPanel
          teamName={teamName}
          selected={selected}
          profile={selectedProfile}
          canStart={canStart}
          missingCore={missingCore}
          matchFormat={matchFormat}
          onRemove={player => togglePlayer(player)}
          onStart={handleStartMajor}
        />

        <section className="mobile-rise" style={{ background:'var(--bg-2)',
          border:'1px solid var(--border-2)', borderRadius:'var(--r-lg)', overflow:'hidden' }}>
          <div style={{ padding:isMobile ? '13px' : '15px 16px',
            background:'var(--bg-3)', borderBottom:'1px solid var(--border-1)' }}>
            <div style={{ display:'grid', gridTemplateColumns:isMobile ? '1fr' : 'minmax(0,1fr) auto',
              gap:10, alignItems:'center' }}>
              <div style={{ position:'relative' }}>
                <input
                  value={query}
                  onChange={e => setQuery(e.target.value)}
                  placeholder="Buscar jogador, time, ano ou país"
                  style={{ width:'100%', height:44, boxSizing:'border-box',
                    background:'var(--bg-1)', border:'1px solid var(--border-2)',
                    borderRadius:'var(--r-md)', color:'var(--text-1)', outline:'none',
                    padding:'0 42px 0 14px', fontFamily:'var(--font-cond)',
                    fontSize:16, fontWeight:800, letterSpacing:'0.02em' }}
                />
                <span style={{ position:'absolute', right:13, top:'50%', transform:'translateY(-50%)',
                  color:'var(--text-3)', fontFamily:'var(--font-mono)', fontSize:16 }}>
                  /
                </span>
              </div>
              <div className={isMobile ? 'touch-scroll' : undefined}
                style={{ display:'flex', gap:6, maxWidth:'100%' }}>
                {BUILDER_ROLE_FILTERS.map(role => {
                  const active = roleFilter === role;
                  return (
                    <button key={role} data-sound="option" onClick={() => setRoleFilter(role)}
                      style={{ padding:'8px 10px', minWidth:role === 'ALL' ? 68 : 50,
                        background:active ? 'rgba(244,165,35,0.12)' : 'var(--bg-2)',
                        border:`1px solid ${active ? 'rgba(244,165,35,0.36)' : 'var(--border-2)'}`,
                        borderRadius:'var(--r-md)', cursor:'pointer',
                        color:active ? 'var(--accent)' : 'var(--text-2)',
                        fontFamily:'var(--font-cond)', fontSize:10, fontWeight:900,
                        letterSpacing:'0.1em', textTransform:'uppercase',
                        flexShrink:0 }}>
                      {role === 'ALL' ? 'Todos' : role}
                    </button>
                  );
                })}
              </div>
            </div>
            <div style={{ display:'flex', justifyContent:'space-between', gap:12,
              marginTop:10, color:'var(--text-3)', fontSize:11 }}>
              <span>{filteredPlayers.length} resultados exibidos</span>
              <span>{selected.length}/5 selecionados</span>
            </div>
          </div>

          <div style={{ padding:isMobile ? 10 : 12,
            display:'grid', gridTemplateColumns:isMobile ? '1fr' : 'repeat(2,minmax(0,1fr))',
            gap:8 }}>
            {filteredPlayers.map(({ player, team }, i) => (
              <BuilderPlayerCard
                key={player.id}
                player={player}
                team={team}
                selected={selectedIds.has(player.id)}
                duplicateName={!selectedIds.has(player.id) && selectedNames.has(builderSlug(player.name))}
                disabled={!selectedIds.has(player.id) && (selected.length >= 5 || selectedNames.has(builderSlug(player.name)))}
                focused={focusedPlayerId === player.id}
                delay={i * 18}
                onToggle={() => togglePlayer(player)}
              />
            ))}
          </div>
        </section>
      </div>
    </main>
  );
}

function BuilderSelectedPanel({ teamName, selected, profile, canStart, missingCore, matchFormat, onRemove, onStart }) {
  const isMobile = window.useIsMobileView?.(820) || false;
  const countries = builderCounts(selected, 'country');
  const eras = builderCounts(selected, 'era');
  return (
    <aside className="mobile-rise" style={{ position:isMobile ? 'static' : 'sticky', top:76,
      background:'var(--bg-2)', border:'1px solid var(--border-2)',
      borderRadius:'var(--r-lg)', overflow:'hidden' }}>
      <div style={{ padding:'15px 16px', background:'linear-gradient(90deg, rgba(244,165,35,0.09), var(--bg-3))',
        borderBottom:'1px solid var(--border-1)' }}>
        <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:12 }}>
          <div style={{ minWidth:0 }}>
            <div style={{ fontFamily:'var(--font-cond)', fontSize:10, fontWeight:900,
              color:'var(--text-3)', letterSpacing:'0.14em', textTransform:'uppercase' }}>
              Seu time
            </div>
            <div style={{ fontFamily:'var(--font-cond)', fontSize:22, fontWeight:900,
              color:'var(--text-1)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
              {teamName || 'Meu Time'}
            </div>
          </div>
          <div style={{ textAlign:'right' }}>
            <div style={{ fontFamily:'var(--font-mono)', fontSize:32, fontWeight:900,
              color:canStart ? 'var(--accent)' : 'var(--text-3)', lineHeight:0.95 }}>
              {canStart ? profile.overall : '--'}
            </div>
            <div style={{ fontFamily:'var(--font-cond)', fontSize:9, color:'var(--text-3)',
              letterSpacing:'0.12em', textTransform:'uppercase' }}>
              overall
            </div>
          </div>
        </div>
      </div>

      <div style={{ padding:'12px 14px', display:'grid', gap:8 }}>
        {[0,1,2,3,4].map(index => {
          const player = selected[index];
          return player ? (
            <button key={player.id} onClick={() => onRemove(player)}
              style={{ display:'grid', gridTemplateColumns:'auto minmax(0,1fr) auto',
                alignItems:'center', gap:8, width:'100%', textAlign:'left',
                padding:'9px 10px', background:'var(--bg-3)',
                border:'1px solid var(--border-2)', borderRadius:'var(--r-md)',
                cursor:'pointer', color:'var(--text-1)' }}>
              <window.RoleBadge role={player.role} />
              <span style={{ display:'flex', alignItems:'center', gap:6, minWidth:0 }}>
                <window.Flag value={player.country} size={14} />
                <span style={{ fontFamily:'var(--font-cond)', fontSize:15, fontWeight:900,
                  whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
                  {player.name}
                </span>
              </span>
              <span style={{ fontFamily:'var(--font-mono)', fontSize:17, color:'var(--accent)', fontWeight:900 }}>
                {player.overall}
              </span>
            </button>
          ) : (
            <div key={index} style={{ height:40, display:'flex', alignItems:'center',
              padding:'0 10px', background:'var(--bg-1)', border:'1px dashed var(--border-2)',
              borderRadius:'var(--r-md)', color:'var(--text-3)', fontFamily:'var(--font-cond)',
              fontSize:11, fontWeight:800, letterSpacing:'0.12em', textTransform:'uppercase' }}>
              Slot livre
            </div>
          );
        })}
      </div>

      <div style={{ padding:'0 14px 14px' }}>
        <window.SectionLabel label="Leitura da lineup" />
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:6, marginBottom:10 }}>
          <BuilderMiniMetric label="Firepower" value={profile.firepower} />
          <BuilderMiniMetric label="Encaixe" value={profile.roleFit} />
          <BuilderMiniMetric label="Util/IGL" value={profile.utility} />
          <BuilderMiniMetric label="Clutch" value={profile.clutch} />
        </div>
        <div style={{ display:'flex', flexWrap:'wrap', gap:5, marginBottom:10 }}>
          {countries.slice(0, 4).map(([country, count]) => (
            <span key={country} style={{ display:'inline-flex', alignItems:'center', gap:5,
              padding:'3px 7px', background:'var(--bg-3)', border:'1px solid var(--border-2)',
              borderRadius:'var(--r-sm)', fontSize:10, color:'var(--text-2)' }}>
              <window.Flag value={country} size={12} /> x{count}
            </span>
          ))}
          {eras.slice(0, 3).map(([era, count]) => (
            <span key={era} style={{ padding:'3px 7px', background:'var(--bg-3)',
              border:'1px solid var(--border-2)', borderRadius:'var(--r-sm)',
              fontFamily:'var(--font-cond)', fontSize:9, fontWeight:900,
              color:'var(--text-3)', letterSpacing:'0.07em' }}>
              {era} x{count}
            </span>
          ))}
        </div>
        <p style={{ margin:0, color:'var(--text-3)', fontSize:11, lineHeight:1.45 }}>
          Força da line ajusta a base individual por slots, estrutura, química e limite de estrelas.
          Slots: <span style={{ color:profile.missing.length ? '#e07575' : '#67d878' }}>{missingCore}</span>.
          {profile.duplicated.length ? ` Slots repetidos: ${profile.duplicated.join(', ')}.` : ''}
        </p>
      </div>

      <div style={{ padding:'12px 14px 14px', borderTop:'1px solid var(--border-1)',
        background:'var(--bg-3)' }}>
        <button disabled={!canStart} data-sound="major" onClick={onStart}
          style={{ width:'100%', height:50, border:'none', borderRadius:'var(--r-md)',
            background:canStart ? 'var(--accent)' : 'var(--bg-5)',
            color:canStart ? '#15110a' : 'var(--text-3)', cursor:canStart ? 'pointer' : 'not-allowed',
            fontFamily:'var(--font-cond)', fontSize:14, fontWeight:900,
            letterSpacing:'0.13em', textTransform:'uppercase',
            transition:'transform 140ms ease, box-shadow 180ms ease' }}>
          {canStart ? `Iniciar Major - ${matchFormat}` : `Escolha ${5 - selected.length} jogador(es)`}
        </button>
      </div>
    </aside>
  );
}

function BuilderMiniMetric({ label, value }) {
  const color = value >= 90 ? 'var(--accent)' : value >= 82 ? '#8a9cb4' : 'var(--text-3)';
  return (
    <div style={{ padding:'8px 9px', background:'var(--bg-3)', border:'1px solid var(--border-2)',
      borderRadius:'var(--r-md)' }}>
      <div style={{ display:'flex', justifyContent:'space-between', alignItems:'baseline', gap:8,
        marginBottom:5 }}>
        <span style={{ fontFamily:'var(--font-cond)', fontSize:9, fontWeight:900,
          color:'var(--text-3)', letterSpacing:'0.08em', textTransform:'uppercase' }}>
          {label}
        </span>
        <span style={{ fontFamily:'var(--font-mono)', fontSize:14, fontWeight:900, color }}>
          {value || '--'}
        </span>
      </div>
      <div style={{ height:3, background:'var(--bg-5)', borderRadius:3, overflow:'hidden' }}>
        <div style={{ width:`${Math.max(0, Math.min(100, value || 0))}%`, height:'100%',
          background:color, borderRadius:3, transition:'width 260ms ease' }} />
      </div>
    </div>
  );
}

function BuilderPlayerCard({ player, team, selected, duplicateName = false, disabled, focused, delay, onToggle }) {
  const [hover, setHover] = React.useState(false);
  const tier = window.TIER_META[player.tier] || window.TIER_META.GN;
  const active = selected || hover;
  const border = selected ? 'rgba(244,165,35,0.55)' : active ? `${tier.color}88` : 'var(--border-2)';
  return (
    <article className={focused ? 'mobile-pulse' : 'mobile-rise'}
      style={{ animationDelay:`${Math.min(delay, 360)}ms`,
        background:selected ? 'rgba(244,165,35,0.07)' : 'var(--bg-3)',
        border:`1px solid ${border}`, borderRadius:'var(--r-lg)',
        overflow:'hidden', opacity:disabled ? 0.45 : 1,
        transition:'transform 150ms ease, border-color 150ms ease, background 150ms ease',
        transform:hover && !disabled ? 'translateY(-2px)' : 'none' }}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}>
      <button disabled={disabled && !selected} data-sound={selected ? 'click' : 'pick'} onClick={onToggle}
        style={{ all:'unset', display:'block', width:'100%', cursor:disabled && !selected ? 'not-allowed' : 'pointer' }}>
        <div style={{ height:3, background:selected ? 'var(--accent)' : tier.color, opacity:selected ? 1 : 0.72 }} />
        <div style={{ padding:'11px 12px' }}>
          <div style={{ display:'grid', gridTemplateColumns:'auto minmax(0,1fr) auto',
            gap:9, alignItems:'start', marginBottom:8 }}>
            <span style={{ fontFamily:'var(--font-mono)', fontSize:25, fontWeight:900,
              color:selected ? 'var(--accent)' : tier.color, lineHeight:0.95 }}>
              {player.overall}
            </span>
            <div style={{ minWidth:0 }}>
              <div style={{ display:'flex', alignItems:'center', gap:6, minWidth:0 }}>
                <window.Flag value={player.country} size={15} />
                <span style={{ fontFamily:'var(--font-cond)', fontSize:17, fontWeight:900,
                  color:'var(--text-1)', whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
                  {player.name}
                </span>
              </div>
              <div style={{ color:'var(--text-3)', fontSize:10, marginTop:2,
                whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>
                {team ? `${team.name} ${team.year}` : player.team} - {player.era}
              </div>
            </div>
            <div style={{ display:'flex', flexDirection:'column', alignItems:'flex-end', gap:4 }}>
              <window.RoleBadge role={player.role} />
              <window.TierBadge tier={player.tier} short />
            </div>
          </div>

          <div style={{ display:'grid', gridTemplateColumns:'repeat(7,1fr)', gap:4, marginBottom:8 }}>
            {BUILDER_METRICS.map(([label, key]) => {
              const value = player.s?.[key] || 0;
              const color = value >= 90 ? 'var(--accent)' : value >= 82 ? '#8a9cb4' : 'var(--text-3)';
              return (
                <div key={key} style={{ minWidth:0 }}>
                  <div style={{ fontFamily:'var(--font-cond)', fontSize:8, fontWeight:900,
                    color:'var(--text-3)', letterSpacing:'0.03em', textAlign:'center' }}>
                    {label}
                  </div>
                  <div style={{ fontFamily:'var(--font-mono)', fontSize:10, fontWeight:900,
                    color, textAlign:'center' }}>
                    {value}
                  </div>
                </div>
              );
            })}
          </div>

          <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:8 }}>
            <span style={{ fontFamily:'var(--font-cond)', fontSize:10, fontWeight:900,
              color:'var(--text-3)', letterSpacing:'0.08em', textTransform:'uppercase',
              overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>
              {team?.achievement || 'Lineup historica'}
            </span>
            <span style={{ padding:'6px 9px', borderRadius:'var(--r-md)',
              background:selected ? 'rgba(244,165,35,0.14)' : hover && !disabled ? 'var(--accent)' : 'var(--bg-4)',
              color:selected ? 'var(--accent)' : hover && !disabled ? '#15110a' : 'var(--text-2)',
              border:`1px solid ${selected ? 'rgba(244,165,35,0.28)' : 'var(--border-2)'}`,
              fontFamily:'var(--font-cond)', fontSize:10, fontWeight:900,
              letterSpacing:'0.1em', textTransform:'uppercase',
              whiteSpace:'nowrap', transition:'all 140ms ease' }}>
              {selected ? 'Remover' : duplicateName ? 'Já escolhido' : disabled ? 'Line cheia' : 'Adicionar'}
            </span>
          </div>
        </div>
      </button>
    </article>
  );
}

window.FreeBuilderView = FreeBuilderView;
