// src/api/posts.js
const BASE = 'http://192.168.5.235:5714'  // 如果有代理可以留空，否则填完整域名，如 'http://localhost:3000'

/**
 * 获取帖子列表
 * - GET /posts
 * - GET /posts?user_id=123
 *
 * @param {number?} userId 可选，传了就加 ?user_id= 用户 ID
 * @returns Promise<[{ id, title, status, heat, created_at }, …]>
 */
export async function fetchPosts(userId) {
  // 自动拼接 query
  const url = userId != null
    ? `${BASE}/posts?user_id=${encodeURIComponent(userId)}`
    : `${BASE}/posts`

  const res = await fetch(url)
  if (!res.ok) {
    throw new Error(`fetchPosts${userId != null ? `(user ${userId})` : ''}: ${res.status}`)
  }
  return res.json()
}

/**
 * 查看单个帖子详情
 * GET /posts/{postId}
 */
export async function fetchPost(postId) {
  const res = await fetch(`${BASE}/posts/${postId}`)
  if (!res.ok) throw new Error(`fetchPost(${postId}): ${res.status}`)
  return res.json()  // 返回完整的帖子对象
}

/**
 * 发布新帖
 * POST /posts
 */
export async function createPost(formData) {
  const res = await fetch(`${BASE}/posts`, {
    method: 'POST',
    // 不设置Content-Type，让浏览器自动设置multipart/form-data
    body: formData
  })
  if (!res.ok) {
    const err = await res.json().catch(() => null)
    throw new Error(err?.error || `createPost: ${res.status}`)
  }
  return res.json()  // { id }
}

/**
 * 修改帖子
 * PUT /posts/{postId}
 */
export async function updatePost(postId, formData) {
  const res = await fetch(`${BASE}/posts/${postId}`, {
    method: 'PUT',
    // 如果是FormData则不设置Content-Type，否则设置JSON
    headers: formData instanceof FormData ? {} : { 'Content-Type': 'application/json' },
    body: formData instanceof FormData ? formData : JSON.stringify(formData)
  })
  if (!res.ok) throw new Error(`updatePost(${postId}): ${res.status}`)
  // 204 No Content
}

/**
 * 删除帖子
 * DELETE /posts/{postId}
 */
export async function deletePost(postId) {
  const res = await fetch(`${BASE}/posts/${postId}`, {
    method: 'DELETE'
  })
  if (!res.ok) throw new Error(`deletePost(${postId}): ${res.status}`)
}

/**
 * 点赞
 * POST /posts/{postId}/like
 */
export async function likePost(postId, userId) {
  const res = await fetch(`${BASE}/posts/${postId}/like`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ user_id: userId })
  })
  if (!res.ok) {
    const err = await res.json().catch(() => null)
    throw new Error(err?.error || `likePost: ${res.status}`)
  }
}

/**
 * 取消点赞
 * DELETE /posts/{postId}/like
 */
export async function unlikePost(postId, userId) {
  const res = await fetch(`${BASE}/posts/${postId}/like`, {
    method: 'DELETE',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ user_id: userId })
  })
  if (!res.ok) {
    const err = await res.json().catch(() => null)
    throw new Error(err?.error || `unlikePost: ${res.status}`)
  }
}

/**
 * 收藏、取消收藏、浏览、分享 等接口：
 * POST   /posts/{postId}/favorite
 * DELETE /posts/{postId}/favorite
 * POST   /posts/{postId}/view
 * POST   /posts/{postId}/share
 * 用法同上，替换路径即可
 */

/**
 * 添加评论
 * POST /posts/{postId}/comments
 */
export async function addComment(postId, payload) {
  const res = await fetch(`${BASE}/posts/${postId}/comments`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(payload)
  })
  if (!res.ok) throw new Error(`addComment: ${res.status}`)
  return res.json()  // { id }
}

/**
 * 获取评论列表
 * GET /posts/{postId}/comments
 */
export async function fetchComments(postId) {
  const res = await fetch(`${BASE}/posts/${postId}/comments`)
  if (!res.ok) throw new Error(`fetchComments: ${res.status}`)
  return res.json()
}
