const BASE = 'http://10.126.59.25:5713'  // 后端地址

/**
 * 获取待审核的帖子列表
 * POST /apostlist
 * @param {number|string} userId 平台管理员的用户 ID
 * @returns Promise<[ {id, title, status}, … ]>
 */
export async function fetchPosts(userId) {
  const res = await fetch(`${BASE}/apostlist`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId })
  })
  if (!res.ok) throw new Error(`fetchPosts: ${res.status}`)
  
  const json = await res.json()
  console.log('fetchPosts response:', json)         // debug: inspect shape

  // handle unauthorized
  if (json.status === 'error' && json.message === 'Unauthorized') {
    throw new Error('Unauthorized')
  }
  
  // normalize response into an array
  let list
  if (Array.isArray(json)) {
    list = json
  } else if (Array.isArray(json.data)) {
    list = json.data
  } else if (Array.isArray(json.posts)) {
    list = json.posts
  } else if (Array.isArray(json.data?.posts)) {
    list = json.data.posts
  } else {
    list = []
  }
  console.log('Normalized post list:', list) // debug: check final shape
  return list
}

/**
 * 审核通过
 * POST /areview
 */
export async function approvePost(postId, userId) {
  const res = await fetch(`${BASE}/areview`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, postid: postId, status: 'published' })
  })
  if (!res.ok) throw new Error(`approvePost: ${res.status}`)
  return res.json()
}

/**
 * 驳回
 * POST /areview
 */
export async function rejectPost(postId, userId) {
  const res = await fetch(`${BASE}/areview`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, postid: postId, status: 'rejected' })
  })
  if (!res.ok) throw new Error(`rejectPost: ${res.status}`)
  return res.json()
}

/**
 * 获取单个帖子详情
 * POST /agetpost
 * @param {number|string} postId 帖子 ID
 * @param {number|string} userId 平台管理员的用户 ID
 * @returns Promise<{id, title, content, status}>
 */
export async function fetchPost(postId, userId) {
  const res = await fetch(`${BASE}/agetpost`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, postid: postId })
  })
  if (!res.ok) throw new Error(`fetchPost: ${res.status}`)
  return res.json()
}

/**
 * 获取超级管理员用户列表
 * POST /sgetuserlist
 * @param {number|string} userId 平台管理员的用户 ID
 * @returns Promise<[ {id, name, role}, … ]>
 */
export async function fetchUserList(userId) {
  const res = await fetch(`${BASE}/sgetuserlist`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId })
  })
  if (!res.ok) throw new Error(`fetchUserList: ${res.status}`)
  return res.json()
}

export async function giveAdmin(userId, targetId) {
  const res = await fetch(`${BASE}/sgiveadmin`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, targetid: targetId })
  })
  if (!res.ok) throw new Error(`giveAdmin: ${res.status}`)
  return res.json()
}

export async function giveSuperAdmin(userId, targetId) {
  const res = await fetch(`${BASE}/sgivesuperadmin`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, targetid: targetId })
  })
  if (!res.ok) throw new Error(`giveSuperAdmin: ${res.status}`)
  return res.json()
}

export async function giveUser(userId, targetId) {
  const res = await fetch(`${BASE}/sgiveuser`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId, targetid: targetId })
  })
  if (!res.ok) throw new Error(`giveUser: ${res.status}`)
  return res.json()
}

/**
 * 获取事务日志
 * POST /getrecordlog
 * @param {number|string} userId 平台管理员的用户 ID
 * @returns Promise<[ {id, user_id, type, content, ip, created_at}, … ]>
 */
export async function fetchRecordLog(userId) {
  const res = await fetch(`${BASE}/getrecordlog`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId })
  })
  if (!res.ok) throw new Error(`fetchRecordLog: ${res.status}`)
  const json = await res.json()
  console.log('fetchRecordLog response:', json)
  if (json.status === 'error' && json.message === 'Unauthorized') {
    throw new Error('Unauthorized')
  }
  let list
  if (Array.isArray(json)) {
    list = json
  } else if (Array.isArray(json.data)) {
    list = json.data
  } else {
    list = []
  }
  console.log('Normalized record log list:', list)
  return list
}

/**
 * 获取系统性能消耗数据
 * POST /getsyscost
 * @param {number|string} userId 平台管理员的用户 ID
 * @returns Promise<[ {id, record_time, endpoint, elapsed_time, cpu_user, cpu_system, memory_rss}, … ]>
 */
export async function fetchSysCost(userId) {
  const res = await fetch(`${BASE}/getsyscost`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userid: userId })
  })
  if (!res.ok) throw new Error(`fetchSysCost: ${res.status}`)
  const json = await res.json()
  console.log('fetchSysCost response:', json)
  if (json.status === 'error' && json.message === 'Unauthorized') {
    throw new Error('Unauthorized')
  }
  let list
  if (Array.isArray(json)) {
    list = json
  } else if (Array.isArray(json.data)) {
    list = json.data
  } else {
    list = []
  }
  console.log('Normalized sys cost list:', list)
  return list
}