// Mock data for 堆堆 (DuiDui) - 繪師接案平台

const ARTIST_NAMES = [
  "紙卷貓貓", "墨水兔", "夜燈少女", "森野小鹿", "青苔筆記", "月光糖",
  "雲朵工坊", "橘色檸檬", "薄荷鯨魚", "霧氣蛋糕", "鋼筆海豚", "番茄畫室",
  "星塵兔子", "布丁狼", "紙飛機少年", "水彩瓶", "山嵐色鉛筆", "蒲公英兒",
  "牛奶咖啡", "黑貓研究所"
];
const CLIENT_NAMES = [
  "王小明", "陳雅婷", "林志豪", "張佩琪", "李建宏", "黃思涵", "吳俊傑",
  "蔡佳穎", "楊承恩", "鄭家瑋", "謝雨柔", "曾柏翰", "許芷涵", "周冠宇",
  "蘇映彤", "劉廷威", "彭妤珊"
];
const ORDER_TYPES = ["Q版立繪", "半身彩圖", "全身立繪", "表情差分", "Live2D 建模", "漫畫分鏡", "LOGO 設計", "頭像", "表情包"];
const TAGS = ["二次元", "寫實", "國風", "Q版", "治癒", "科幻", "奇幻", "少女", "BL", "原創"];

function seed(i, mod) { return ((i * 9301 + 49297) % mod); }

const USERS = [
  ...ARTIST_NAMES.map((name, i) => ({
    id: "U" + String(10237 + i).padStart(6, "0"),
    name,
    role: "artist",
    avatar: { hue: seed(i, 360), glyph: name[0] },
    email: `${name.replace(/\s/g,"").toLowerCase().slice(0,6)}${i}@mail.com`,
    phone: `09${String(10000000 + seed(i, 89999999)).slice(0, 8)}`,
    bankAccount: `822-${String(seed(i, 9999)).padStart(4,"0")}-${String(seed(i*3, 9999)).padStart(4,"0")}-${String(seed(i*7, 9999)).padStart(4,"0")}`,
    joinedAt: `2024-${String(1 + (i % 12)).padStart(2,"0")}-${String(3 + (i % 25)).padStart(2,"0")}`,
    status: i === 2 ? "suspended" : i === 5 ? "pending" : "active",
    level: ["新手", "認證創作者", "金牌創作者", "鑽石創作者"][i % 4],
    orders: 12 + seed(i, 180),
    rating: (4.2 + (seed(i, 80) / 100)).toFixed(2),
    revenue: 18000 + seed(i*13, 480000),
    tags: [TAGS[i % TAGS.length], TAGS[(i+3) % TAGS.length]],
    kycVerified: i !== 5,
  })),
  ...CLIENT_NAMES.map((name, i) => ({
    id: "U" + String(30480 + i).padStart(6, "0"),
    name,
    role: "client",
    avatar: { hue: (seed(i, 360) + 120) % 360, glyph: name[0] },
    email: `${name.charCodeAt(0).toString(16)}${i}@gmail.com`,
    phone: `09${String(20000000 + seed(i+7, 79999999)).slice(0, 8)}`,
    bankAccount: `013-${String(seed(i+11, 9999)).padStart(4,"0")}-${String(seed(i*5, 9999)).padStart(4,"0")}-${String(seed(i*9, 9999)).padStart(4,"0")}`,
    joinedAt: `2024-${String(1 + (i % 12)).padStart(2,"0")}-${String(3 + (i % 25)).padStart(2,"0")}`,
    status: i === 3 ? "suspended" : "active",
    level: ["一般", "VIP", "SVIP"][i % 3],
    orders: 2 + seed(i*5, 40),
    rating: null,
    revenue: 0,
    spent: 3200 + seed(i*17, 98000),
    tags: [],
    kycVerified: true,
  })),
];

