import { NextRequest, NextResponse } from 'next/server'
import { createClient } from '@/lib/supabase/server'
import { createAdminClient } from '@/lib/supabase/admin'
import { crearEventoCalendario } from '@/lib/google-calendar/slots'
import { enviarConfirmacionCita } from '@/lib/email'
import { addMinutes, parseISO } from 'date-fns'

// POST /api/citas — Crear nueva cita
export async function POST(req: NextRequest) {
  try {
    const supabase = await createClient()
    const { data: { user } } = await supabase.auth.getUser()

    if (!user) {
      return NextResponse.json({ error: 'No autenticado' }, { status: 401 })
    }

    const body = await req.json()
    const { barbero_id, servicio_id, fecha_inicio, notas } = body

    if (!barbero_id || !servicio_id || !fecha_inicio) {
      return NextResponse.json({ error: 'Faltan campos requeridos' }, { status: 400 })
    }

    // Obtener servicio para calcular fecha_fin
    const { data: servicio } = await supabase
      .from('servicios')
      .select('*')
      .eq('id', servicio_id)
      .single()

    if (!servicio) {
      return NextResponse.json({ error: 'Servicio no encontrado' }, { status: 404 })
    }

    const fechaInicio = parseISO(fecha_inicio)
    const fechaFin = addMinutes(fechaInicio, servicio.duracion_min)

    // Obtener barbero y perfil del cliente
    const [{ data: barbero }, { data: perfil }] = await Promise.all([
      supabase.from('barberos').select('*').eq('id', barbero_id).single(),
      supabase.from('perfiles').select('*').eq('id', user.id).single(),
    ])

    if (!barbero) {
      return NextResponse.json({ error: 'Barbero no encontrado' }, { status: 404 })
    }

    // Verificar que el slot sigue disponible (doble check)
    const adminClient = createAdminClient()
    const { data: citasExistentes } = await adminClient
      .from('citas')
      .select('id')
      .eq('barbero_id', barbero_id)
      .neq('estado', 'cancelada')
      .lt('fecha_inicio', fechaFin.toISOString())
      .gt('fecha_fin', fechaInicio.toISOString())

    if (citasExistentes && citasExistentes.length > 0) {
      return NextResponse.json({ error: 'El horario ya no está disponible' }, { status: 409 })
    }

    // Crear evento en Google Calendar
    let googleEventId: string | null = null
    try {
      googleEventId = await crearEventoCalendario({
        titulo: `${servicio.nombre} — ${perfil?.nombre ?? user.email}`,
        descripcion: `Cliente: ${perfil?.nombre ?? user.email}\nBarbero: ${barbero.nombre}\nServicio: ${servicio.nombre}${notas ? `\nNotas: ${notas}` : ''}`,
        inicio: fechaInicio.toISOString(),
        fin: fechaFin.toISOString(),
        emailCliente: user.email ?? undefined,
      })
    } catch (err) {
      console.error('Error creando evento en Google Calendar:', err)
      // No bloqueamos la cita si falla el calendario
    }

    // Guardar cita en Supabase
    const { data: cita, error } = await adminClient
      .from('citas')
      .insert({
        cliente_id: user.id,
        barbero_id,
        servicio_id,
        fecha_inicio: fechaInicio.toISOString(),
        fecha_fin: fechaFin.toISOString(),
        estado: 'confirmada',
        notas: notas ?? null,
        google_event_id: googleEventId,
      })
      .select()
      .single()

    if (error) {
      return NextResponse.json({ error: error.message }, { status: 500 })
    }

    // Crear registro en historial
    await adminClient.from('historial_cortes').insert({
      cliente_id: user.id,
      cita_id: cita.id,
      barbero_id,
      servicio_id,
      fecha: fechaInicio.toISOString().split('T')[0],
    })

    // Enviar email de confirmación
    if (user.email && perfil) {
      try {
        await enviarConfirmacionCita({
          emailCliente: user.email,
          nombreCliente: perfil.nombre,
          nombreBarbero: barbero.nombre,
          servicio: servicio.nombre,
          fechaInicio: fechaInicio.toISOString(),
          fechaFin: fechaFin.toISOString(),
          citaId: cita.id,
        })
      } catch (err) {
        console.error('Error enviando email:', err)
      }
    }

    return NextResponse.json({ cita }, { status: 201 })
  } catch (err) {
    console.error(err)
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 })
  }
}

// GET /api/citas — Obtener citas del usuario (o todas para admin)
export async function GET(req: NextRequest) {
  try {
    const supabase = await createClient()
    const { data: { user } } = await supabase.auth.getUser()

    if (!user) {
      return NextResponse.json({ error: 'No autenticado' }, { status: 401 })
    }

    const { searchParams } = new URL(req.url)
    const estado = searchParams.get('estado')

    const { data: perfil } = await supabase
      .from('perfiles')
      .select('rol')
      .eq('id', user.id)
      .single()

    let query = supabase
      .from('citas')
      .select(`
        *,
        perfil:perfiles(nombre, telefono),
        barbero:barberos(nombre, foto_url),
        servicio:servicios(nombre, duracion_min, precio)
      `)
      .order('fecha_inicio', { ascending: true })

    if (perfil?.rol !== 'admin' && perfil?.rol !== 'barbero') {
      query = query.eq('cliente_id', user.id)
    }

    if (estado) {
      query = query.eq('estado', estado)
    }

    const { data: citas, error } = await query

    if (error) {
      return NextResponse.json({ error: error.message }, { status: 500 })
    }

    return NextResponse.json({ citas })
  } catch (err) {
    console.error(err)
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 })
  }
}
