// Mock data for the bot dashboard.
// Bot is a workplace / duty / RP server management bot.

const BOT = {
  name: "shift.bot",
  tag: "shift#4012",
  id: "1138204982094328412",
  version: "v1.8.4",
  node: "Node 20.11.0",
  library: "discord.js 14.15.2",
  region: "ap-southeast-1 (Singapore)",
  process: "PM2 · pid 18402",
  startedAt: Date.now() - (1000 * 60 * 60 * 73 + 1000 * 60 * 22), // 3d 0h 22m ago
  owner: "you",
};

const COMMAND_CATEGORIES = [
  {
    key: "basic",
    name: "Basic",
    icon: "📚",
    color: "#9aa4b2",
    items: [
      { name: "help", desc: "แสดงรายการคำสั่งทั้งหมด", uses: 412 },
      { name: "info", desc: "แสดงข้อมูลทั่วไปของบอท", uses: 88 },
      { name: "ping", desc: "เช็ค latency ของบอท", uses: 1204 },
    ],
  },
  {
    key: "mod",
    name: "Moderation",
    icon: "🛡",
    color: "#fb7185",
    items: [
      { name: "ban", desc: "Ban สมาชิกออกจากเซิร์ฟเวอร์", uses: 34 },
      { name: "clear", desc: "ลบข้อความล่าสุดในห้อง (1–100 ข้อความ)", uses: 612 },
      { name: "kick", desc: "Kick สมาชิกออกจากเซิร์ฟเวอร์", uses: 51 },
      { name: "lock", desc: "ล็อกห้องปัจจุบัน (ห้าม @everyone ส่งข้อความ)", uses: 18 },
      { name: "nick", desc: "เปลี่ยนหรือรีเซ็ต nickname สมาชิก", uses: 143 },
      { name: "role", desc: "เพิ่ม / ลบ role ของสมาชิก", uses: 287 },
      { name: "slowmode", desc: "ตั้ง slowmode ของห้องปัจจุบัน", uses: 22 },
      { name: "timeout", desc: "Timeout สมาชิก (mute ชั่วคราว)", uses: 198 },
      { name: "unban", desc: "Unban ผู้ใช้ออกจากรายชื่อแบน", uses: 9 },
      { name: "unlock", desc: "ปลดล็อกห้องปัจจุบัน", uses: 17 },
      { name: "untimeout", desc: "ปลด timeout สมาชิก", uses: 54 },
      { name: "warn", desc: "เตือนสมาชิก (เก็บใน memory — หายเมื่อ restart)", uses: 233 },
    ],
  },
  {
    key: "util",
    name: "Utility",
    icon: "⚙",
    color: "#7cffb2",
    items: [
      { name: "active", desc: "แสดงเจ้าหน้าที่ที่กำลังปฏิบัติงานอยู่", uses: 821 },
      { name: "authpanel", desc: "สร้างแผงขอรหัส 2FA ของบริษัท 1–6", uses: 64 },
      { name: "avatar", desc: "แสดง avatar ของผู้ใช้", uses: 312 },
      { name: "base64", desc: "เข้ารหัส/ถอดรหัส base64", uses: 41 },
      { name: "choose", desc: "สุ่มเลือกหนึ่งตัวเลือก", uses: 96 },
      { name: "color", desc: "แสดงข้อมูลสีจาก HEX", uses: 27 },
      { name: "duty", desc: "สร้างแผงควบคุมเข้า-ออกงาน", uses: 1842 },
      { name: "embed", desc: "สร้าง embed message", uses: 128 },
      { name: "math", desc: "คำนวณนิพจน์คณิตศาสตร์อย่างปลอดภัย", uses: 73 },
      { name: "myhours", desc: "ดูสถิติการเข้างาน 7 วันล่าสุดของคุณหรือคนอื่น", uses: 1129 },
      { name: "need", desc: "สรุปคำขอที่รออนุมัติของแต่ละบ้าน", uses: 287 },
      { name: "poll", desc: "สร้างโพลพร้อม reaction ให้โหวต", uses: 49 },
      { name: "qr", desc: "สร้าง QR code จากข้อความ", uses: 36 },
      { name: "remind", desc: "ตั้งเตือน (หายเมื่อ restart บอท)", uses: 182 },
      { name: "request", desc: "สร้างแผงขอความช่วยเหลือ / สิ่งที่ขาด", uses: 92 },
      { name: "say", desc: "ให้บอทพูดข้อความ", uses: 211 },
      { name: "serverinfo", desc: "แสดงข้อมูลเซิร์ฟเวอร์", uses: 67 },
      { name: "timestamp", desc: "สร้าง Discord timestamp", uses: 54 },
      { name: "userinfo", desc: "แสดงข้อมูลผู้ใช้", uses: 188 },
    ],
  },
  {
    key: "fun",
    name: "Fun",
    icon: "✨",
    color: "#c8a8ff",
    items: [
      { name: "8ball", desc: "ถามลูกแก้ววิเศษ", uses: 432 },
      { name: "coinflip", desc: "โยนเหรียญ", uses: 218 },
      { name: "dice", desc: "ทอยลูกเต๋า", uses: 167 },
      { name: "mock", desc: "sPoNgEbOb cAsE", uses: 89 },
      { name: "random", desc: "สุ่มตัวเลข", uses: 256 },
      { name: "reverse", desc: "กลับข้อความ", uses: 44 },
      { name: "rps", desc: "เป่ายิ้งฉุบ", uses: 312 },
    ],
  },
  {
    key: "info",
    name: "Info",
    icon: "ℹ",
    color: "#5eead4",
    items: [
      { name: "botinfo", desc: "แสดงข้อมูลบอท", uses: 124 },
      { name: "channelinfo", desc: "แสดงข้อมูล channel", uses: 38 },
      { name: "membercount", desc: "แสดงจำนวนสมาชิก", uses: 71 },
      { name: "roleinfo", desc: "แสดงข้อมูล role", uses: 42 },
      { name: "uptime", desc: "แสดง uptime ของบอท", uses: 199 },
    ],
  },
  {
    key: "owner",
    name: "Owner",
    icon: "👑",
    color: "#fbbf24",
    items: [
      { name: "reload", desc: "Reload command code โดยไม่ต้องรันบอทใหม่", uses: 17 },
      { name: "restart", desc: "Restart บอท (ต้องมี process manager เช่น PM2)", uses: 4 },
      { name: "sheetstyle", desc: "ตกแต่ง Google Sheet ใหม่ทั้งหมด (owner-only)", uses: 2 },
      { name: "shiftreset", desc: "ล้างข้อมูล shift (owner-only)", uses: 1 },
      { name: "weeklyreport", desc: "ส่งสรุปรายสัปดาห์ตอนนี้เลย (owner-only)", uses: 9 },
    ],
  },
];

