export type UserCategory = "internal" | "external" | "spmb";

export type UserRole =
  | "Super Admin"
  | "Kurikulum"
  | "Kesiswaan"
  | "Guru BK"
  | "Humas"
  | "Wali Kelas"
  | "Guru Mapel"
  | "Guru Piket"
  | "Sarpras"
  | "Tata Usaha (TU)"
  | "Panitia SPMB"
  | "Siswa"
  | "Orang Tua / Wali"
  | "Calon Siswa (SPMB)";

export type UserStatus = "Aktif" | "Nonaktif";

export interface AppUserRecord {
  id: number;
  username: string;
  name: string;
  email: string;
  id_induk: string; // NIPY / NIP / NISN / No. Pendaftaran
  role: UserRole | string;
  category: UserCategory;
  status: UserStatus;
  last_login?: string | null;
  reference_id?: string | null;
  password_hash?: string;
  created_at: string;
  updated_at: string;
}

export interface UserStats {
  total_users: number;
  total_internal_active: number;
  total_external: number;
  total_inactive: number;
}

export const INTERNAL_ROLES: UserRole[] = [
  "Super Admin",
  "Kurikulum",
  "Kesiswaan",
  "Guru BK",
  "Humas",
  "Wali Kelas",
  "Guru Mapel",
  "Guru Piket",
  "Sarpras",
  "Tata Usaha (TU)",
  "Panitia SPMB",
];

export const EXTERNAL_ROLES: UserRole[] = ["Siswa", "Orang Tua / Wali"];

export const SPMB_ROLES: UserRole[] = ["Calon Siswa (SPMB)"];

export const DEFAULT_USER_PASSWORD = "BpiSmart2026!";

/**
 * Formula Pembentukan Username Otomatis Guru & Staf (SMA BPI 1 Bandung):
 * 1. Bersihkan / abaikan semua gelar akademik dan gelar kebangsawanan
 *    (contoh yang diabaikan: Drs., Dra., S.Pd., M.Pd, S.Kom., S.Ag., H., Hj., Rd., Raden, Prof., dll.)
 * 2. Ambil maksimal 2 kata pertama dari nama asli guru/staf.
 * 3. Abaikan kata ke-3, ke-4, dan seterusnya jika ada.
 * 4. Gabungkan 2 kata tersebut menggunakan separator underscore (_) dalam huruf kecil semua (lowercase).
 * 5. Jika nama guru hanya terdiri dari 1 kata (misal: "Tatang"), gunakan 1 kata tersebut ("tatang").
 */
export function generateTeacherUsername(fullName: string): string {
  if (!fullName || typeof fullName !== "string") return "";

  // 1. Ambil bagian sebelum koma (karena gelar belakang akademik biasanya diawali koma)
  let baseName = fullName.split(",")[0].trim();

  // 2. Bersihkan gelar depan & kebangsawanan di awal nama
  const prefixRegex =
    /^(drs\.|drs\b|dra\.|dra\b|dr\.|dr\b|prof\.|prof\b|h\.|h\b|hj\.|hj\b|ir\.|ir\b|rd\.|rd\b|raden\b|kh\.|kh\b|tb\.|tubagus\b|ra\.|ra\b|r\.)\s+/i;

  let prevName = "";
  while (prevName !== baseName) {
    prevName = baseName;
    baseName = baseName.replace(prefixRegex, "").trim();
  }

  // 3. Bersihkan sisa-sisa gelar belakang yang mungkin ditulis tanpa koma
  const suffixPattern =
    /\b(s\.pd|m\.pd|s\.kom|s\.ag|s\.si|m\.si|s\.psi|s\.t|s\.sos|s\.e|m\.m|m\.kom|m\.t|s\.pd\.i|m\.pd\.i|gr|ph\.d|m\.ed)\b\.?/gi;
  baseName = baseName.replace(suffixPattern, "").trim();

  // 4. Bersihkan karakter tanda baca/simbol (tanda petik, titik, dll)
  baseName = baseName.replace(/['’`.]/g, "").replace(/[^a-zA-Z0-9\s]/g, " ");

  // 5. Pecah menjadi kata-kata (filter kata kosong)
  const words = baseName
    .toLowerCase()
    .split(/\s+/)
    .filter((w) => w.length > 0);

  if (words.length === 0) return "guru";

  // 6. Ambil maksimal 2 kata pertama
  const chosenWords = words.slice(0, 2);

  // 7. Gabungkan dengan separator underscore (_)
  return chosenWords.join("_");
}

/**
 * Formula Pembentukan Username Otomatis Siswa (SMA BPI 1 Bandung):
 * 1. Ambil Nama Lengkap Siswa dari Master Data Siswa.
 * 2. Ambil maksimal 2 kata pertama dari nama siswa (abaikan kata ke-3, ke-4, dan seterusnya jika ada).
 * 3. Format menggunakan huruf kecil semua (lowercase) dan gabungkan dengan garis bawah (_).
 * Contoh: "ADELINE AURELIA SOLIHIN" -> "adeline_aurelia"
 */
export function generateStudentUsername(namaLengkap: string): string {
  if (!namaLengkap || typeof namaLengkap !== "string") return "";

  const cleanName = namaLengkap
    .replace(/['’`.]/g, "")
    .replace(/[^a-zA-Z0-9\s]/g, " ")
    .trim();

  const words = cleanName
    .toLowerCase()
    .split(/\s+/)
    .filter((w) => w.length > 0);

  if (words.length === 0) return "siswa";

  return words.slice(0, 2).join("_");
}

/**
 * Formula Pembentukan Username Otomatis Orang Tua / Wali (SMA BPI 1 Bandung):
 * Tambahkan prefix "ortu_" di depan format username anak/siswanya.
 * Contoh: Untuk siswa "ADELINE AURELIA SOLIHIN" -> "ortu_adeline_aurelia"
 */
export function generateParentUsername(namaLengkapSiswa: string): string {
  const studentUsername = generateStudentUsername(namaLengkapSiswa);
  return `ortu_${studentUsername}`;
}