const ORDERS = Array.from({ length: 32 }, (_, i) => {
  const artist = USERS[i % ARTIST_NAMES.length];
  const client = USERS[ARTIST_NAMES.length + (i % CLIENT_NAMES.length)];
  const type = ORDER_TYPES[i % ORDER_TYPES.length];
  const amounts = [800, 1200, 1800, 2500, 3800, 5600, 8200, 12000, 18000];
  const amount = amounts[i % amounts.length];
  const statuses = ["draft", "in_progress", "review", "completed", "refund_requested", "refunded", "disputed"];
  // bias statuses
  const statusWeights = ["in_progress","in_progress","completed","completed","completed","review","refund_requested","disputed","refunded","draft","in_progress","completed"];
  const status = statusWeights[i % statusWeights.length];
  const createdDaysAgo = seed(i*3, 90);
  return {
    id: "#DD" + String(820450 + i).padStart(6, "0"),
    type,
    artistId: artist.id,
    artistName: artist.name,
    clientId: client.id,
    clientName: client.name,
    amount,
    platformFee: Math.round(amount * 0.10), // 3% 應援 + 7% 平台
    artistPayout: amount - Math.round(amount * 0.10),
    status,
    createdAt: `2026-04-${String(22 - (createdDaysAgo % 22)).padStart(2,"0")} ${String(9 + (i%10)).padStart(2,"0")}:${String((i*17)%60).padStart(2,"0")}`,
    deadline: `2026-05-${String(2 + (i%25)).padStart(2,"0")}`,
    progress: status === "completed" ? 100 : status === "review" ? 95 : status === "in_progress" ? 20 + seed(i, 70) : 0,
    milestones: status === "draft" ? 0 : status === "in_progress" ? 1 : 2,
    totalMilestones: 3,
    description: `委託內容:${type} · 預計交付 ${2 + (i%4)} 張成品`,
    tags: [artist.tags[0]].filter(Boolean),
  };
});

const CONTENT_ITEMS = Array.from({ length: 18 }, (_, i) => {
  const artist = USERS[i % ARTIST_NAMES.length];
  const statuses = ["published", "pending_review", "published", "published", "flagged", "published", "pending_review", "rejected"];
  return {
    id: "P" + String(7210 + i).padStart(5, "0"),
    title: `${artist.tags[0]}${ORDER_TYPES[i % ORDER_TYPES.length]}委託`,
    artistId: artist.id,
    artistName: artist.name,
    coverHue: seed(i*7, 360),
    price: [800, 1200, 1800, 2500, 3800, 5600][i % 6],
    status: statuses[i % statuses.length],
    views: 320 + seed(i*23, 9800),
    orders: seed(i, 45),
    createdAt: `2026-03-${String(1 + (i % 28)).padStart(2,"0")}`,
    tags: [TAGS[i % TAGS.length], TAGS[(i+4) % TAGS.length]],
    reports: statuses[i % statuses.length] === "flagged" ? 3 + (i % 5) : 0,
  };
});