const ALL_COMMANDS = COMMAND_CATEGORIES.flatMap((c) =>
  c.items.map((it) => ({ ...it, category: c.key, categoryName: c.name, color: c.color }))
);

// These derived primitives are `let` (not `const`) so REALDATA can reassign them
// in shared script scope when real data arrives. Arrays/objects are mutated in place.
let TOTAL_COMMANDS = ALL_COMMANDS.length;
let TOTAL_USES_24H = 2841; // last 24h
let TOTAL_USES_ALL = ALL_COMMANDS.reduce((s, c) => s + c.uses, 0);

const GUILDS = [
  { id: "1", name: "บริษัท Pacific Logistics", members: 184, online: 64, prefix: "/", joined: "2024-11-02", icon: "PL", color: "#7cffb2", premium: true },
  { id: "2", name: "RP · Bangkok Underground", members: 412, online: 138, prefix: "/", joined: "2024-09-14", icon: "BU", color: "#c8a8ff", premium: true },
  { id: "3", name: "Saint Andrews PD", members: 96, online: 28, prefix: "/", joined: "2025-01-21", icon: "SA", color: "#5eead4", premium: false },
  { id: "4", name: "Highway Patrol HQ", members: 73, online: 19, prefix: "/", joined: "2025-02-08", icon: "HP", color: "#fb7185", premium: false },
  { id: "5", name: "Mercy General Hospital", members: 58, online: 16, prefix: "/", joined: "2025-03-12", icon: "MG", color: "#fbbf24", premium: false },
  { id: "6", name: "บ้านพักครอบครัว Yamamoto", members: 24, online: 7, prefix: "/", joined: "2025-04-03", icon: "YM", color: "#7cffb2", premium: false },
  { id: "7", name: "dev · sandbox", members: 6, online: 2, prefix: "/", joined: "2024-08-01", icon: "DV", color: "#9aa4b2", premium: false },
  { id: "8", name: "บ้าน Tanaka Family", members: 19, online: 5, prefix: "/", joined: "2025-04-18", icon: "TK", color: "#5eead4", premium: false },
];

