/* eslint-disable */
// ─────────────────────────────────────────────────────────────
// searchgg · 서든어택 전적검색 — 더미 데이터 (서든어택 세계관 기반)
// 군대 계급, 폭파미션/생존전/클랜전, 한국식 FPS 닉/맵
// window.SA 로 노출
// ─────────────────────────────────────────────────────────────

// 군대 계급(랭크) 사다리 — 서든어택 특유의 '계급' 시스템
const RANKS = {
  이병:   { name: '이병',  group: '사병',   tier: 1,  color: '#737d8a', pips: 1, shape: 'bar' },
  일병:   { name: '일병',  group: '사병',   tier: 2,  color: '#6b7682', pips: 2, shape: 'bar' },
  상병:   { name: '상병',  group: '사병',   tier: 3,  color: '#5e6975', pips: 3, shape: 'bar' },
  병장:   { name: '병장',  group: '사병',   tier: 4,  color: '#525c68', pips: 4, shape: 'bar' },
  하사:   { name: '하사',  group: '부사관', tier: 5,  color: '#b3712b', pips: 1, shape: 'chev' },
  중사:   { name: '중사',  group: '부사관', tier: 6,  color: '#ac6c28', pips: 2, shape: 'chev' },
  상사:   { name: '상사',  group: '부사관', tier: 7,  color: '#a56625', pips: 3, shape: 'chev' },
  원사:   { name: '원사',  group: '부사관', tier: 8,  color: '#9e6022', pips: 4, shape: 'chev' },
  준위:   { name: '준위',  group: '준사관', tier: 9,  color: '#566f8e', pips: 1, shape: 'dia' },
  소위:   { name: '소위',  group: '위관',   tier: 10, color: '#4f6b8a', pips: 1, shape: 'dia' },
  중위:   { name: '중위',  group: '위관',   tier: 11, color: '#486485', pips: 2, shape: 'dia' },
  대위:   { name: '대위',  group: '위관',   tier: 12, color: '#415d7e', pips: 3, shape: 'dia' },
  소령:   { name: '소령',  group: '영관',   tier: 13, color: '#c0901a', pips: 1, shape: 'flower' },
  중령:   { name: '중령',  group: '영관',   tier: 14, color: '#b78812', pips: 2, shape: 'flower' },
  대령:   { name: '대령',  group: '영관',   tier: 15, color: '#ad800c', pips: 3, shape: 'flower' },
  준장:   { name: '준장',  group: '장성',   tier: 16, color: '#9c7b1e', pips: 1, shape: 'star' },
  소장:   { name: '소장',  group: '장성',   tier: 17, color: '#937319', pips: 2, shape: 'star' },
  중장:   { name: '중장',  group: '장성',   tier: 18, color: '#8a6c16', pips: 3, shape: 'star' },
  대장:   { name: '대장',  group: '장성',   tier: 19, color: '#7d6111', pips: 4, shape: 'star' },
};

const MAPS = ['제3보급창고', '웨어하우스', '데드폴', '웨스트게이트', '가스폭발', '6th 어벤터', '컨테이너시티', '욕망의 항구', '라스트포트', '폐건물', '지하철', '눈보라 기지', '국경지대', '폐쇄병동', '사막의 폭풍', '시가지', '비밀연구소', '공장지대', '항구창고', '폭우의 거리'];
function r(n) { return Math.floor(Math.random() * n); }
function pick(a) { return a[r(a.length)]; }
function pad(n) { return n < 10 ? '0' + n : '' + n; }

// 닉네임 풀 (매치 팀 로스터용)
const NICK_POOL = ['독수리오형제', '한밤의저격수', '돌격대장', '연사의신', '헤드샷마스터', '클러치킹', '무한리필', 'рато', '광속에임', '벽뚫는소리', '근접의달인', '플래시뱅', '노스코프', '스팀팩', '리코일제로', '원피스원킬', '소음기장착', '전장의지배자', '마지막총알', '검은표범', '강철멘탈', '불꽃튀는키보드', '야시경', '폭파전문가', '리스폰지옥', '엄폐엄폐', '각잡고대기', '스나는예술', '돌진또돌진', '침착한손'];

