import { NextRequest, NextResponse } from 'next/server'
import { auth } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import { getPresignedUrl, BUCKET_NAME } from '@/lib/minio'

export async function POST(request: NextRequest): Promise<NextResponse> {
  const session = await auth()

  if (!session?.user?.id) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
  }

  try {
    const body = await request.json()
    const { projectId, fileIds } = body as {
      projectId?: string
      fileIds?: string[]
    }

    if (!projectId || !fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {
      return NextResponse.json(
        { error: 'projectId and fileIds array are required' },
        { status: 400 }
      )
    }

    const userId = session.user.id
    const userRole = session.user.role

    // Authorization: must be admin or assigned jury/mentor for this project
    const isAdmin = userRole === 'SUPER_ADMIN' || userRole === 'PROGRAM_ADMIN'

    if (!isAdmin) {
      // Check if user is assigned as jury
      const juryAssignment = await prisma.assignment.findFirst({
        where: {
          userId,
          projectId,
        },
      })

      // Check if user is assigned as mentor
      const mentorAssignment = await prisma.mentorAssignment.findFirst({
        where: {
          mentorId: userId,
          projectId,
        },
      })

      if (!juryAssignment && !mentorAssignment) {
        return NextResponse.json(
          { error: 'You do not have access to this project\'s files' },
          { status: 403 }
        )
      }
    }

    // Fetch file metadata from DB
    const files = await prisma.projectFile.findMany({
      where: {
        id: { in: fileIds },
        projectId,
      },
      select: {
        id: true,
        fileName: true,
        objectKey: true,
        mimeType: true,
        size: true,
      },
    })

    if (files.length === 0) {
      return NextResponse.json(
        { error: 'No matching files found' },
        { status: 404 }
      )
    }

    // Generate signed download URLs for each file
    const downloadUrls = await Promise.all(
      files.map(async (file) => {
        try {
          const downloadUrl = await getPresignedUrl(
            BUCKET_NAME,
            file.objectKey,
            'GET',
            3600 // 1 hour expiry for bulk downloads
          )

          return {
            id: file.id,
            fileName: file.fileName,
            mimeType: file.mimeType,
            size: file.size,
            downloadUrl,
          }
        } catch (error) {
          console.error(`[BulkDownload] Failed to get URL for file ${file.id}:`, error)
          return {
            id: file.id,
            fileName: file.fileName,
            mimeType: file.mimeType,
            size: file.size,
            downloadUrl: null,
            error: 'Failed to generate download URL',
          }
        }
      })
    )

    return NextResponse.json({
      projectId,
      files: downloadUrls,
      expiresIn: 3600,
    })
  } catch (error) {
    console.error('[BulkDownload] Error:', error)
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    )
  }
}