const COGS = [
  { key: "basic", name: "Basic", desc: "Help, info, ping", commands: 3, status: "loaded", memory: "1.2 MB", loadedAt: "73h 22m", error: null },
  { key: "moderation", name: "Moderation", desc: "Ban/kick/timeout/warn/clear", commands: 12, status: "loaded", memory: "3.4 MB", loadedAt: "73h 22m", error: null },
  { key: "utility", name: "Utility", desc: "Duty, hours, request, embed, polls", commands: 19, status: "loaded", memory: "8.7 MB", loadedAt: "73h 22m", error: null },
  { key: "fun", name: "Fun", desc: "8ball, dice, rps, mock", commands: 7, status: "loaded", memory: "0.9 MB", loadedAt: "73h 22m", error: null },
  { key: "info", name: "Info", desc: "Bot/server/channel/role info", commands: 5, status: "loaded", memory: "1.1 MB", loadedAt: "73h 22m", error: null },
  { key: "owner", name: "Owner", desc: "Reload, restart, sheetstyle, reports", commands: 5, status: "loaded", memory: "2.1 MB", loadedAt: "73h 22m", error: null },
  { key: "sheets", name: "Google Sheets sync", desc: "Mirror duty / shift logs to Sheets", commands: 0, status: "loaded", memory: "5.8 MB", loadedAt: "73h 22m", error: null },
  { key: "scheduler", name: "Scheduler", desc: "Weekly report cron, reminders", commands: 0, status: "loaded", memory: "0.6 MB", loadedAt: "73h 22m", error: null },
  { key: "experimental-ai", name: "AI replies (experimental)", desc: "Reply with LLM in #ask channel", commands: 0, status: "disabled", memory: "0 MB", loadedAt: "—", error: null },
];

// Recent log lines — append-style.
const LOGS = [
  { t: "00:14:22", level: "info", source: "duty", msg: "user 184932… clocked IN at บริษัท Pacific Logistics · shift #4291" },
  { t: "00:14:11", level: "info", source: "cmd", msg: "/myhours by user 728112… in #bot-commands" },
  { t: "00:13:58", level: "warn", source: "rate", msg: "rate limit avoided (route: /channels/:id/messages) backoff 250ms" },
  { t: "00:13:42", level: "info", source: "mod", msg: "/timeout 5m → user 661044… reason: spam in #general (by mod 401123…)" },
  { t: "00:13:21", level: "info", source: "cmd", msg: "/active in RP · Bangkok Underground · 18 active" },
  { t: "00:12:55", level: "info", source: "sheets", msg: "appended 12 rows to 'Shift Log · May 2026' (227ms)" },
  { t: "00:12:33", level: "info", source: "duty", msg: "user 884330… clocked OUT at Saint Andrews PD · 4h 12m" },
  { t: "00:12:08", level: "error", source: "cmd", msg: "/sheetstyle failed: 403 The caller does not have permission · sheetId=1A2bC…" },
  { t: "00:11:42", level: "info", source: "cmd", msg: "/poll by user 552901… (3 options, 5 minutes)" },
  { t: "00:11:18", level: "info", source: "cmd", msg: "/duty panel created in #shift-control" },
  { t: "00:10:51", level: "info", source: "cmd", msg: "/userinfo for user 401123… returned in 78ms" },
  { t: "00:10:32", level: "warn", source: "scheduler", msg: "weeklyreport cron tick skipped (not Sunday)" },
  { t: "00:10:11", level: "info", source: "gw", msg: "heartbeat ack · latency 42ms" },
  { t: "00:09:58", level: "info", source: "cmd", msg: "/8ball by user 991028… answered 'Without a doubt.'" },
  { t: "00:09:34", level: "info", source: "duty", msg: "user 729811… clocked IN at Highway Patrol HQ · shift #4290" },
  { t: "00:09:12", level: "info", source: "cmd", msg: "/avatar for user 102998…" },
  { t: "00:08:50", level: "info", source: "mod", msg: "/clear 25 in #spam-traps by mod 401123…" },
  { t: "00:08:21", level: "info", source: "cmd", msg: "/ping → 38ms (gateway) · 91ms (rest)" },
];

const ERRORS = [
  {
    id: "e_4012",
    when: "00:12:08",
    cmd: "/sheetstyle",
    guild: "บริษัท Pacific Logistics",
    user: "401123…",
    msg: "403 The caller does not have permission",
    stack: "GaxiosError: 403\n  at Gaxios._request (gaxios.js:147)\n  at process.processTicksAndRejections\n  at Sheets.spreadsheets.batchUpdate",
    count: 3,
    status: "open",
  },
  {
    id: "e_4011",
    when: "Y-2 22:48",
    cmd: "/remind",
    guild: "RP · Bangkok Underground",
    user: "552901…",
    msg: "TypeError: Cannot read properties of undefined (reading 'send')",
    stack: "TypeError: …\n  at Object.execute (commands/remind.js:84)\n  at Client.<anonymous> (events/interactionCreate.js:32)",
    count: 12,
    status: "open",
  },
  {
    id: "e_3998",
    when: "Y-3 14:11",
    cmd: "—",
    guild: "—",
    user: "—",
    msg: "DiscordAPIError[10008]: Unknown Message (deleting a deleted message)",
    stack: "DiscordAPIError[10008] at Bucket.run …",
    count: 41,
    status: "ignored",
  },
  {
    id: "e_3902",
    when: "Y-5 09:02",
    cmd: "/qr",
    guild: "Saint Andrews PD",
    user: "884330…",
    msg: "RangeError: Maximum data length exceeded (qrcode)",
    stack: "RangeError: …\n  at QRCodeImpl.makeImpl (qrcode/lib/core/qrcode.js:267)",
    count: 1,
    status: "resolved",
  },
];