// 매치 팀 로스터 생성기
function genRoster(meName, mePos, ownerStats, ownerRank) {
  const used = new Set([meName]);
  const mk = (isOwner) => {
    let name;
    if (isOwner) name = meName;
    else { do { name = pick(NICK_POOL); } while (used.has(name)); used.add(name); }
    const k = isOwner ? ownerStats.k : 4 + r(26);
    const d = isOwner ? ownerStats.d : 5 + r(17);
    const a = isOwner ? ownerStats.a : 2 + r(12);
    const rank = isOwner && ownerRank ? ownerRank : pick(RANK_LIST);
    return { name, isOwner, rank, k, d, a, hs: 14 + r(48), dmg: 1800 + r(5200) };
  };
  const blue = [], red = [];
  for (let i = 0; i < 5; i++) blue.push(mk(mePos === 'blue' && i === 0));
  for (let i = 0; i < 5; i++) red.push(mk(mePos === 'red' && i === 0));
  const sortFn = (a, b) => b.k - a.k;
  return { blue: blue.sort(sortFn), red: red.sort(sortFn) };
}

// 최근 매치 생성기
function genMatches(count, base, ownerName, ownerRank) {
  const out = [];
  const meName = ownerName || '나';
  for (let i = 0; i < count; i++) {
    const mode = pick(['클랜전', '솔로 랭크전', '파티 랭크전', '클랜 랭크전', '토너먼트']);
    const win = Math.random() < (base ? base.wr / 100 : 0.55);
    const k = 8 + r(28);
    const d = 6 + r(18);
    const a = 3 + r(12);
    const hours = i === 0 ? 0 : Math.floor(Math.random() * (i * 5) + i);
    const winSide = pick(['blue', 'red']);
    const mePos = win ? winSide : (winSide === 'blue' ? 'red' : 'blue');
    out.push({
      mode,
      map: pick(MAPS),
      win, k, d, a,
      teams: genRoster(meName, mePos, { k, d, a }, ownerRank),
      mePos, winSide,
      ago: hours === 0 ? '방금 전' : hours < 24 ? `${hours}시간 전` : `${Math.floor(hours / 24)}일 전`,
    });
  }
  return out;
}

// ── 프로필 확장 전적 생성기 ──
const TIERS_DESC = ['하이랭커', '랭커', '챌린저', '그랜드마스터', '마스터', '골드', '실버', '브론즈'];
const CLAN_POOL = [['서울제일', 'SEL'], ['불곰부대', 'BEAR'], ['야간전투', 'NGT'], ['한강수비대', 'HAN'], ['벚꽃클랜', 'SAK'], ['강철군화', 'STL'], ['백호부대', 'WHT']];
const RANK_LIST = Object.values(RANKS).sort((a, b) => a.tier - b.tier);
function clamp(lo, hi, v) { return Math.max(lo, Math.min(hi, Math.round(v))); }
function rankStep(rank, d) { const t = Math.max(1, Math.min(RANK_LIST.length, rank.tier + d)); return RANK_LIST.find((x) => x.tier === t) || rank; }
function tierByWr(wr, idx) { const i = Math.max(0, Math.min(7, Math.floor((78 - wr) / 4) + idx)); return TIERS_DESC[i]; }
function recBase(wrIn) {
  const wr = clamp(38, 80, wrIn);
  const mt = 60 + r(260);
  const w = Math.round(mt * wr / 100);
  return { matches: mt, w, l: mt - w, wr, kd: clamp(48, 80, wr + r(10) - 4), hs: 24 + r(34) };
}
function genClanPeriods(isCurrent) {
  const n = 1 + r(2); // 1~3회 가입
  const periods = [];
  let year = 2023 + r(2);
  let mon = 1 + r(11);
  for (let i = 0; i < n; i++) {
    const dur = 2 + r(11);
    const from = `${year}.${pad(mon)}`;
    let em = mon + dur, ey = year + Math.floor((em - 1) / 12); em = ((em - 1) % 12) + 1;
    const last = i === n - 1;
    periods.push({ from, to: (last && isCurrent) ? '활동 중' : `${ey}.${pad(em)}`, months: dur });
    year = ey; mon = em + 1 + r(6); if (mon > 12) { year += 1; mon -= 12; }
  }
  return periods;
}
function genClanRecords(o) {
  const out = []; const seen = new Set();
  if (o.clan) { out.push({ clan: o.clan, tag: o.clanTag, ...recBase(o.wr), periods: genClanPeriods(true) }); seen.add(o.clan); }
  const pool = CLAN_POOL.filter((c) => !seen.has(c[0]));
  const n = 2 + r(3);
  for (let i = 0; i < n && i < pool.length; i++) out.push({ clan: pool[i][0], tag: pool[i][1], ...recBase(o.wr - 3 - r(8)), periods: genClanPeriods(false) });
  return out;
}
function rankedRec(wrIn, tier) {
  const apex = tier === '하이랭커';
  return { tier, div: apex ? null : (1 + r(4)), points: apex ? (2200 + r(2600)) : (300 + r(1600)), ...recBase(wrIn) };
}
function genRankedSeasons(o) {
  const seasons = ['2026 시즌2', '2026 시즌1', '2025 시즌4', '2025 시즌3', '2025 시즌2', '2025 시즌1'];
  return seasons.map((s, idx) => ({
    season: s,
    solo: rankedRec(o.wr - idx * 2, tierByWr(o.wr, idx)),
    party: rankedRec(o.wr - 3 - idx * 2, tierByWr(o.wr - 2, idx)),
  }));
}
function genMapRecords(o) {
  return MAPS.map((name) => ({ name, ...recBase(o.wr + r(10) - 5) })).sort((a, b) => b.matches - a.matches);
}
function genModeRecords(o) {
  return [
    { name: '솔로 랭크전', ...recBase(o.wr) },
    { name: '파티 랭크전', ...recBase(o.wr - 3) },
    { name: '클랜전', ...recBase(o.wr - 1) },
    { name: '일반전', ...recBase(o.wr - 2 + r(6)) },
  ];
}

