// Mock telemetry for 5 Arma Reforger servers + 200ish players, plus chat, kills, audit, notes.
// All names and IDs are invented for this prototype.

const PLATFORMS = ["steam", "xbox", "ps"];

const NAME_POOL = [
  "Ravenshade","Kessler","Volk-7","NightOwl","Dust_Pilgrim","ShadowFox","Calder",
  "M.Petrov","Bravo-Six","Halberd","RanidaeJ","Tomek","Mistral","Iron_Veil",
  "Cromwell","Velikan","Talyn","Ash.Reed","Skarn","Pavel-K","Gunny","Lothar",
  "Tideborn","Quill","Granger","Drift","Sable","Pemberton","Mokra","Tanger",
  "Reggie47","FoxhoundQ","Vasiliy","Echo_Lane","Niko_T","Heron","Skadi","Knecht",
  "Cleaver","Whittaker","Boran","Lukov","Pace","Hexley","Vance","Orla","Pike",
  "Ferro","Jansen","Quint","Kovacs","Aldric","Ragnar.S","Mira","Tom_Kade",
  "Yaeger","Pollux","Brogan","Sterling","Hawthorne","Pemba","Decker","Mireille",
  "Karver","Tsung","Bjornsen","Halsey","Pridgen","Yulia","Marek","Tashkent",
  "Quesada","Renko","Bishop","Castor","Otho","Gunnarsson","Sigrid","Vespers"
];

const SURNAMES = ["wolf","fang","dust","veil","stone","ridge","crow","ash","fox","oak","steel","frost","gale","creed"];

const MAPS = [
  { id: "everon", label: "Everon" },
  { id: "arland", label: "Arland" }
];
const MODES = [
  { id: "conflict", label: "Conflict" },
  { id: "gm", label: "Game Master" },
  { id: "ce", label: "Combat Ops" }
];

const REGIONS = [
  { id: "eu-fra", label: "EU · Frankfurt" },
  { id: "eu-lon", label: "EU · London" },
  { id: "us-chi", label: "US · Chicago" },
  { id: "us-dal", label: "US · Dallas" },
  { id: "us-pdx", label: "US · Portland" }
];

const WEAPONS = ["AK-74","M16A2","RPK-74","M249","M21","SVD","FAL","Mk18","AKS-74U","UZI","FRAG","Vehicle"];

function rng(seed) {
  let s = seed >>> 0;
  return () => {
    s = (s * 1664525 + 1013904223) >>> 0;
    return s / 0x100000000;
  };
}

function pick(arr, r) { return arr[Math.floor(r() * arr.length)]; }

function makeIP(r) {
  return `${50 + Math.floor(r()*180)}.${Math.floor(r()*256)}.${Math.floor(r()*256)}.${Math.floor(r()*256)}`;
}
function makeGUID(platform, r) {
  if (platform === "steam") {
    let s = "7656119";
    for (let i = 0; i < 10; i++) s += Math.floor(r()*10);
    return s;
  }
  if (platform === "xbox") {
    let s = "XUID:";
    for (let i = 0; i < 16; i++) s += Math.floor(r()*16).toString(16);
    return s.toUpperCase();
  }
  // ps
  let s = "PSN:";
  for (let i = 0; i < 14; i++) s += Math.floor(r()*16).toString(16);
  return s.toUpperCase();
}

function timeAgoStr(mins) {
  if (mins < 1) return "just now";
  if (mins < 60) return `${mins}m ago`;
  const h = Math.floor(mins/60), m = mins % 60;
  if (h < 24) return `${h}h ${m}m ago`;
  return `${Math.floor(h/24)}d ago`;
}

function nowMin(offset = 0) {
  return Date.now() - offset*60000;
}

function fmtClock(d) {
  const dt = new Date(d);
  return dt.toTimeString().slice(0,8);
}
function fmtClockShort(d) {
  const dt = new Date(d);
  return dt.toTimeString().slice(0,5);
}

function buildPlayers(serverId, count, seed) {
  const r = rng(seed);
  const out = [];
  for (let i = 0; i < count; i++) {
    const platform = pick(PLATFORMS, r);
    let nm = pick(NAME_POOL, r);
    if (r() < 0.15) nm = nm + "_" + pick(SURNAMES, r);
    const ping = 18 + Math.floor(r() * 220);
    const session = Math.floor(r() * 240);
    const faction = r() < 0.5 ? "US" : "USSR";
    const kills = Math.floor(r() * 25);
    const deaths = Math.floor(r() * 18);
    out.push({
      id: `${serverId}_p${i}`,
      name: nm,
      platform,
      guid: makeGUID(platform, r),
      ip: makeIP(r),
      ping,
      sessionMin: session,
      faction,
      kills,
      deaths,
      score: kills * 10 + Math.floor(r() * 50),
      isAdmin: r() < 0.02,
      flagged: r() < 0.05,
    });
  }
  return out;
}

const SERVERS_BASE = [
  { id: "s1", name: "Volk · Conflict #1",       region: "eu-fra", map: "everon", mode: "conflict", maxPlayers: 64, status: "online" },
  { id: "s2", name: "Volk · Conflict #2",       region: "us-chi", map: "arland", mode: "conflict", maxPlayers: 64, status: "online" },
  { id: "s3", name: "Volk · Game Master",       region: "eu-lon", map: "everon", mode: "gm",       maxPlayers: 32, status: "online" },
  { id: "s4", name: "Volk · Combat Ops [PVE]",  region: "us-pdx", map: "arland", mode: "ce",       maxPlayers: 48, status: "warning" },
  { id: "s5", name: "Volk · Modded Sandbox",    region: "us-dal", map: "everon", mode: "gm",       maxPlayers: 24, status: "offline", error: "no response from 1.2.3.8:19999 — check RConPort, outbound UDP, and that this box's IP is on the BattlEye RCON whitelist" },
];

