export type DhuhaAttendanceStatus = "Hadir" | "Sakit" | "Izin" | "Alpha" | "Halangan";

export interface DhuhaAttendanceRecord {
  id: number;
  student_id: number;
  student_nis: string;
  student_nisn: string;
  student_name: string;
  class_name: string;
  gender: "Laki-laki" | "Perempuan";
  date: string; // YYYY-MM-DD
  academic_year: string;
  semester: string;
  status: DhuhaAttendanceStatus;
  time: string; // HH:mm
  notes: string;
  recorder: string;
  created_at: string;
  updated_at: string;
}

export interface DhuhaStudentItem {
  student_id: number;
  student_nis: string;
  student_nisn: string;
  student_name: string;
  class_name: string;
  gender: "Laki-laki" | "Perempuan";
  status: DhuhaAttendanceStatus;
  time: string;
  notes: string;
  is_saved: boolean;
}

export interface DhuhaClassStats {
  total_students: number;
  count_hadir: number;
  count_sakit: number;
  count_izin: number;
  count_alpha: number;
  count_halangan: number;
  attendance_rate: number; // percentage Hadir / total
}

/**
 * Menghitung tanggal hari Jumat terdekat dari tanggal acuan
 * Jika hari ini adalah Jumat, mengembalikan tanggal hari ini.
 * Jika Sabtu/Minggu/Senin-Kamis, mencari hari Jumat terakhir/terdekat.
 */
export function getClosestFriday(refDate?: Date | string): string {
  const d = refDate ? new Date(refDate) : new Date();
  if (isNaN(d.getTime())) {
    return new Date().toISOString().split("T")[0];
  }
  
  const day = d.getDay(); // 0: Minggu, 1: Senin, ..., 5: Jumat, 6: Sabtu
  let diff = 0;

  if (day === 5) {
    diff = 0; // Sudah hari Jumat
  } else if (day === 6) {
    diff = -1; // Sabtu -> Jumat kemarin
  } else if (day === 0) {
    diff = -2; // Minggu -> Jumat kemarin
  } else {
    // Senin (1) s.d. Kamis (4) -> default ke Jumat terdekat sebelumnya
    diff = -(day + 2);
  }

  const friday = new Date(d);
  friday.setDate(d.getDate() + diff);

  const year = friday.getFullYear();
  const month = String(friday.getMonth() + 1).padStart(2, "0");
  const dateNum = String(friday.getDate()).padStart(2, "0");

  return `${year}-${month}-${dateNum}`;
}

/**
 * Format tanggal Indonesia lengkap dengan nama hari
 */
export function formatIndonesianDateWithDay(dateString: string): string {
  if (!dateString) return "-";
  const [y, m, d] = dateString.split("-").map(Number);
  if (!y || !m || !d) return dateString;

  const dateObj = new Date(y, m - 1, d);
  const days = ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"];
  const months = [
    "Januari",
    "Februari",
    "Maret",
    "April",
    "Mei",
    "Juni",
    "Juli",
    "Agustus",
    "September",
    "Oktober",
    "November",
    "Desember",
  ];

  const dayName = days[dateObj.getDay()] || "";
  const monthName = months[m - 1] || "";

  return `${dayName}, ${d} ${monthName} ${y}`;
}
