"use server";

import { revalidatePath } from "next/cache";
import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { db } from "@/db";
import { trainingCourses, auditLogs } from "@/db/schema";
import { requireSession } from "@/lib/auth";
import { canEditCatalog } from "@/lib/rbac";

const courseSchema = z.object({
  name: z.string().trim().min(3, "Tên khóa học quá ngắn."),
  description: z.string().trim().max(500).optional(),
  schedule: z.string().trim().max(200).optional(),
  conditions: z.string().trim().max(500).optional(),
  format: z.string().trim().max(120).optional(),
});

export type CourseState = { error?: string; ok?: string };

export async function saveCourseAction(_prev: CourseState, formData: FormData): Promise<CourseState> {
  const session = await requireSession();
  if (!canEditCatalog(session)) return { error: "Bạn không có quyền quản lý danh mục khóa học." };

  const parsed = courseSchema.safeParse({
    name: formData.get("name"),
    description: formData.get("description") || undefined,
    schedule: formData.get("schedule") || undefined,
    conditions: formData.get("conditions") || undefined,
    format: formData.get("format") || undefined,
  });
  if (!parsed.success) return { error: parsed.error.issues[0].message };
  const data = parsed.data;

  const values = {
    tenantId: session.tenantId,
    name: data.name,
    description: data.description ?? null,
    schedule: data.schedule ?? null,
    conditions: data.conditions ?? null,
    format: data.format ?? null,
    hasCertificate: formData.get("hasCertificate") === "on",
  };
  const id = String(formData.get("id") ?? "");
  if (id && !z.string().uuid().safeParse(id).success) return { error: "Khoá học không hợp lệ." };

  let courseId = id;
  if (id) {
    const updated = await db
      .update(trainingCourses)
      .set(values)
      .where(and(eq(trainingCourses.tenantId, session.tenantId), eq(trainingCourses.id, id)))
      .returning();
    if (updated.length === 0) return { error: "Không tìm thấy khoá học." };
  } else {
    const [created] = await db.insert(trainingCourses).values(values).returning();
    courseId = created.id;
  }

  await db.insert(auditLogs).values({
    tenantId: session.tenantId,
    userId: session.userId,
    action: id ? "UPDATE" : "CREATE",
    entityType: "training_course",
    entityId: courseId,
    payload: { name: data.name, schedule: data.schedule ?? null, conditions: data.conditions ?? null, format: data.format ?? null, hasCertificate: values.hasCertificate },
  });

  revalidatePath("/danh-muc/khoa-hoc");
  return { ok: id ? "Đã cập nhật khóa học." : `Đã thêm "${data.name}".` };
}

export async function deactivateCourseAction(formData: FormData): Promise<{ ok?: string; error?: string }> {
  const session = await requireSession();
  if (!canEditCatalog(session)) return { error: "Bạn không có quyền gỡ khóa học." };

  const id = String(formData.get("id"));
  if (!z.string().uuid().safeParse(id).success) return { error: "Khoá học không hợp lệ." };
  const updated = await db
    .update(trainingCourses)
    .set({ isActive: false })
    .where(and(eq(trainingCourses.tenantId, session.tenantId), eq(trainingCourses.id, id)))
    .returning();
  if (updated.length === 0) return { error: "Không tìm thấy khoá học." };

  await db.insert(auditLogs).values({
    tenantId: session.tenantId,
    userId: session.userId,
    action: "DELETE",
    entityType: "training_course",
    entityId: id,
    payload: { name: updated[0].name },
  });

  revalidatePath("/danh-muc/khoa-hoc");
  return { ok: "Đã ngừng khoá học." };
}
