import BoardPost from '../../../models/boardPost.js'
import { requireAuth } from '../../../utils/auth.js'
import { validateBody } from '../../../utils/validateBody.js'
import { boardPostUpdateSchema } from '../../../utils/schemas.js'

export default defineEventHandler(async (event) => {
  const member = await requireAuth(event)
  const id = getRouterParam(event, 'id')

  const body = await validateBody(event, boardPostUpdateSchema)

  const post = await BoardPost.findById(id)
  if (!post) {
    throw createError({ statusCode: 404, statusMessage: 'Post not found' })
  }

  if (post.author.toString() !== member._id.toString()) {
    throw createError({ statusCode: 403, statusMessage: 'Not authorized to edit this post' })
  }

  if (body.title !== undefined) post.title = body.title
  if (body.seeking !== undefined) post.seeking = body.seeking
  if (body.offering !== undefined) post.offering = body.offering
  if (body.note !== undefined) post.note = body.note
  if (body.tags !== undefined) post.tags = body.tags

  const seeking = (post.seeking || '').trim()
  const offering = (post.offering || '').trim()
  if (!seeking && !offering) {
    throw createError({
      statusCode: 400,
      statusMessage: 'At least one of seeking or offering must be provided'
    })
  }

  try {
    await post.save()
  } catch (err) {
    if (err.name === 'ValidationError') {
      throw createError({
        statusCode: 400,
        statusMessage: 'Validation failed',
        data: err.errors
      })
    }
    throw err
  }

  await post.populate('author', 'name avatar circle board.slackHandle')

  return { post: post.toObject() }
})
