"use server";
import { db } from "@/lib/db";
import { inscripcion, user, reportepago } from "@/db/schema";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { getInscripcionWithCurso, getReporteWithInscripcionCurso } from "@/lib/mariadb-relations";

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

export async function cambiarEstadoContacto(inscripcionId: string, nuevoEstado: "PENDIENTE_CONTACTAR" | "CONTACTADO" | "REGISTRADO_PAGO" | "INSCRITO") {
  try {
    const session = await checkAdminAuth();

    if (session.user.role === "ADMIN_COLEGIO") {
      const ins = await getInscripcionWithCurso(inscripcionId);
      if (!ins || ins.curso?.colegioId !== session.user.colegioId) {
        return { success: false, error: "No autorizado para este colegio" };
      }
    }

    await db.update(inscripcion)
      .set({ estadoFlujo: nuevoEstado, updatedAt: new Date() })
      .where(eq(inscripcion.id, inscripcionId));

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

export async function cambiarEstadoPago(inscripcionId: string, nuevoEstado: "PENDIENTE" | "APROBADO" | "RECHAZADO") {
  try {
    const session = await checkAdminAuth();

    const foundInscripcion = await getInscripcionWithCurso(inscripcionId);
    if (!foundInscripcion) {
      return { success: false, error: "Inscripción no encontrada" };
    }

    if (session.user.role === "ADMIN_COLEGIO" && foundInscripcion.curso?.colegioId !== session.user.colegioId) {
      return { success: false, error: "No autorizado para este colegio" };
    }

    const updateData: any = { estadoPago: nuevoEstado, updatedAt: new Date() };

    if (nuevoEstado === "APROBADO") {
      updateData.estadoFlujo = "INSCRITO";
      if (foundInscripcion.userId) {
        await db.update(user)
          .set({ status: "SOLVENTE", updatedAt: new Date() })
          .where(eq(user.id, foundInscripcion.userId));
      }
    }

    await db.update(inscripcion)
      .set(updateData)
      .where(eq(inscripcion.id, inscripcionId));

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

export async function cambiarEstadoPagoReporte(reporteId: string, nuevoEstado: "PENDIENTE" | "APROBADO" | "RECHAZADO") {
  try {
    const session = await checkAdminAuth();

    const reporte = await getReporteWithInscripcionCurso(reporteId);
    if (!reporte) return { success: false, error: "Reporte no encontrado" };

    if (session.user.role === "ADMIN_COLEGIO" && reporte.inscripcion?.curso?.colegioId !== session.user.colegioId) {
      return { success: false, error: "No autorizado para este colegio" };
    }

    await db.update(reportepago)
      .set({ estado: nuevoEstado, updatedAt: new Date() })
      .where(eq(reportepago.id, reporteId));

    if (nuevoEstado === "APROBADO" && reporte.inscripcion) {
      await db.update(inscripcion)
        .set({ estadoPago: "APROBADO", estadoFlujo: "INSCRITO", updatedAt: new Date() })
        .where(eq(inscripcion.id, reporte.inscripcionId));

      await db.update(user)
        .set({ status: "SOLVENTE", updatedAt: new Date() })
        .where(eq(user.id, reporte.inscripcion.userId));
    } else if (nuevoEstado === "RECHAZADO" && reporte.inscripcion) {
      await db.update(inscripcion)
        .set({ estadoPago: "RECHAZADO", updatedAt: new Date() })
        .where(eq(inscripcion.id, reporte.inscripcionId));
    }

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

export async function formCambiarEstadoContacto(inscripcionId: string, nuevoEstado: "PENDIENTE_CONTACTAR" | "CONTACTADO" | "REGISTRADO_PAGO" | "INSCRITO"): Promise<void> {
  await cambiarEstadoContacto(inscripcionId, nuevoEstado);
}

export async function formCambiarEstadoPago(inscripcionId: string, nuevoEstado: "PENDIENTE" | "APROBADO" | "RECHAZADO"): Promise<void> {
  await cambiarEstadoPago(inscripcionId, nuevoEstado);
}

export async function formCambiarEstadoPagoReporte(reporteId: string, nuevoEstado: "PENDIENTE" | "APROBADO" | "RECHAZADO"): Promise<void> {
  await cambiarEstadoPagoReporte(reporteId, nuevoEstado);
}
