"use server";
import { db } from '@/lib/db';
import { user, clase, curso, cursoinstructor, colegio } from '@/db/schema';
import { eq, count } from 'drizzle-orm';
import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import crypto from "crypto";

async function checkInstructorAuth(id?: string) {
  const session = await getServerSession(authOptions);
  if (!session || (session.user.role !== "SUPERADMIN" && session.user.role !== "ADMIN_COLEGIO")) {
    throw new Error("No autorizado");
  }

  if (session.user.role === "SUPERADMIN") return session;

  if (id) {
    const instructor = await db.query.user.findFirst({
      where: eq(user.id, id),
      columns: { colegioId: true }
    });
    if (!instructor || instructor.colegioId !== session.user.colegioId) {
      throw new Error("No autorizado para este colegio");
    }
  }

  return session;
}

export async function deleteInstructor(id: string) {
  try {
    await checkInstructorAuth(id);
    const instructor = await db.query.user.findFirst({
      where: eq(user.id, id)
    });

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

    const [claseCountRes] = await db.select({ value: count() }).from(clase).where(eq(clase.profesorId, id));
    const clasesCount = claseCountRes.value;

    if (clasesCount > 0) {
      return { success: false, error: "Regla de Negocio: No se puede eliminar a un instructor con clases/cursos asociados." };
    }

    await db.update(user)
      .set({ activo: false, updatedAt: new Date() })
      .where(eq(user.id, id));
    revalidatePath("/dashboard/instructores");
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Ocurrió un error en el servidor." };
  }
}

export async function createInstructor(formData: FormData) {
  try {
    const session = await checkInstructorAuth();
    
    const name         = formData.get("name") as string;
    const email        = formData.get("email") as string;
    const telefono     = (formData.get("telefono") as string) || null;
    const direccion    = (formData.get("direccion") as string) || null;
    const observaciones= (formData.get("observaciones") as string) || null;
    const status       = (formData.get("status") as string) || "SOLVENTE";
    const password     = (formData.get("password") as string) || "Profesor2025!";
    const cursoIds     = formData.getAll("cursoId") as string[];
    const requestedColegioId = formData.get("colegioId") as string | null;

    let colegioId = requestedColegioId && requestedColegioId !== "" ? requestedColegioId : null;
    if (session.user.role === "ADMIN_COLEGIO") {
      colegioId = session.user.colegioId as string;
    }

    const bcrypt = await import("bcryptjs");
    const hashed = await bcrypt.hash(password, 10);
    const newInstructorId = crypto.randomUUID();
    await db.insert(user).values({
      id: newInstructorId,
      name,
      email,
      password: hashed,
      role: "PROFESOR",
      status: status as any,
      telefono,
      direccion,
      observaciones,
      colegioId,
      updatedAt: new Date()
    });

    if (cursoIds.length > 0) {
      for (const cursoId of cursoIds) {
        if (session.user.role === "ADMIN_COLEGIO") {
          const course = await db.query.curso.findFirst({
            where: eq(curso.id, cursoId),
            columns: { colegioId: true }
          });
          if (course?.colegioId !== session.user.colegioId) continue;
        }

        await db.insert(cursoinstructor).values({
          cursoId,
          instructorId: newInstructorId
        });
      }
    }

    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 }
      });
      
      let colEmail: string | null = null;
      let colNombre = "Nuestra Institución";
      if (colegioId) {
        const col = await db.query.colegio.findFirst({
          where: eq(colegio.id, colegioId),
          columns: { email: true, nombre: true }
        });
        if (col) { colEmail = col.email; colNombre = col.nombre; }
      }

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

      if (recipients.size > 0) {
        const mailOptions = {
          from: `"Cursos Nirgua" <info@cursos.nirgua.com.ve>`,
          to: Array.from(recipients).join(", "),
          subject: `Bienvenido a ${colNombre} - Docente`,
          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 Docente a ${colNombre}!</h2>
              <p>Se ha registrado un usuario con rol DOCENTE / PROFESOR a tu nombre.</p>
              <hr style="border: 0; border-top: 1px solid #eee;" />
              <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> ${email}</p>
              <p><strong>Contraseña:</strong> ${password}</p>
            </div>
          `,
        };
        await transporter.sendMail(mailOptions);
      }
    } catch (mailError) {
      console.error("Error enviando correo de docente:", mailError);
    }

    revalidatePath("/dashboard/instructores");
    revalidatePath("/dashboard/cursos");
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Error al crear instructor" };
  }
}

export async function updateInstructor(id: string, formData: FormData) {
  try {
    const session = await checkInstructorAuth(id);
    
    const name         = formData.get("name") as string;
    const email        = formData.get("email") as string;
    const telefono     = (formData.get("telefono") as string) || null;
    const direccion    = (formData.get("direccion") as string) || null;
    const observaciones= (formData.get("observaciones") as string) || null;
    const status       = (formData.get("status") as string) || "SOLVENTE";
    const cursoIds     = formData.getAll("cursoId") as string[];
    const requestedColegioId = formData.get("colegioId") as string | null;

    let colegioId = requestedColegioId && requestedColegioId !== "" ? requestedColegioId : null;
    if (session.user.role === "ADMIN_COLEGIO") {
      colegioId = session.user.colegioId as string;
    }

    await db.update(user)
      .set({
        name,
        email,
        telefono,
        direccion,
        observaciones,
        status: status as any,
        colegioId,
        updatedAt: new Date()
      })
      .where(eq(user.id, id));

    await db.delete(cursoinstructor).where(eq(cursoinstructor.instructorId, id));
    
    if (cursoIds.length > 0) {
      for (const cursoId of cursoIds) {
        if (session.user.role === "ADMIN_COLEGIO") {
          const course = await db.query.curso.findFirst({
            where: eq(curso.id, cursoId),
            columns: { colegioId: true }
          });
          if (course?.colegioId !== session.user.colegioId) continue;
        }

        await db.insert(cursoinstructor).values({
          cursoId,
          instructorId: id
        });
      }
    }

    revalidatePath("/dashboard/instructores");
    revalidatePath("/dashboard/cursos");
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Error al actualizar instructor" };
  }
}
