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

async function getDescendantIds(nodeId: number): Promise<number[]> {
  const children = await prisma.processNode.findMany({
    where: { parentId: nodeId },
    select: { id: true },
  })
  const ids: number[] = [nodeId]
  for (const child of children) {
    ids.push(...await getDescendantIds(child.id))
  }
  return ids
}

export async function GET(req: NextRequest) {
  const u = await getSessionUser()
  if (!u) return unauthorized()

  const { searchParams } = new URL(req.url)
  const nodeId = parseInt(searchParams.get('nodeId') ?? '0')
  const includeDescendants = searchParams.get('includeDescendants') === 'true'

  if (!nodeId) return NextResponse.json([])

  const nodeIds = includeDescendants ? await getDescendantIds(nodeId) : [nodeId]

  const activities = await prisma.processActivity.findMany({
    where: { processNodeId: { in: nodeIds } },
    orderBy: [{ processNodeId: 'asc' }, { order: 'asc' }, { name: 'asc' }],
    include: {
      processNode: { select: { id: true, name: true } },
      documents: { select: { id: true, name: true, url: true, size: true } },
    },
  })

  return NextResponse.json(activities)
}

export async function POST(req: NextRequest) {
  const u = await getSessionUser()
  if (!u) return unauthorized()
  if (!u.canEdit) return forbidden()

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

  if (!name || !processNodeId) {
    return NextResponse.json({ error: 'Nombre y proceso requeridos' }, { status: 400 })
  }

  const activity = await prisma.processActivity.create({
    data: {
      name,
      processNodeId: parseInt(String(processNodeId)),
      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: {
      processNode: { select: { id: true, name: true } },
      documents: { select: { id: true, name: true, url: true, size: true } },
    },
  })

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

  return NextResponse.json(activity, { status: 201 })
}
