import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";

/**
 * Menggabungkan nama-nama class Tailwind secara aman dan bebas konflik.
 */
export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}

/**
 * Membandingkan rombel / kelas asal secara natural (Tingkat X, XI, XII dan nomor 1..12).
 * Contoh urutan: X-1, X-2, ..., X-10, XI-1, ..., XII-1.
 */
export function compareStudentClasses(classA?: string, classB?: string): number {
  if (!classA && !classB) return 0;
  if (!classA || classA === "-") return 1;
  if (!classB || classB === "-") return -1;
  if (classA === classB) return 0;

  const parseClass = (c: string) => {
    const trimmed = c.trim();
    const parts = trimmed.split(/[- ]+/);
    const levelStr = parts[0]?.toUpperCase() || "";
    const num = parseInt(parts[1] || "0", 10);
    const levelWeight =
      levelStr === "X" ? 10 :
      levelStr === "XI" ? 11 :
      levelStr === "XII" ? 12 :
      99;
    return { levelWeight, num, raw: trimmed };
  };

  const parsedA = parseClass(classA);
  const parsedB = parseClass(classB);

  if (parsedA.levelWeight !== parsedB.levelWeight) {
    return parsedA.levelWeight - parsedB.levelWeight;
  }
  if (!isNaN(parsedA.num) && !isNaN(parsedB.num) && parsedA.num !== parsedB.num) {
    return parsedA.num - parsedB.num;
  }
  return classA.localeCompare(classB, "id-ID", { numeric: true });
}

/**
 * Mengurutkan array anggota berdasarkan:
 * 1. Kelas Asal (Primary Sort - Ascending natural)
 * 2. Nama Siswa (Secondary Sort - Alfabetis A-Z)
 */
export function sortMembersByClassAndName<T extends { student_class?: string; student_name?: string }>(
  items: T[]
): T[] {
  return [...items].sort((a, b) => {
    const classDiff = compareStudentClasses(a.student_class, b.student_class);
    if (classDiff !== 0) return classDiff;
    const nameA = a.student_name || "";
    const nameB = b.student_name || "";
    return nameA.localeCompare(nameB, "id-ID", { sensitivity: "base" });
  });
}