function genTrend(o) {
  const baseWr = clamp(38, 80, o.wr);
  const baseKd = Math.round((o.kda / (o.kda + 1)) * 100);
  const series = (n, labeler, vol) => {
    const out = [];
    let wr = baseWr - 4 + r(8), kd = baseKd - 4 + r(8);
    for (let i = n - 1; i >= 0; i--) {
      wr = clamp(30, 88, wr + (r(2 * vol + 1) - vol));
      kd = clamp(30, 85, kd + (r(2 * vol + 1) - vol));
      out.push({ label: labeler(i), wr, kd, games: 6 + r(22) });
    }
    return out;
  };
  return {
    daily: series(14, (i) => `${i === 0 ? '오늘' : i + '일 전'}`, 5),
    weekly: series(10, (i) => `${i === 0 ? '이번주' : i + '주 전'}`, 4),
  };
}

function mkPlayer(o) {
  const rank = RANKS[o.rank];
  const games = o.games || (3000 + r(9000));
  const wins = Math.round(games * (o.wr / 100));
  const m = genMatches(14, { wr: o.wr }, o.name, rank);
  const rifle = 50 + r(22);
  const sniper = Math.round((100 - rifle) * (0.45 + Math.random() * 0.35));
  const special = Math.max(0, 100 - rifle - sniper);
  return {
    id: o.name,
    name: o.name,
    rank,
    level: o.level || (40 + r(160)),
    clan: o.clan || null,
    clanTag: o.clanTag || null,
    wr: o.wr,
    kda: o.kda,
    hs: o.hs,            // 헤드샷 %
    rifle, sniper, special,                                  // 무기 분류별 킬 비중 %
    rankNoTotal: Math.max(1, Math.round((4.3 - o.kda) * 4200) + r(600)),       // 통합 랭킹(위)
    rankNoSeason: Math.max(1, Math.round((4.3 - o.kda) * 4200 * (0.7 + Math.random() * 0.8)) + r(500)), // 시즌 랭킹(위)
    manner: 80 + r(18),                                      // 매너 점수
    connRate: 52 + r(46),                                    // 접속률 %
    rankTotal: rank,                                         // 통합 계급(피크)
    rankSeason: rankStep(rank, -1),                          // 이번 시즌 계급
    clanRecords: genClanRecords(o),                          // 소속 클랜별 클랜전 전적
    rankedSeasons: genRankedSeasons(o),                      // 시즌별 랭크전(솔로/파티)
    mapRecords: genMapRecords(o),                            // 맵별 전적
    modeRecords: genModeRecords(o),                          // 모드별 전적
    games,
    wins,
    losses: games - wins,
    matches: m,
    together: (() => { const g = 12 + r(180); const w = Math.round(g * (o.wr / 100)); return { games: g, w, l: g - w }; })(),
    trend: genTrend(o),
    color: rank.color,
  };
}

// ── 로그인 유저(나) ──
const me = mkPlayer({
  name: '헤드샷장인', rank: '소령', level: 187, wr: 61, kda: 2.14, hs: 47,
  clan: '불곰부대', clanTag: 'BEAR', games: 8420,
});