const AUDIT_ACTIONS = [
  { type: "user.suspend", label: "封鎖用戶", severity: "high" },
  { type: "user.delete", label: "刪除用戶", severity: "critical" },
  { type: "order.refund", label: "訂單退款", severity: "high" },
  { type: "balance.adjust", label: "調整餘額", severity: "high" },
  { type: "admin.permission", label: "修改管理員權限", severity: "critical" },
  { type: "admin.create", label: "建立管理員", severity: "high" },
  { type: "content.remove", label: "下架作品", severity: "medium" },
  { type: "content.approve", label: "作品審核通過", severity: "low" },
  { type: "data.unmask", label: "查看敏感資料", severity: "medium" },
  { type: "data.export", label: "匯出資料", severity: "high" },
  { type: "settings.update", label: "修改系統設定", severity: "high" },
  { type: "login", label: "登入後台", severity: "low" },
];
const ADMIN_NAMES = ["你 (Super Admin)", "林佩芸", "陳冠翰", "Alex Chen", "黃俊凱", "王曉婷"];
const AUDIT_LOGS = Array.from({ length: 40 }, (_, i) => {
  const a = AUDIT_ACTIONS[i % AUDIT_ACTIONS.length];
  const adminName = ADMIN_NAMES[i % ADMIN_NAMES.length];
  const target = i % 3 === 0 ? USERS[i % USERS.length].name : i % 3 === 1 ? ORDERS[i % ORDERS.length].id : "系統";
  const hoursAgo = i * 0.7 + seed(i, 40) / 10;
  return {
    id: "L" + String(89210 + i).padStart(6, "0"),
    action: a.type,
    actionLabel: a.label,
    severity: a.severity,
    admin: adminName,
    adminAvatar: { hue: seed(i*11, 360), glyph: adminName[0] },
    target,
    targetType: i % 3 === 0 ? "user" : i % 3 === 1 ? "order" : "system",
    ip: `203.${140 + (i%50)}.${10+(i%200)}.${50+(i%200)}`,
    userAgent: "Chrome 132 · macOS",
    time: hoursAgo < 1 ? `${Math.floor(hoursAgo*60)} 分鐘前` : hoursAgo < 24 ? `${Math.floor(hoursAgo)} 小時前` : `${Math.floor(hoursAgo/24)} 天前`,
    timestamp: `2026-04-${String(22 - Math.min(21, Math.floor(hoursAgo/24))).padStart(2,"0")} ${String(14 - (i%14)).padStart(2,"0")}:${String((i*13)%60).padStart(2,"0")}:${String((i*7)%60).padStart(2,"0")}`,
    details: a.type === "user.suspend" ? "原因:多次違反平台規範" :
             a.type === "order.refund" ? `退款金額 NT$ ${(1200 + i*400).toLocaleString()}` :
             a.type === "balance.adjust" ? `+NT$ ${(500 + i*120).toLocaleString()}` :
             a.type === "admin.permission" ? "新增 Ops Admin 權限" :
             a.type === "data.unmask" ? "查看電話號碼" :
             a.type === "data.export" ? "匯出 342 筆訂單資料" :
             "—",
  };
});

const ADMINS = [
  { id: "A001", name: "tsechun", email: "tsechun@duidui.app", role: "super_admin", status: "active", lastLogin: "剛剛", mfa: true, createdAt: "2026-04-28" },
  { id: "A002", name: "chu", email: "chu@duidui.app", role: "super_admin", status: "active", lastLogin: "—", mfa: true, createdAt: "2026-05-02" },
];

const ROLES = {
  super_admin: { label: "Super Admin", color: "accent", desc: "完整系統權限,包含系統設定與管理員管理" },
  ops_admin: { label: "Ops Admin", color: "info", desc: "用戶、訂單、內容管理,無系統設定權限" },
  finance_admin: { label: "Finance Admin", color: "success", desc: "僅財務相關,無用戶訊息存取" },
  analyst: { label: "Analyst", color: "warn", desc: "唯讀權限,可查看報表與資料" },
};

// KPIs (synthetic)
const KPIS = {
  gmv: { value: 4823690, delta: 12.4, label: "本月 GMV", unit: "NT$" },
  orders: { value: 1847, delta: 8.2, label: "新訂單", unit: "" },
  activeArtists: { value: 324, delta: 4.1, label: "活躍創作者", unit: "" },
  completionRate: { value: 94.2, delta: 1.3, label: "訂單完成率", unit: "%" },
  disputes: { value: 7, delta: -22, label: "進行中糾紛", unit: "" },
  avgOrderValue: { value: 2612, delta: 6.8, label: "客單價", unit: "NT$" },
};

// Revenue sparkline data (30 days)
const REV_SERIES = Array.from({ length: 30 }, (_, i) => {
  const base = 110000 + Math.sin(i / 3) * 30000 + i * 2400;
  return Math.round(base + seed(i, 22000) - 11000);
});

const ORDER_SERIES = Array.from({ length: 30 }, (_, i) => {
  return Math.round(40 + Math.cos(i / 4) * 12 + (seed(i*3, 30) - 15));
});

// Category breakdown
const CATEGORY_BREAKDOWN = [
  { label: "半身彩圖", value: 1240000, pct: 32.4 },
  { label: "Q版立繪", value: 820000, pct: 21.4 },
  { label: "全身立繪", value: 680000, pct: 17.7 },
  { label: "Live2D 建模", value: 520000, pct: 13.6 },
  { label: "表情差分", value: 310000, pct: 8.1 },
  { label: "其他", value: 250000, pct: 6.8 },
];

// Finance reconciliation
const RECON_ROWS = [];

