import { NextResponse } from 'next/server'
import { mcpServerRepo } from '@/lib/database/repositories/mcp-server.repo'
import { isAuthError, requireUser } from '@/lib/auth/session'

export async function GET(_req: Request, { params }: { params: Promise<{ id: string }> }) {
  let user
  try { user = await requireUser() } catch (err) { if (isAuthError(err)) return err; throw err }
  const { id } = await params
  const server = mcpServerRepo.findByIdAndUser(id, user.id)
  if (!server) return NextResponse.json({ error: 'Not found' }, { status: 404 })
  return NextResponse.json(server)
}

export async function PATCH(req: Request, { params }: { params: Promise<{ id: string }> }) {
  let user
  try { user = await requireUser() } catch (err) { if (isAuthError(err)) return err; throw err }
  const { id } = await params
  const body: Record<string, unknown> = await req.json()

  const fields: { name?: string; protocol?: string; config?: string; enabled?: boolean; status?: string } = {}
  if (typeof body.name === 'string') fields.name = body.name
  if (typeof body.protocol === 'string') fields.protocol = body.protocol
  if (body.config !== undefined) fields.config = JSON.stringify(body.config)
  if (typeof body.enabled === 'boolean') fields.enabled = body.enabled
  if (typeof body.status === 'string') fields.status = body.status

  if (Object.keys(fields).length === 0) {
    return NextResponse.json({ error: 'No fields to update' }, { status: 400 })
  }

  mcpServerRepo.updateFields(id, user.id, fields)
  const server = mcpServerRepo.findByIdAndUser(id, user.id)
  if (!server) return NextResponse.json({ error: 'Not found' }, { status: 404 })
  return NextResponse.json(server)
}

export async function DELETE(_req: Request, { params }: { params: Promise<{ id: string }> }) {
  let user
  try { user = await requireUser() } catch (err) { if (isAuthError(err)) return err; throw err }
  const { id } = await params
  mcpServerRepo.deleteByIdAndUser(id, user.id)
  return NextResponse.json({ ok: true })
}