// ── 솔로랭크 TOP ──
const soloRanking = [
  mkPlayer({ name: 'GLOCK_여신', rank: '대장', level: 240, wr: 73, kda: 3.42, hs: 58, clan: '서울제일', clanTag: 'SEL', games: 14200, badge: '챔피언' }),
  mkPlayer({ name: '서든황제김씨', rank: '중장', level: 233, wr: 70, kda: 3.08, hs: 54, clan: '불곰부대', clanTag: 'BEAR', games: 13100 }),
  mkPlayer({ name: '컨테이너지박령', rank: '소장', level: 221, wr: 68, kda: 2.91, hs: 61, clan: '야간전투', clanTag: 'NGT', games: 11890 }),
  mkPlayer({ name: '원킬원샷', rank: '준장', level: 215, wr: 66, kda: 2.77, hs: 63, clan: null, games: 10400 }),
  mkPlayer({ name: '데드폴터줏대', rank: '대령', level: 208, wr: 64, kda: 2.55, hs: 49, clan: '한강수비대', clanTag: 'HAN', games: 9870 }),
  mkPlayer({ name: '도라에몽핵아님', rank: '중령', level: 199, wr: 63, kda: 2.48, hs: 52, clan: null, games: 9210 }),
  mkPlayer({ name: '오로라공주', rank: '소령', level: 191, wr: 62, kda: 2.31, hs: 45, clan: '벚꽃클랜', clanTag: 'SAK', games: 8650 }),
  mkPlayer({ name: '연막탄장인', rank: '대위', level: 178, wr: 60, kda: 2.22, hs: 41, clan: null, games: 7980 }),
];

// ── 생존전 랭킹 ──
const survRanking = [
  mkPlayer({ name: '최후의1인', rank: '대장', level: 238, wr: 41, kda: 4.10, hs: 50, clan: '서울제일', clanTag: 'SEL', games: 6200, badge: '생존왕' }),
  mkPlayer({ name: '자기장보다빠름', rank: '중장', level: 226, wr: 38, kda: 3.71, hs: 47, clan: null, games: 5840 }),
  mkPlayer({ name: '낙하산명사수', rank: '소장', level: 219, wr: 36, kda: 3.40, hs: 44, clan: '야간전투', clanTag: 'NGT', games: 5510 }),
  mkPlayer({ name: '엄폐의달인', rank: '준장', level: 210, wr: 34, kda: 3.12, hs: 39, clan: null, games: 5120 }),
  mkPlayer({ name: '캠핑은매너', rank: '대령', level: 203, wr: 32, kda: 2.95, hs: 42, clan: '한강수비대', clanTag: 'HAN', games: 4790 }),
  mkPlayer({ name: '막판뒤집기', rank: '중령', level: 196, wr: 31, kda: 2.80, hs: 38, clan: null, games: 4510 }),
  mkPlayer({ name: '보급상자요정', rank: '소령', level: 188, wr: 30, kda: 2.66, hs: 36, clan: '벚꽃클랜', clanTag: 'SAK', games: 4230 }),
  mkPlayer({ name: '치킨한마리', rank: '대위', level: 175, wr: 29, kda: 2.51, hs: 35, clan: null, games: 3980 }),
];

// ── 클랜 랭킹 ──
// ── 최근 검색한 유저(빠른 재검색) ──
const recentSearches = ['GLOCK_여신', '서든황제김씨', '원킬원샷', '오로라공주', '최후의1인', '연막탄장인'];

// ── 인기 검색 랭킹(가장 많이 조회된 유저 · 24시간) ──
const searchTrending = [
  { name: 'GLOCK_여신',      count: 18420, move: 0 },
  { name: '최후의1인',       count: 15330, move: 2 },
  { name: '헤드샷장인',      count: 12870, move: -1 },
  { name: '서든황제김씨',     count: 11240, move: 'new' },
  { name: '원킬원샷',        count: 9680,  move: 1 },
  { name: '오로라공주',      count: 8210,  move: -2 },
  { name: '컨테이너지박령',   count: 7050,  move: 'new' },
  { name: '연막탄장인',      count: 6320,  move: 3 },
];