// ====== Creator Applications ======
const APPLICATIONS = [];

// ====== Content moderation reports ======
const REPORT_REASONS = [
  { key: "copyright", label: "版權疑慈" },
  { key: "nsfw", label: "不雅內容" },
  { key: "ai_undeclared", label: "使用 AI 未標示" },
  { key: "harassment", label: "騷擾 / 恐嚇" },
  { key: "scam", label: "詐騙 / 處外交易" },
  { key: "spam", label: "垃圾 / 重複發文" },
  { key: "misleading", label: "誤導性描述" },
  { key: "personal", label: "出社個人資料" },
];
const CONTENT_TYPES = {
  product: { label: "商品", icon: "palette", tone: "accent" },
  commission: { label: "接案需求", icon: "order", tone: "info" },
  post: { label: "貼文", icon: "message", tone: "default" },
  comment: { label: "留言", icon: "scroll", tone: "warn" },
};
const SAMPLE_TITLES = {
  product: ["半身彩圖委託", "Q版頭像套組", "遊戲角色設計", "VTuber 立繪", "表情差分包", "Live2D 建模"],
  commission: ["徵求遊戲主角插圖", "尋人繪製生日卡", "徵求漫展主視覺", "徵求童書插畫套組", "徵求品牌吉祥物設計"],
  post: ["今天的掂稿分享!", "接案開窗 限五位", "進度更新 第三次修正", "感謝新漢追蹤 抽獎活動", "分享最近完成的作品"],
  comment: ["「這個價格太黑心了吧...」", "「我覺得你用 AI 生成的 觸感不對」", "「能私下討論嗎?LINE xxx」", "「達不到真的會退全款嗎根本不可能」"],
};
const REPORTS = [];

window.MOCK = {
  USERS, ORDERS, CONTENT_ITEMS, AUDIT_LOGS, ADMINS, ROLES,
  KPIS, REV_SERIES, ORDER_SERIES, CATEGORY_BREAKDOWN, RECON_ROWS,
  ORDER_TYPES, TAGS, AUDIT_ACTIONS,
  APPLICATIONS,
  REPORTS, REPORT_REASONS, CONTENT_TYPES,
};

// Fetch real data from Supabase via admin API routes and patch window.MOCK
async function loadRealData() {
  try {
    const [usersRes, contentRes, statsRes, ordersRes] = await Promise.all([
      fetch("/api/admin/users"),
      fetch("/api/admin/content"),
      fetch("/api/admin/stats"),
      fetch("/api/admin/orders"),
    ]);

    if (usersRes.ok) {
      const realUsers = await usersRes.json();
      window.MOCK.USERS = Array.isArray(realUsers) ? realUsers : [];
    }

    if (ordersRes.ok) {
      const realOrders = await ordersRes.json();
      if (Array.isArray(realOrders)) {
        window.MOCK.ORDERS = realOrders;
      }
    }

    if (contentRes.ok) {
      const realContent = await contentRes.json();
      if (Array.isArray(realContent) && realContent.length > 0) {
        window.MOCK.CONTENT_ITEMS = realContent;
      }
    }

    if (statsRes.ok) {
      const stats = await statsRes.json();
      if (typeof stats.artists === "number") {
        window.MOCK.KPIS.activeArtists.value = stats.artists;
      }
      if (typeof stats.products === "number") {
        window.MOCK.REAL_STATS = stats;
      }
    }
  } catch (e) {
    console.warn("[admin] Could not load real data, using mock:", e);
  }
}

window.loadRealData = loadRealData;

// Shared CSV export helper
window.csvDownload = function csvDownload(filename, headers, rows) {
  const escape = v => {
    const s = v == null ? "" : String(v);
    return s.includes(",") || s.includes('"') || s.includes("\n") ? `"${s.replace(/"/g, '""')}"` : s;
  };
  const csv = [headers, ...rows].map(r => r.map(escape).join(",")).join("\r\n");
  const blob = new Blob(["﻿" + csv], { type: "text/csv;charset=utf-8;" });
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url; a.download = filename; a.click();
  setTimeout(() => URL.revokeObjectURL(url), 1000);
};
