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(['ADMIN'])(request)
    if ('error' in authResult) return authResult.error

    // User counts
    const [
      totalUsers,
      totalCustomers,
      totalSupervisors,
      totalManagers,
      totalAdmins,
      activeUsers,
      inactiveUsers,
    ] = await Promise.all([
      db.user.count(),
      db.user.count({ where: { role: 'CUSTOMER' } }),
      db.user.count({ where: { role: 'SUPERVISOR' } }),
      db.user.count({ where: { role: 'MANAGER' } }),
      db.user.count({ where: { role: 'ADMIN' } }),
      db.user.count({ where: { isActive: true } }),
      db.user.count({ where: { isActive: false } }),
    ])

    // Review counts (excluding soft-deleted)
    const [
      totalReviews,
      pendingReviews,
      acknowledgedReviews,
      resolvedReviews,
      deletedReviews,
      negativeReviews,
      positiveReviews,
    ] = await Promise.all([
      db.review.count({ where: { deletedAt: null } }),
      db.review.count({ where: { status: 'PENDING', deletedAt: null } }),
      db.review.count({ where: { status: 'ACKNOWLEDGED', deletedAt: null } }),
      db.review.count({ where: { status: 'RESOLVED', deletedAt: null } }),
      db.review.count({ where: { deletedAt: { not: null } } }),
      db.review.count({ where: { sentiment: 'NEGATIVE', deletedAt: null } }),
      db.review.count({ where: { sentiment: 'POSITIVE', deletedAt: null } }),
    ])

    // Recent reviews (last 5)
    const recentReviews = await db.review.findMany({
      where: { deletedAt: null },
      select: {
        id: true,
        reviewCode: true,
        title: true,
        rating: true,
        sentiment: true,
        status: true,
        serviceType: true,
        createdAt: true,
        customer: { select: { id: true, name: true, email: true, company: true } },
        assignedTo: { select: { id: true, name: true, email: true } },
      },
      orderBy: { createdAt: 'desc' },
      take: 5,
    })

    // Users by role
    const usersByRoleRaw = await db.user.groupBy({
      by: ['role'],
      _count: { role: true },
    })

    const usersByRole = usersByRoleRaw.map((item) => ({
      role: item.role,
      count: item._count.role,
    }))

    return NextResponse.json({
      totalUsers,
      totalCustomers,
      totalSupervisors,
      totalManagers,
      totalAdmins,
      activeUsers,
      inactiveUsers,
      totalReviews,
      pendingReviews,
      acknowledgedReviews,
      resolvedReviews,
      deletedReviews,
      negativeReviews,
      positiveReviews,
      recentReviews,
      usersByRole,
    })
  } catch (error) {
    console.error('Error al obtener dashboard de admin:', error)
    return NextResponse.json(
      { error: 'Error interno del servidor' },
      { status: 500 }
    )
  }
}
