"use server";
import { db } from '@/lib/db';
import { user, curso, inscripcion, notificacion, colegio } from '@/db/schema';
import { eq, and, sql } from 'drizzle-orm';
import { revalidatePath } from "next/cache";
import crypto from "crypto";

export async function registrarInscripcion(formData: FormData) {
  try {
    const cursoId = formData.get("cursoId") as string;
    const nombre = formData.get("nombre") as string;
    const apellido = formData.get("apellido") as string;
    const cedula = formData.get("cedula") as string;
    const direccion = formData.get("direccion") as string;
    const telefono = formData.get("telefono") as string;
    const email = formData.get("email") as string | null;
    
    const representanteNombre = formData.get("representanteNombre") as string;
    const representanteTelefono = formData.get("representanteTelefono") as string;
    const representanteParentesco = formData.get("representanteParentesco") as string;

    if (!cursoId || !nombre || !apellido || !cedula || !telefono) {
      return { success: false, error: "Faltan campos obligatorios" };
    }

    // Buscar curso para el colegioId
    const foundCurso = await db.query.curso.findFirst({
      where: eq(curso.id, cursoId),
      columns: { colegioId: true, tipoCobro: true, titulo: true }
    });

    if (!foundCurso) {
      return { success: false, error: "Curso no encontrado" };
    }

    const requierePago = foundCurso.tipoCobro === "PAGO";
    const estadoFlujoInicial = requierePago ? "PENDIENTE_CONTACTAR" : "INSCRITO";
    const estadoUserStatus = requierePago ? "PENDIENTE" : "SOLVENTE";

    // Buscar estudiante basado en la cedula
    let estudiante = await db.query.user.findFirst({
      where: eq(user.cedula, cedula)
    });

    if (estudiante) {
      // Actualizar al estudiante
      await db.update(user)
        .set({
          name: nombre,
          apellido: apellido,
          direccion: direccion,
          telefono: telefono,
          representanteNombre: representanteNombre,
          representanteTelefono: representanteTelefono,
          representanteParentesco: representanteParentesco,
          updatedAt: new Date(),
          ...(email ? { email: email.toLowerCase() } : {})
        })
        .where(eq(user.id, estudiante.id));
    } else {
      // Crear al estudiante
      const newId = crypto.randomUUID();
      await db.insert(user).values({
        id: newId,
        name: nombre,
        apellido: apellido,
        cedula: cedula,
        email: email ? email.toLowerCase() : `${cedula}@estudiantes.cursosnirgua.com`,
        password: "Nirgua" + cedula, // Password por default
        role: "ESTUDIANTE",
        status: estadoUserStatus, 
        direccion: direccion,
        telefono: telefono,
        representanteNombre: representanteNombre,
        representanteTelefono: representanteTelefono,
        representanteParentesco: representanteParentesco,
        colegioId: foundCurso.colegioId,
        updatedAt: new Date()
      });
      estudiante = { id: newId } as any;
    }

    // Verificar si ya está inscrito
    if (!estudiante?.id) {
      return { success: false, error: "Error al procesar el estudiante" };
    }

    const existingInscripcion = await db.query.inscripcion.findFirst({
      where: and(
        eq(inscripcion.userId, estudiante.id),
        eq(inscripcion.cursoId, cursoId)
      )
    });

    if (existingInscripcion) {
      return { success: true, message: "Ya estabas registrado en este curso. ¡Nos pondremos en contacto contigo pronto!" };
    }

    // Crear la inscripcion
    await db.insert(inscripcion).values({
      id: crypto.randomUUID(),
      userId: estudiante.id,
      cursoId: cursoId,
      estadoFlujo: estadoFlujoInicial,
      estadoPago: requierePago ? "PENDIENTE" : "APROBADO",
      updatedAt: new Date()
    });

    // Crear notificación para los administradores
    await db.insert(notificacion).values({
      id: crypto.randomUUID(),
      titulo: requierePago ? "Nueva Solicitud de Inscripción" : "Nueva Inscripción Gratuita",
      mensaje: requierePago 
        ? `El alumno ${nombre} ${apellido} (${cedula}) solicitó inscribirse a ${foundCurso.titulo}, por favor contáctalo al ${telefono} para formalizar el registro y cobro.`
        : `El alumno ${nombre} ${apellido} se ha inscrito de forma directa en el curso ${foundCurso.titulo} (${foundCurso.tipoCobro}).`,
      colegioId: foundCurso.colegioId,
      cursoId: cursoId
    });

    try {
      const nodemailer = require("nodemailer");
      const transporter = nodemailer.createTransport({
        host: process.env.SMTP_HOST || "localhost",
        port: Number(process.env.SMTP_PORT) || 25,
        secure: process.env.SMTP_SECURE === "true",
        auth: process.env.SMTP_USER ? {
          user: process.env.SMTP_USER,
          pass: process.env.SMTP_PASS,
        } : undefined,
        tls: { rejectUnauthorized: false }
      });

      const superAdmins = await db.query.user.findMany({
        where: eq(user.role, "SUPERADMIN"),
        columns: { email: true }
      });
      const colegioAdmin = foundCurso.colegioId ? await db.query.colegio.findFirst({
        where: eq(colegio.id, foundCurso.colegioId),
        columns: { email: true, nombre: true }
      }) : null;

      const recipients = new Set<string>();
      if (email) recipients.add(email);
      if (colegioAdmin?.email) recipients.add(colegioAdmin.email);
      superAdmins.forEach(admin => {
        if (admin.email) recipients.add(admin.email);
      });

      const finalEmail = email ? email.toLowerCase() : `${cedula}@estudiantes.cursosnirgua.com`;
      const pass = "Nirgua" + cedula;
      const colNombre = colegioAdmin?.nombre || "Nuestra Institución";

      if (recipients.size > 0) {
        const mailOptions = {
          from: `"Cursos Nirgua" <info@cursos.nirgua.com.ve>`,
          to: Array.from(recipients).join(", "),
          subject: `Bienvenido a ${colNombre} - Inscripción a ${foundCurso.titulo}`,
          html: `
            <div style="font-family: sans-serif; color: #333; max-width: 600px; border: 1px solid #eee; padding: 20px; border-radius: 10px;">
              <h2 style="color: #43a047;">¡Bienvenido a ${colNombre}!</h2>
              <p>Te has pre-inscrito o inscrito en el curso <strong>${foundCurso.titulo}</strong>.</p>
              <hr style="border: 0; border-top: 1px solid #eee;" />
              <p>Si eres un usuario nuevo, puedes acceder al sistema con tus credenciales:</p>
              <p><strong>URL de Acceso:</strong> <a href="https://cursos.nirgua.com.ve/signin">https://cursos.nirgua.com.ve/signin</a></p>
              <p><strong>Usuario / Correo:</strong> ${finalEmail}</p>
              <p><strong>Contraseña:</strong> ${pass}</p>
              <p style="font-size: 12px; color: #999; margin-top: 20px;">
                Este es un correo automático generado por el sistema de Cursos Nirgua.
              </p>
            </div>
          `,
        };
        await transporter.sendMail(mailOptions);
      }
    } catch (mailError) {
      console.error("Error enviando correo de inscripcion:", mailError);
    }

    // Actualizar conteo del curso
    await db.update(curso)
      .set({
        inscritosCount: sql`inscritosCount + 1`,
        updatedAt: new Date()
      })
      .where(eq(curso.id, cursoId));

    revalidatePath("/cursos/" + cursoId);
    return { 
      success: true, 
      message: requierePago 
        ? "¡Te has registrado exitosamente! Te contactaremos a la brevedad para realizar el cobro."
        : "¡Te has inscrito de forma directa exitosamente! Nos vemos en clase."
    };

  } catch (error: any) {
    console.error("Error al inscribir:", error);
    return { success: false, error: "Error al procesar la inscripción. Verifica si tus datos son correctos." };
  }
}
