/** الثوابت العامة للنظام - المراحل الدراسية، أنواع الأقساط، فئات المصروفات */

export interface GradeDef {
  code: string; // يُستخدم في توليد كود الطالب
  labelAr: string;
  labelEn: string;
}

export const GRADES: GradeDef[] = [
  { code: "PREP", labelAr: "التمهيدي", labelEn: "Preparatory" },
  { code: "G1", labelAr: "الصف الأول الابتدائي", labelEn: "Grade 1" },
  { code: "G2", labelAr: "الصف الثاني الابتدائي", labelEn: "Grade 2" },
  { code: "G3", labelAr: "الصف الثالث الابتدائي", labelEn: "Grade 3" },
  { code: "G4", labelAr: "الصف الرابع الابتدائي", labelEn: "Grade 4" },
  { code: "G5", labelAr: "الصف الخامس الابتدائي", labelEn: "Grade 5" },
  { code: "G6", labelAr: "الصف السادس الابتدائي", labelEn: "Grade 6" },
];

/** مسميات قديمة لطلبة سابقين (حُذفت الروضة من النظام) */
export const LEGACY_GRADE_LABELS: Record<string, string> = {
  KG1: "الروضة الأولى (مؤرشفة)",
  KG2: "الروضة الثانية (مؤرشفة)",
  KG3: "الروضة الثالثة (مؤرشفة)",
  G7: "الصف الأول المتوسط",
  G8: "الصف الثاني المتوسط",
  G9: "الصف الثالث المتوسط",
  G10: "الصف الأول الإعدادي",
  G11: "الصف الثاني الإعدادي",
  G12: "الصف الثالث الإعدادي",
};

/** الشعب الافتراضية عند أول تشغيل */
export const DEFAULT_CLASSROOMS = ["أ", "ب", "ج", "د", "هـ", "و"];

/** مفاتيح صفحات النظام - تُستخدم لتحديد الصفحات المسموحة لكل مستخدم */
export const PAGE_KEYS = [
  "dashboard", "payment", "students", "classes",
  "finance", "reports", "users", "audit", "settings",
] as const;

export const PAGE_LABELS_AR: Record<string, string> = {
  dashboard: "لوحة المعلومات",
  payment: "الدفع المباشر",
  students: "تسجيل الطلبة والبحث",
  classes: "الصفوف والشعب",
  finance: "الإيرادات والمصروفات",
  reports: "التقارير",
  users: "إدارة المستخدمين",
  audit: "سجل الحركات",
  settings: "إعدادات المدرسة",
};

/** توحيد الاسم العربي للمقارنة (إزالة التشكيل وتوحيد الألف والهاء والياء وتقليل المسافات) */
export function normalizeArabicName(name: string): string {
  return String(name)
    .trim()
    .replace(/[\u064B-\u065F\u0670]/g, "") // التشكيل
    .replace(/[أإآٱ]/g, "ا")
    .replace(/ة/g, "ه")
    .replace(/ى/g, "ي")
    .replace(/ؤ/g, "و")
    .replace(/ئ/g, "ي")
    .replace(/\s+/g, " ");
}

/** حساب القسط المستحق بعد نسبة الخصم */
export function effectiveFee(totalFee: number, discountPercent: number): number {
  const d = Math.min(100, Math.max(0, discountPercent || 0));
  return Math.round(totalFee * (1 - d / 100));
}

export const INSTALLMENT_TYPES = [
  "قسط أول",
  "قسط ثاني",
  "قسط ثالث",
  "قسط رابع",
  "دفعة مقدمة",
  "قسط شهري",
  "دفع كامل",
  "مصاريف سنوية",
  "أخرى",
];

export const EXPENSE_CATEGORIES = [
  "رواتب الموظفين",
  "فواتير الشركات",
  "أنشطة وفعاليات",
  "مصاريف يومية",
  "صيانة ونظافة",
  "مستلزمات تعليمية",
  "كهرباء وماء واتصالات",
  "أخرى",
];

export const ROLE_LABELS: Record<string, string> = {
  ADMIN: "مدير النظام",
  ACCOUNTANT: "محاسب",
  STAFF: "إداري",
};

export const EXPENSE_CATEGORY_LABELS: Record<string, string> = {
  SALARIES: "رواتب الموظفين",
  ACTIVITIES: "أنشطة وفعاليات",
  DAILY: "مصاريف يومية",
  MAINTENANCE: "صيانة ونظافة",
  SUPPLIES: "مستلزمات تعليمية",
  UTILITIES: "كهرباء وماء واتصالات",
  OTHER: "أخرى",
};

export const PAYMENT_METHOD_LABELS: Record<string, string> = {
  CASH: "نقدي (وصل ورقي)",
  ELECTRONIC: "دفع إلكتروني",
};

/** توليد كود الطالب التلقائي بناءً على المرحلة الدراسية والسنة */
export function generateStudentCode(gradeCode: string, year: number, sequence: number): string {
  return `${gradeCode}-${year}-${String(sequence).padStart(4, "0")}`;
}

/** عدد كلمات الاسم الرباعي المطلوبة */
export const QUAD_NAME_WORDS = 4;

export function formatDateAr(date: Date | string): string {
  const d = typeof date === "string" ? new Date(date) : date;
  return new Intl.DateTimeFormat("ar-IQ", {
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
  }).format(d);
}

export function formatDateTimeAr(date: Date | string): string {
  const d = typeof date === "string" ? new Date(date) : date;
  return new Intl.DateTimeFormat("ar-IQ", {
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
    hour: "2-digit",
    minute: "2-digit",
  }).format(d);
}

export function formatMoney(amount: number, currency = "د.ع"): string {
  return `${new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(amount)} ${currency}`;
}
