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}`)
  return res.json()
}

/**
 * 审核通过
 * 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()
}