import { NextRequest, NextResponse } from 'next/server'
import { db } from '@/lib/db'
import { requireAuth } from '@/lib/api-auth'
import { notifyUsers } from '@/lib/notifications'
import { sendReviewResponseEmail } from '@/lib/email'

export async function PUT(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const authResult = await requireAuth(['SUPERVISOR', 'MANAGER', 'ADMIN'])(request)
    if ('error' in authResult) return authResult.error

    const { user } = authResult
    const { id } = await params
    const body = await request.json()
    const { actionTaken, internalNote, responseToClient } = body

    if (!actionTaken || !responseToClient) {
      return NextResponse.json(
        { error: 'Acciones tomadas y respuesta al cliente son requeridas' },
        { status: 400 }
      )
    }

    const review = await db.review.findFirst({
      where: { id, deletedAt: null },
      include: { 
        customer: { select: { id: true, name: true, email: true } },
      },
    })

    if (!review) {
      return NextResponse.json(
        { error: 'Reseña no encontrada' },
        { status: 404 }
      )
    }

    // Create the supervisor response (allow multiple responses for follow-ups)
    const response = await db.supervisorResponse.create({
      data: {
        reviewId: id,
        supervisorId: user.id,
        actionTaken: actionTaken.trim(),
        internalNote: internalNote?.trim() || '',
        responseToClient: responseToClient.trim(),
      },
    })

    await db.review.update({
      where: { id },
      data: {
        status: 'RESOLVED',
        resolvedAt: new Date(),
        notifiedAt: review.notifiedAt || new Date(),
      },
    })

    // Notify the customer about the response
    await notifyUsers({
      userIds: [review.customerId],
      title: 'Respuesta a su reseña',
      message: `Su reseña ${review.reviewCode} ha recibido una respuesta. ${responseToClient}`,
      type: 'RESPONSE_TO_CLIENT',
      reviewId: review.id,
    })

    // Send email notification to the customer (non-blocking)
    sendReviewResponseEmail({
      to: review.customer.email,
      customerName: review.customer.name,
      reviewCode: review.reviewCode,
      reviewTitle: review.title,
      supervisorName: user.name,
      responseToClient: responseToClient.trim(),
    }).catch((err) => {
      console.error('Failed to send review response email:', err)
    })

    return NextResponse.json({ response })
  } catch (error) {
    console.error('Error al responder reseña:', error)
    return NextResponse.json(
      { error: 'Error interno del servidor' },
      { status: 500 }
    )
  }
}