const SERVERS = SERVERS_BASE.map((s, i) => {
  const r = rng(100 + i);
  const onlineCount = s.status === "offline" ? 0 :
    s.status === "warning" ? Math.floor(s.maxPlayers * (0.85 + r()*0.10)) :
    Math.floor(s.maxPlayers * (0.4 + r()*0.5));
  const players = s.status === "offline" ? [] : buildPlayers(s.id, onlineCount, 200 + i);
  // build a sparkline of last 60 mins
  const spark = [];
  let v = onlineCount;
  for (let k = 0; k < 60; k++) {
    v += Math.round((r()-0.5) * 4);
    v = Math.max(0, Math.min(s.maxPlayers, v));
    spark.unshift(v);
  }
  spark.push(onlineCount);
  return {
    ...s,
    players,
    uptimeHrs: s.status === "offline" ? 0 : Math.floor(r()*72)+1,
    fps: s.status === "offline" ? 0 : Math.floor(45 + r()*15),
    cpu: s.status === "offline" ? 0 : Math.floor(30 + r()*55),
    ramGB: s.status === "offline" ? 0 : +(2 + r()*4).toFixed(1),
    spark,
    restartIn: Math.floor(r()*240)+30
  };
});

// build chat feed per server
function buildChat(server) {
  if (!server.players.length) return [];
  const r = rng(server.id.charCodeAt(1) * 7919);
  const lines = [
    "anyone got a vehicle?","need a medic at radio tower","spawning at Larche","west flank pushing","supply needed at Lamentin","afk for 2","sniper east treeline","copy, moving","contact north 200m","rgr","ammo at FOB",
    "stop tk lol","gj team","truck up at base","map glitch?","insurgents at hill 412","need a heli","who's CO","push north","need engineer","rotating south","got eyes on east"
  ];
  const out = [];
  for (let i = 0; i < 40; i++) {
    const p = pick(server.players, r);
    out.push({
      id: `${server.id}_c${i}`,
      playerId: p.id,
      name: p.name,
      faction: p.faction,
      text: pick(lines, r),
      ts: nowMin(Math.floor(r()*180))
    });
  }
  return out.sort((a,b) => a.ts - b.ts);
}

// build kill feed
function buildKills(server) {
  if (!server.players.length) return [];
  const r = rng(server.id.charCodeAt(1) * 7187);
  const out = [];
  for (let i = 0; i < 60; i++) {
    const a = pick(server.players, r);
    let b = pick(server.players, r);
    while (b.id === a.id) b = pick(server.players, r);
    const tk = a.faction === b.faction;
    out.push({
      id: `${server.id}_k${i}`,
      killerId: a.id, killerName: a.name,
      victimId: b.id, victimName: b.name,
      weapon: pick(WEAPONS, r),
      distance: Math.floor(r()*420),
      tk,
      ts: nowMin(Math.floor(r()*180))
    });
  }
  return out.sort((a,b) => a.ts - b.ts);
}

const CHAT = {};
const KILLS = {};
SERVERS.forEach(s => { CHAT[s.id] = buildChat(s); KILLS[s.id] = buildKills(s); });

// player notes (preseed a few)
const NOTES = {};
function seedNote(playerId, body, author, minsAgo) {
  if (!NOTES[playerId]) NOTES[playerId] = [];
  NOTES[playerId].push({ id: playerId + "_n" + NOTES[playerId].length, body, author, ts: nowMin(minsAgo) });
}
SERVERS.forEach(s => {
  if (!s.players.length) return;
  const r = rng(s.id.charCodeAt(1) * 41);
  // 8 random notes
  for (let i = 0; i < 8; i++) {
    const p = pick(s.players, r);
    const lines = [
      "Repeat TK warned 2024-09-12 — second strike = 24h ban.",
      "Confirmed legit; cleared after spectator review.",
      "Heard mic on global, asked to push to PTT.",
      "Suspected wallhack on hill 412 — review demo.",
      "Donor, give benefit of doubt.",
      "Returning after 7d temp ban for griefing.",
      "Polite player, often calls out for medic squad."
    ];
    seedNote(p.id, pick(lines, r), pick(["mara","sten","veld","koba","ash"], r), Math.floor(r()*60*24*5));
  }
});

// audit log (server-wide)
const AUDIT = [];
(function buildAudit() {
  const r = rng(424242);
  const actions = ["kicked","tempbanned","permbanned","warned","messaged","broadcast","restarted","added note","changed map"];
  const staff = ["mara","sten","veld","koba","ash","rin"];
  for (let i = 0; i < 80; i++) {
    const s = pick(SERVERS, r);
    const action = pick(actions, r);
    const targetP = s.players.length ? pick(s.players, r) : null;
    AUDIT.push({
      id: "a" + i,
      ts: nowMin(Math.floor(r()*60*72)),
      who: pick(staff, r),
      action,
      server: s.id,
      target: targetP ? targetP.name : null,
      detail: action === "broadcast" ? "“Restart in 5 minutes — save your progress.”" :
              action === "restarted" ? "scheduled rolling restart" :
              action === "changed map" ? "Everon → Arland" :
              action.includes("ban") ? "Reason: repeated team-kill" :
              action === "warned" ? "Reason: language" :
              action === "kicked" ? "Reason: AFK" :
              action === "messaged" ? "PM sent" : ""
    });
  }
  AUDIT.sort((a,b) => b.ts - a.ts);
})();

window.DATA = { SERVERS, CHAT, KILLS, NOTES, AUDIT, MAPS, MODES, REGIONS, fmtClock, fmtClockShort, timeAgoStr };
