import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/db';

// GET - Obtener alineación por ID
export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    const { id } = await params;
    const alineacion = await prisma.alineacion.findUnique({
      where: { id },
      include: {
        evento: {
          select: {
            id: true,
            descripcion: true,
            fecha: true,
            lugar: true,
            categorias: true,
            tipo: true,
          },
        },
        creador: {
          select: {
            nombres: true,
            apellidos: true,
          },
        },
      },
    });

    if (!alineacion) {
      return NextResponse.json({ error: 'Alineación no encontrada' }, { status: 404 });
    }

    // Parsear JSON fields
    const response = {
      ...alineacion,
      equipos: alineacion.equipos ? JSON.parse(alineacion.equipos) : null,
      titulares: alineacion.titulares ? JSON.parse(alineacion.titulares) : null,
      suplentes: alineacion.suplentes ? JSON.parse(alineacion.suplentes) : null,
    };

    return NextResponse.json({ alineacion: response });
  } catch (error) {
    console.error('Error al obtener alineación:', error);
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 });
  }
}

// PUT - Actualizar alineación
export async function PUT(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    if (!['COORDINADOR', 'PROFESOR'].includes(session.user.rol || '')) {
      return NextResponse.json({ error: 'Sin permisos suficientes' }, { status: 403 });
    }

    const { id } = await params;
    const body = await request.json();

    // Preparar datos para actualización
    const updateData: Record<string, unknown> = {};
    if (body.tipoCancha) updateData.tipoCancha = body.tipoCancha;
    if (body.jugadoresPorLado) updateData.jugadoresPorLado = body.jugadoresPorLado;
    if (body.formacion) updateData.formacion = body.formacion;
    if (body.equipos !== undefined) updateData.equipos = JSON.stringify(body.equipos);
    if (body.titulares !== undefined) updateData.titulares = JSON.stringify(body.titulares);
    if (body.suplentes !== undefined) updateData.suplentes = JSON.stringify(body.suplentes);
    if (body.considerarAsistencia !== undefined) updateData.considerarAsistencia = body.considerarAsistencia;

    const alineacion = await prisma.alineacion.update({
      where: { id },
      data: updateData,
      include: {
        evento: {
          select: {
            descripcion: true,
            fecha: true,
          },
        },
        creador: {
          select: {
            nombres: true,
            apellidos: true,
          },
        },
      },
    });

    return NextResponse.json({ alineacion });
  } catch (error) {
    console.error('Error al actualizar alineación:', error);
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 });
  }
}

// DELETE - Eliminar alineación
export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user) {
      return NextResponse.json({ error: 'No autorizado' }, { status: 401 });
    }

    if (!['COORDINADOR', 'PROFESOR'].includes(session.user.rol || '')) {
      return NextResponse.json({ error: 'Sin permisos suficientes' }, { status: 403 });
    }

    const { id } = await params;
    await prisma.alineacion.delete({
      where: { id },
    });

    return NextResponse.json({ message: 'Alineación eliminada' });
  } catch (error) {
    console.error('Error al eliminar alineación:', error);
    return NextResponse.json({ error: 'Error interno del servidor' }, { status: 500 });
  }
}
