import { NextRequest, NextResponse } from 'next/server'
import { getSessionUser, unauthorized, forbidden } from '@/lib/sessionUser'
import { prisma } from '@/lib/prisma'

const INCLUDE = {
  processNode: { select: { id: true, name: true } },
  documents: { select: { id: true, name: true, url: true, size: true } },
} as const

export async function GET(_req: NextRequest, { params }: { params: { id: string } }) {
  const u = await getSessionUser()
  if (!u) return unauthorized()
  const id = parseInt(params.id)
  const activity = await prisma.processActivity.findUnique({ where: { id }, include: INCLUDE })
  if (!activity) return NextResponse.json({ error: 'No encontrado' }, { status: 404 })
  return NextResponse.json(activity)
}

export async function PUT(req: NextRequest, { params }: { params: { id: string } }) {
  const u = await getSessionUser()
  if (!u) return unauthorized()
  if (!u.canEdit) return forbidden()

  const id = parseInt(params.id)
  const body = await req.json()
  const {
    name, processType, projectAssoc, areaValue,
    leader, responsible, support, priority, complexity,
    observations, outputType, gantt, status, order,
  } = body

  const activity = await prisma.processActivity.update({
    where: { id },
    data: {
      name,
      processType: processType || null,
      projectAssoc: projectAssoc || null,
      areaValue: areaValue || null,
      leader: leader || null,
      responsible: responsible || null,
      support: support || null,
      priority: priority || 'ALTA',
      complexity: complexity || null,
      observations: observations || null,
      outputType: outputType || null,
      gantt: gantt || null,
      status: status || 'PENDIENTE',
      order: parseInt(String(order ?? 0)) || 0,
    },
    include: INCLUDE,
  })

  await prisma.auditLog.create({
    data: { userId: u.userId, action: 'UPDATE_ACTIVITY', entity: 'ProcessActivity', entityId: id, details: name },
  })

  return NextResponse.json(activity)
}

export async function PATCH(req: NextRequest, { params }: { params: { id: string } }) {
  const u = await getSessionUser()
  if (!u) return unauthorized()
  if (!u.canEdit) return forbidden()

  const id = parseInt(params.id)
  const { status } = await req.json()
  const activity = await prisma.processActivity.update({ where: { id }, data: { status }, include: INCLUDE })
  return NextResponse.json(activity)
}

export async function DELETE(_req: NextRequest, { params }: { params: { id: string } }) {
  const u = await getSessionUser()
  if (!u) return unauthorized()
  if (!u.canEdit) return forbidden()

  const id = parseInt(params.id)
  const activity = await prisma.processActivity.findUnique({ where: { id } })
  if (!activity) return NextResponse.json({ error: 'No encontrado' }, { status: 404 })

  await prisma.processActivity.delete({ where: { id } })

  await prisma.auditLog.create({
    data: { userId: u.userId, action: 'DELETE_ACTIVITY', entity: 'ProcessActivity', entityId: id, details: activity.name },
  })

  return NextResponse.json({ ok: true })
}
