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

export async function GET(request: NextRequest) {
  try {
    const authResult = await requireAuth(['MANAGER'])(request)
    if ('error' in authResult) return authResult.error

    // Rating distribution overall
    const ratingDistribution: Record<number, { count: number; percentage: number }> = {}
    const totalReviews = await db.review.count({ where: { deletedAt: null } })

    for (let i = 1; i <= 5; i++) {
      const count = await db.review.count({ where: { rating: i, deletedAt: null } })
      ratingDistribution[i] = {
        count,
        percentage: totalReviews > 0 ? Math.round((count / totalReviews) * 1000) / 10 : 0,
      }
    }

    // Rating distribution by sentiment
    const positiveByRating: Record<number, number> = {}
    const negativeByRating: Record<number, number> = {}
    for (let i = 1; i <= 5; i++) {
      positiveByRating[i] = await db.review.count({
        where: { rating: i, sentiment: 'POSITIVE', deletedAt: null },
      })
      negativeByRating[i] = await db.review.count({
        where: { rating: i, sentiment: 'NEGATIVE', deletedAt: null },
      })
    }

    // Rating distribution by service type
    const reviewsByServiceType = await db.review.groupBy({
      by: ['serviceType', 'rating'],
      where: { deletedAt: null },
      _count: true,
    })

    const serviceTypeRatings: Record<string, Record<number, number>> = {}
    reviewsByServiceType.forEach((item) => {
      if (!serviceTypeRatings[item.serviceType]) {
        serviceTypeRatings[item.serviceType] = {}
      }
      serviceTypeRatings[item.serviceType][item.rating] = item._count
    })

    return NextResponse.json({
      totalReviews,
      ratingDistribution,
      bySentiment: {
        positive: positiveByRating,
        negative: negativeByRating,
      },
      byServiceType: serviceTypeRatings,
    })
  } catch (error) {
    console.error('Error en reporte de calificaciones:', error)
    return NextResponse.json(
      { error: 'Error interno del servidor' },
      { status: 500 }
    )
  }
}