// ── 즐겨찾기(친구/전우) ──
const friends = [
  mkPlayer({ name: '같이가요전우님', rank: '대위', level: 172, wr: 58, kda: 1.98, hs: 38, clan: '불곰부대', clanTag: 'BEAR', online: true }),
  mkPlayer({ name: '소이탄러버', rank: '중위', level: 154, wr: 55, kda: 1.81, hs: 35, clan: '불곰부대', clanTag: 'BEAR', online: true }),
  mkPlayer({ name: '야1돌이', rank: '상사', level: 121, wr: 52, kda: 1.62, hs: 33, clan: null, online: false }),
  mkPlayer({ name: '닷지의신', rank: '소위', level: 138, wr: 54, kda: 1.74, hs: 30, clan: '불곰부대', clanTag: 'BEAR', online: false }),
];

// ── 실시간 전장 현황(오늘) ──
const liveStats = {
  date: '06월 09일',
  totalMatches: 151873,
  matchModes: [
    { name: '클랜전', count: 40713 },
    { name: '솔로 랭크전', count: 62840 },
    { name: '파티 랭크전', count: 48320 },
    { name: '클랜 랭크전', count: 21560 },
  ],
  online: 31204,
  topMap: '제3보급창고',
  topMode: '폭파미션',
  newClans: 142,
  bannedToday: 87,        // 핵/불량 유저 제재
  prevDelta: +6.2,        // 전일대비 %
};

// ── 커뮤니티 게시판 ──
const community = {
  자유: [
    { tag: '유머', title: '제3보급창고 A롱 각도 외운 사람만 아는 그것 ㅋㅋㅋ', cmt: 214, hot: true, time: '12분 전' },
    { tag: '질문', title: '20년차 복귀유저인데 요즘 메타 AK가 국룰인가요?', cmt: 88, hot: true, time: '34분 전' },
    { tag: '자랑', title: '드디어 소령 달았습니다… 학창시절부터 한 게임 (눈물)', cmt: 156, hot: true, time: '1시간 전' },
    { tag: '잡담', title: '오늘 생존전 스쿼드 막판 1:4 역전 클립 보고가셈', cmt: 42, hot: false, time: '2시간 전' },
    { tag: '질문', title: '클랜원 모집 어디서 하는 게 제일 빠른가요?', cmt: 19, hot: false, time: '3시간 전' },
  ],
  공략: [
    { tag: '에임', title: '헤드라인 유지 — 입문자가 3일 만에 헤드샷률 올리는 법', cmt: 327, hot: true, time: '6시간 전' },
    { tag: '맵', title: '[데드폴] 폭파 공격팀 기본 진입 루트 3가지 총정리', cmt: 198, hot: true, time: '8시간 전' },
    { tag: '맵', title: '[웨어하우스] 수비팀 크로스 각 잡는 3가지 포지션', cmt: 142, hot: false, time: '1일 전' },
    { tag: '생존', title: '생존전 솔로 — 자기장 사이클별 동선 가이드', cmt: 89, hot: false, time: '1일 전' },
    { tag: '클랜', title: '클랜전 입문 — 포지션별 역할과 콜 기본기', cmt: 64, hot: false, time: '2일 전' },
  ],
};

