
import { NextRequest, NextResponse } from 'next/server';
import { PrismaClient } from '@prisma/client';
import { z } from 'zod';

export const dynamic = "force-dynamic";

const prisma = new PrismaClient();

const ubicacionSchema = z.object({
  nombre: z.string().min(2, "El nombre de la ubicación debe tener al menos 2 caracteres"),
  direccion: z.string().optional(),
  provinciaId: z.string().min(1, "Provincia requerida"),
  comunaId: z.string().min(1, "Comuna requerida"),
  esPrincipal: z.boolean().default(false),
  latitud: z.number().optional(),
  longitud: z.number().optional(),
});

const instructorSchema = z.object({
  nombre: z.string().min(2, "El nombre debe tener al menos 2 caracteres"),
  apellido: z.string().min(2, "El apellido debe tener al menos 2 caracteres"),
  email: z.string().email("Email inválido").optional(),
  telefono: z.string().optional(),
  fechaNacimiento: z.string().optional(),
  biografia: z.string().optional(),
  provinciaId: z.string().min(1, "Provincia requerida"),
  comunaId: z.string().min(1, "Comuna requerida"),
  experienciaAnios: z.string().optional(),
  certificaciones: z.string().optional(),
  especialidades: z.string().optional(),
  ubicaciones: z.array(ubicacionSchema).optional(),
});

export async function POST(request: NextRequest) {
  try {
    const body = await request.json();
    const validatedData = instructorSchema.parse(body);

    const instructorData: any = {
      nombre: validatedData.nombre,
      apellido: validatedData.apellido,
      email: validatedData.email || null,
      telefono: validatedData.telefono || null,
      biografia: validatedData.biografia || null,
      provinciaId: validatedData.provinciaId,
      comunaId: validatedData.comunaId,
      experienciaAnios: validatedData.experienciaAnios ? parseInt(validatedData.experienciaAnios) : null,
      certificaciones: validatedData.certificaciones ? [validatedData.certificaciones] : [],
      especialidades: validatedData.especialidades ? [validatedData.especialidades] : [],
      verificado: false,
      activo: true,
      disponible: true,
    };

    if (validatedData.fechaNacimiento) {
      instructorData.fechaNacimiento = new Date(validatedData.fechaNacimiento);
    }

    // Procesar ubicaciones adicionales si las hay
    if (validatedData.ubicaciones && validatedData.ubicaciones.length > 0) {
      const ubicacionesData = validatedData.ubicaciones;
      let tienePrincipal = ubicacionesData.some(u => u.esPrincipal);
      
      if (!tienePrincipal && ubicacionesData.length > 0) {
        // Si no hay ninguna marcada como principal, marcar la primera
        ubicacionesData[0].esPrincipal = true;
      } else if (tienePrincipal) {
        // Si hay múltiples marcadas como principal, mantener solo la primera
        let yaEncontroPrincipal = false;
        ubicacionesData.forEach(ubi => {
          if (ubi.esPrincipal && yaEncontroPrincipal) {
            ubi.esPrincipal = false;
          }
          if (ubi.esPrincipal) {
            yaEncontroPrincipal = true;
          }
        });
      }

      instructorData.ubicaciones = {
        create: ubicacionesData.map(ubicacion => ({
          nombre: ubicacion.nombre,
          direccion: ubicacion.direccion || null,
          provinciaId: ubicacion.provinciaId,
          comunaId: ubicacion.comunaId,
          esPrincipal: ubicacion.esPrincipal,
          latitud: ubicacion.latitud || null,
          longitud: ubicacion.longitud || null,
          activa: true,
        }))
      };
    }

    const instructor = await prisma.instructor.create({
      data: instructorData,
      include: {
        ubicaciones: true,
      }
    });

    return NextResponse.json({
      message: 'Instructor registrado exitosamente',
      instructor: {
        id: instructor.id,
        nombre: instructor.nombre,
        apellido: instructor.apellido,
        ubicaciones: instructor.ubicaciones.length,
      },
    });

  } catch (error) {
    console.error('Error en registro de instructor:', error);
    
    if (error instanceof z.ZodError) {
      return NextResponse.json(
        { error: 'Datos inválidos', details: error.errors },
        { status: 400 }
      );
    }

    return NextResponse.json(
      { error: 'Error interno del servidor' },
      { status: 500 }
    );
  } finally {
    await prisma.$disconnect();
  }
}
