import { NextRequest, NextResponse } from 'next/server'
import { createClient } from '@/lib/supabase/server'
import { createClient as createAdminAuth } from '@supabase/supabase-js'

function adminClient() {
  return createAdminAuth(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.SUPABASE_SERVICE_ROLE_KEY!,
    { auth: { autoRefreshToken: false, persistSession: false } }
  )
}

// Verificar que el caller es admin
async function verificarAdmin() {
  const supabase = await createClient()
  const { data: { user } } = await supabase.auth.getUser()
  if (!user) return null
  const { data: perfil } = await supabase.from('perfiles').select('rol').eq('id', user.id).single()
  return perfil?.rol === 'admin' ? user : null
}

// GET /api/admin/usuarios — listar todos los usuarios con sus citas
export async function GET() {
  const admin = await verificarAdmin()
  if (!admin) return NextResponse.json({ error: 'Sin permisos' }, { status: 403 })

  const client = adminClient()

  // Obtener usuarios de Auth
  const { data: { users }, error: authErr } = await client.auth.admin.listUsers()
  if (authErr) return NextResponse.json({ error: authErr.message }, { status: 500 })

  // Obtener perfiles con conteo de citas
  const { data: perfiles } = await client
    .from('perfiles')
    .select('*, citas:citas(count)')
    .order('created_at', { ascending: false })

  // Unir auth users con perfiles
  const usuarios = (perfiles ?? []).map(p => {
    const authUser = users.find(u => u.id === p.id)
    return {
      ...p,
      email: authUser?.email ?? '',
      ultimo_acceso: authUser?.last_sign_in_at ?? null,
      creado_en: authUser?.created_at ?? p.created_at,
      total_citas: (p.citas as any)?.[0]?.count ?? 0,
    }
  })

  return NextResponse.json({ usuarios })
}

// PATCH /api/admin/usuarios — cambiar contraseña o rol
export async function PATCH(req: NextRequest) {
  const admin = await verificarAdmin()
  if (!admin) return NextResponse.json({ error: 'Sin permisos' }, { status: 403 })

  const { userId, password, rol, nombre, telefono } = await req.json()
  if (!userId) return NextResponse.json({ error: 'Falta userId' }, { status: 400 })

  const client = adminClient()
  const updates: Record<string, any> = {}

  // Cambiar contraseña en Auth
  if (password) {
    if (password.length < 6) return NextResponse.json({ error: 'Mínimo 6 caracteres' }, { status: 400 })
    const { error } = await client.auth.admin.updateUserById(userId, { password })
    if (error) return NextResponse.json({ error: error.message }, { status: 500 })
  }

  // Actualizar perfil
  if (rol)     updates.rol = rol
  if (nombre)  updates.nombre = nombre
  if (telefono !== undefined) updates.telefono = telefono || null

  if (Object.keys(updates).length > 0) {
    const { error } = await client.from('perfiles').update(updates).eq('id', userId)
    if (error) return NextResponse.json({ error: error.message }, { status: 500 })
  }

  return NextResponse.json({ ok: true })
}