// ── SA 소식: 공지사항 / 업데이트 / 이벤트 ──
const news = {
  공지사항: [
    { title: '6/11(목) 정기점검 및 게임 프레임 확장 베타 서버 적용 안내', date: '06.09', pin: true },
    { title: '확률형 아이템 확률 정보 통합 안내 페이지 오픈 안내', date: '06.05', pin: true },
    { title: '비매너·불법 프로그램 사용 계정 제재 안내 (6월 1주차)', date: '06.04', pin: false },
    { title: '서버 안정화 작업에 따른 일부 채널 일시 점검 안내', date: '05.30', pin: false },
    { title: '닉네임 변경권 사용 정책 일부 개정 안내', date: '05.27', pin: false },
    { title: '고객지원 운영시간 변경 안내', date: '05.22', pin: false },
  ],
  'GM이야기': [
    { title: '[GM레터] 게임 프레임 확장 베타, 직접 체험해본 후기', date: '06.09', tag: 'GM' },
    { title: '개발팀이 전하는 2026 시즌2 「페르소나」 기획 비하인드', date: '06.03', tag: 'GM' },
    { title: '[GM노트] 밸런스 패치는 어떤 기준으로 결정되나요?', date: '05.27', tag: 'GM' },
    { title: '커뮤니티 의견 반영 현황 — 여러분의 제안이 이렇게 적용됐어요', date: '05.20', tag: 'GM' },
    { title: '[GM레터] 비매너·핵 근절을 위한 모니터링 강화 이야기', date: '05.13', tag: 'GM' },
    { title: '신규·복귀 유저를 위한 GM의 온보딩 팁 모음', date: '05.06', tag: 'GM' },
  ],
  업데이트: [
    { title: '2026 시즌2 「페르소나」 — 신규 캐릭터 리나·린 추가', date: '06.04', tag: '신규' },
    { title: '생존전 로데오 솔로 모드 및 신규 콤보 시스템 적용', date: '05.28', tag: '모드' },
    { title: '무기 컬렉션 대표 스킨 시스템 개편', date: '05.21', tag: '시스템' },
    { title: '2026 무기 개편 2차 — SG552·FAMAS 밸런스 조정', date: '05.14', tag: '밸런스' },
    { title: '정채연 캐릭터 출시 및 전용 모션 추가', date: '05.07', tag: '캐릭터' },
    { title: '제3보급창고 리마스터 및 충돌 버그 수정', date: '04.30', tag: '맵' },
  ],
  이벤트: [
    { title: 'SUMMER PARTY TIME! PC방 파티 출석 이벤트', date: '06.08', tag: '진행중' },
    { title: '얼리 썸머 체크인 — 7일 출석 시 무기 스킨 지급', date: '06.05', tag: '진행중' },
    { title: '2026 챔피언십 시즌2 승부예측 6주차', date: '06.02', tag: '진행중' },
    { title: '신규·복귀 전우 환영 미션 패키지', date: '05.26', tag: '상시' },
    { title: '친구 초대하고 캐릭터 뽑기권 받기', date: '05.20', tag: '상시' },
  ],
};

// ── 지금 방송 중 LIVE (치지직 / 숲 / 유튜브 연동) ──
const streamPlatforms = {
  치지직:  { label: '치지직', en: 'CHZZK',   color: '#00b6a0', tag: 'CHZZK' },
  숲:      { label: '숲',     en: 'SOOP',    color: '#0064ff', tag: 'SOOP' },
  유튜브:  { label: '유튜브', en: 'YOUTUBE', color: '#e62117', tag: 'YT' },
};
const streams = [
  { platform: '치지직', streamer: '헤드샷장인',  title: '소령 → 중령 승급전 가즈아 [클랜전 정주행]', viewers: 4210, started: '2시간째' },
  { platform: '숲',     streamer: 'BJ철벽수비',  title: '생존전 1인 스쿼드 치킨 30판 도전', viewers: 2870, started: '1시간째' },
  { platform: '유튜브', streamer: '원킬원샷TV',  title: 'AWP 원챔으로 솔로랭크 끝까지 등반', viewers: 1530, started: '3시간째' },
  { platform: '치지직', streamer: '오로라공주',  title: '시청자 참여 클랜전 · 같이 서든해요', viewers: 980, started: '40분째' },
  { platform: '숲',     streamer: '연막탄장인',  title: '데드폴 공격팀 진입 루트 풀이 + 랭크', viewers: 760, started: '1시간째' },
  { platform: '유튜브', streamer: '서든레전드',  title: '랭크전 티어별 동선·포지션 완전 정리', viewers: 540, started: '2시간째' },
];

// ── 컨텐츠 랭크전 티어 색상표 (브론즈→하이랭커 8단계) ──
const tiers = [
  { name: '브론즈',       color: '#a9743b' },
  { name: '실버',         color: '#94a0aa' },
  { name: '골드',         color: '#c4960f' },
  { name: '마스터',       color: '#5b8a72' },
  { name: '그랜드마스터', color: '#4f6b8a' },
  { name: '챌린저',       color: '#7a5bb0' },
  { name: '랭커',         color: '#b25a2b' },
  { name: '하이랭커',     color: '#b23b3b' },
];