const MOD_ACTIONS = [
  { t: "00:13:42", action: "timeout", target: "user 661044…", mod: "you", guild: "RP · Bangkok Underground", reason: "spam in #general", duration: "5m" },
  { t: "00:08:50", action: "clear", target: "#spam-traps", mod: "you", guild: "Pacific Logistics", reason: "—", duration: "25 msgs" },
  { t: "Y-1 21:14", action: "warn", target: "user 770923…", mod: "mod 401…", guild: "RP · Bangkok Underground", reason: "advertising", duration: "—" },
  { t: "Y-1 19:02", action: "ban", target: "user 994411…", mod: "you", guild: "Highway Patrol HQ", reason: "alt account / evasion", duration: "perm" },
  { t: "Y-1 17:48", action: "timeout", target: "user 552901…", mod: "mod 401…", guild: "RP · Bangkok Underground", reason: "caps lock", duration: "10m" },
  { t: "Y-1 11:33", action: "kick", target: "user 339022…", mod: "mod 401…", guild: "Saint Andrews PD", reason: "inactive — 30d", duration: "—" },
  { t: "Y-2 22:48", action: "role", target: "user 552901…", mod: "you", guild: "RP · Bangkok Underground", reason: "verified +Citizen", duration: "—" },
  { t: "Y-2 16:21", action: "lock", target: "#announcements", mod: "you", guild: "Pacific Logistics", reason: "read-only post", duration: "—" },
  { t: "Y-3 09:14", action: "warn", target: "user 661044…", mod: "you", guild: "RP · Bangkok Underground", reason: "rule 3 · OOC in IC channel", duration: "—" },
];

const TOP_USERS = [
  { rank: 1, id: "401123…", name: "ake", commands: 1283, hours: 184.2, badge: "owner" },
  { rank: 2, id: "552901…", name: "nine", commands: 974, hours: 142.8, badge: null },
  { rank: 3, id: "661044…", name: "noi", commands: 812, hours: 98.4, badge: null },
  { rank: 4, id: "884330…", name: "pim", commands: 612, hours: 76.1, badge: null },
  { rank: 5, id: "729811…", name: "tar", commands: 487, hours: 64.9, badge: null },
  { rank: 6, id: "991028…", name: "bell", commands: 412, hours: 51.0, badge: null },
  { rank: 7, id: "728112…", name: "kong", commands: 388, hours: 48.3, badge: null },
  { rank: 8, id: "102998…", name: "ploy", commands: 332, hours: 41.7, badge: null },
];

// Generate sparkline / chart data
function genLatency(n = 60) {
  const out = [];
  let v = 42;
  for (let i = 0; i < n; i++) {
    v += (Math.random() - 0.5) * 10;
    v = Math.max(28, Math.min(120, v));
    if (i === 38) v = 168; // a spike
    if (i === 39) v = 88;
    out.push(Math.round(v));
  }
  return out;
}

function genCommandsByHour() {
  // last 24h, hourly buckets
  const hrs = Array.from({ length: 24 }, (_, i) => {
    const base = 60 + Math.sin((i - 6) * 0.4) * 50 + Math.random() * 40;
    return Math.max(8, Math.round(base));
  });
  // pretend now is hour 14 — taper the tail
  return hrs.map((h, i) => (i > 14 ? Math.round(h * 0.15) : h));
}

const LATENCY = genLatency(60);
const COMMANDS_HOURLY = genCommandsByHour();

const SETTINGS = {
  prefix: "/",
  language: "th",
  timezone: "Asia/Bangkok",
  ownerOnlyShellCommands: true,
  logChannel: "#bot-log",
  errorChannel: "#bot-errors",
  weeklyReportDay: "Sunday",
  weeklyReportTime: "20:00",
  intents: ["Guilds", "GuildMessages", "MessageContent", "GuildMembers", "GuildVoiceStates", "GuildModeration"],
  sheets: {
    enabled: true,
    spreadsheet: "Shift Log · May 2026",
    spreadsheetId: "1A2bC…xY9",
    serviceAccount: "shift-bot@duty-1234.iam.gserviceaccount.com",
  },
};

Object.assign(window, {
  BOT, COMMAND_CATEGORIES, ALL_COMMANDS, TOTAL_COMMANDS, TOTAL_USES_24H, TOTAL_USES_ALL,
  GUILDS, COGS, LOGS, ERRORS, MOD_ACTIONS, TOP_USERS, LATENCY, COMMANDS_HOURLY, SETTINGS,
});