// ── SA 랭킹 5종 (각 top10) ──
// 1) 시즌 계급 랭킹 — 이번 시즌 계급 점수
const seasonClassRanking = [
  { name: 'GLOCK_여신', score: 41820 },
  { name: '최후의1인', score: 39650 },
  { name: '서든황제김씨', score: 37410 },
  { name: '자기장보다빠름', score: 35880 },
  { name: '컨테이너지박령', score: 34120 },
  { name: '낙하산명사수', score: 32540 },
  { name: '원킬원샷', score: 30980 },
  { name: '엄폐의달인', score: 29360 },
  { name: '데드폴터줏대', score: 27910 },
  { name: '캠핑은매너', score: 26480 },
];
// 2) 통합 계급 랭킹 — 역대 누적 계급 점수
const totalClassRanking = [
  { name: '서든황제김씨', score: 284900 },
  { name: 'GLOCK_여신', score: 271350 },
  { name: '원킬원샷', score: 258740 },
  { name: '컨테이너지박령', score: 246180 },
  { name: '데드폴터줏대', score: 233520 },
  { name: '도라에몽핵아님', score: 221070 },
  { name: '최후의1인', score: 209640 },
  { name: '오로라공주', score: 198330 },
  { name: '연막탄장인', score: 187020 },
  { name: '헤드샷장인', score: 176510 },
];
// 3) 컨텐츠 랭킹 — 솔로/파티 랭크전 (RP순)
const soloRpRanking = [
  { name: 'GLOCK_여신', tier: '하이랭커', rp: 4920 },
  { name: '원킬원샷', tier: '하이랭커', rp: 4710 },
  { name: '컨테이너지박령', tier: '랭커', rp: 4480 },
  { name: '서든황제김씨', tier: '랭커', rp: 4350 },
  { name: '데드폴터줏대', tier: '챌린저', rp: 4120 },
  { name: '도라에몽핵아님', tier: '챌린저', rp: 3980 },
  { name: '오로라공주', tier: '그랜드마스터', rp: 3760 },
  { name: '연막탄장인', tier: '그랜드마스터', rp: 3610 },
  { name: '헤드샷장인', tier: '마스터', rp: 3420 },
  { name: '같이가요전우님', tier: '마스터', rp: 3280 },
];
const partyRpRanking = [
  { name: '최후의1인', tier: '하이랭커', rp: 4860 },
  { name: 'GLOCK_여신', tier: '하이랭커', rp: 4690 },
  { name: '자기장보다빠름', tier: '랭커', rp: 4420 },
  { name: '서든황제김씨', tier: '랭커', rp: 4300 },
  { name: '낙하산명사수', tier: '챌린저', rp: 4080 },
  { name: '원킬원샷', tier: '챌린저', rp: 3940 },
  { name: '엄폐의달인', tier: '그랜드마스터', rp: 3720 },
  { name: '오로라공주', tier: '그랜드마스터', rp: 3580 },
  { name: '캠핑은매너', tier: '마스터', rp: 3360 },
  { name: '보급상자요정', tier: '마스터', rp: 3210 },
];
// 3-1) 랭크전 클랜 랭킹 — 클랜 랭크전 (RP순)
const clanRpRanking = [
  { name: '서울제일', tag: 'SEL', members: 48, rp: 9840 },
  { name: '불곰부대', tag: 'BEAR', members: 52, rp: 9510 },
  { name: '야간전투', tag: 'NGT', members: 41, rp: 9180 },
  { name: '강철군화', tag: 'STL', members: 50, rp: 8870 },
  { name: '한강수비대', tag: 'HAN', members: 45, rp: 8560 },
  { name: '한밤의늑대', tag: 'WLF', members: 44, rp: 8240 },
  { name: '데드샷연합', tag: 'DSU', members: 39, rp: 7930 },
  { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 7610 },
  { name: '폭풍전야', tag: 'STM', members: 42, rp: 7350 },
  { name: '은하수비대', tag: 'GLX', members: 36, rp: 7080 },
];
// 4) 공식 클랜 랭킹 — 운영팀 인증 클랜
const officialClanRanking = [
  { name: '서울제일', tag: 'SEL', members: 48, rp: 28940 },
  { name: '불곰부대', tag: 'BEAR', members: 52, rp: 27110 },
  { name: '야간전투', tag: 'NGT', members: 41, rp: 25880 },
  { name: '정예타격대', tag: 'ACE', members: 50, rp: 24990 },
  { name: '한강수비대', tag: 'HAN', members: 45, rp: 24500 },
  { name: '백호부대', tag: 'WHT', members: 47, rp: 23770 },
  { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 23210 },
  { name: '강철군화', tag: 'STL', members: 50, rp: 22640 },
  { name: '흑표클랜', tag: 'BLP', members: 43, rp: 21980 },
  { name: '새벽기습', tag: 'DWN', members: 39, rp: 21330 },
];
// 5) 클랜 랭킹 — 일반 클랜
const generalClanRanking = [
  { name: '불곰부대', tag: 'BEAR', members: 52, rp: 26210 },
  { name: '한밤의늑대', tag: 'WLF', members: 44, rp: 25540 },
  { name: '서울제일', tag: 'SEL', members: 48, rp: 24880 },
  { name: '돌격대대', tag: 'CHG', members: 36, rp: 23960 },
  { name: '야간전투', tag: 'NGT', members: 41, rp: 23310 },
  { name: '폭풍전선', tag: 'STM', members: 40, rp: 22650 },
  { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 21940 },
  { name: '강철군화', tag: 'STL', members: 50, rp: 21280 },
  { name: '백전노장', tag: 'VET', members: 33, rp: 20710 },
  { name: '한강수비대', tag: 'HAN', members: 45, rp: 20150 },
];

// ── 시즌 현황 (시즌 D-day · 보상 · 시즌 맵) ──
const season = {
  name: '2026 시즌2 「페르소나」',
  period: '05.07 ~ 06.30',
  dday: 'D-20',
  progress: 63,
  reward: '시즌2 한정 칭호 「페르소나」 · 캐릭터 뽑기권 10장',
  maps5v5: ['제3보급창고', '웨어하우스', '데드폴', '컨테이너시티', '라스트포트'],
  maps3v3: ['욕망의 항구', '폐건물', '가스폭발', '웨스트게이트'],
};
// ── 연승 핫스트릭 (폼 좋은 유저) ──
const hotStreak = [
  { name: 'GLOCK_여신', streak: 12 },
  { name: '원킬원샷', streak: 9 },
  { name: '컨테이너지박령', streak: 8 },
  { name: '오로라공주', streak: 7 },
  { name: '서든황제김씨', streak: 6 },
  { name: '데드폴터줏대', streak: 6 },
];

// ── 진행중인 이벤트 배너(피처드) ──
const events = [
  { title: '게임 프레임 확장 베타 테스트', sub: '최대 200 FPS 개선 서버를 일주일간 체험', period: '06.04 ~ 06.11', dday: 'D-2', tag: 'GM이야기', kind: 'beta' },
  { title: 'SUMMER PARTY TIME!', sub: 'PC방 접속하고 파티 보상 받아가세요', period: '06.01 ~ 06.30', dday: 'D-21', tag: 'PC방', kind: 'party' },
  { title: '시즌2 「페르소나」 승부예측', sub: '6주차 매치 결과 맞히고 포인트 적립', period: '~ 06.15', dday: 'D-6', tag: '리그', kind: 'league' },
  { title: '얼리 썸머 체크인', sub: '7일 연속 출석 시 한정 무기 스킨 증정', period: '06.05 ~ 06.19', dday: 'D-10', tag: '출석', kind: 'checkin' },
  { title: '신규·복귀 유저 부스트', sub: '경험치 2배 + 스타터 보급 패키지 지급', period: '06.01 ~ 06.30', dday: 'D-21', tag: '복귀', kind: 'boost' },
  { title: '주말 클랜전 더블 포인트', sub: '토·일 클랜전 승리 시 클랜 포인트 2배', period: '매주 주말', dday: '상시', tag: '클랜', kind: 'clan' },
  { title: '핫타임 드롭 이벤트', sub: '매일 20~22시 접속 시 랜덤 보급상자', period: '06.01 ~ 06.30', dday: 'D-21', tag: '핫타임', kind: 'hot' },
  { title: '명사수 챌린지', sub: '주간 헤드샷 목표 달성하고 보상 획득', period: '06.09 ~ 06.16', dday: 'D-7', tag: '챌린지', kind: 'challenge' },
];

window.SA = {
  me, soloRanking, survRanking,
  recentSearches, friends, liveStats, community, news, events,
  streams, streamPlatforms, searchTrending, tiers,
  seasonClassRanking, totalClassRanking, soloRpRanking, partyRpRanking, clanRpRanking,
  officialClanRanking, generalClanRanking, season, hotStreak,
  // 즐겨찾기 (페이지네이션 시연용 — 친구 + 랭커 혼합)
  favorites: [...friends, ...soloRanking, ...survRanking.slice(1, 6)],
  // 전체 검색 대상 풀
  allPlayers: [me, ...soloRanking, ...survRanking, ...friends],
  fmt: (n) => n.toLocaleString('en-US'),
  kdPct: (kda) => Math.round((kda / (kda + 1)) * 100),
};
