/**
 * Mock Data & Configuration untuk Surat Keterangan Lulus (SKL)
 * SMA BPI 1 Bandung — Kurikulum Merdeka
 */

export interface SKLPaperSettings {
  paperSize: "A4" | "F4"; // A4: 210x297mm, F4: 215x330mm
  orientation: "portrait";
  scale: number; // e.g. 92% (fit 1 page)
  spacing: "compact" | "normal";
  marginTopMm: number;
  marginBottomMm: number;
  marginLeftMm: number;
  marginRightMm: number;
  fitToOnePage: boolean;
}

export const DEFAULT_PAPER_SETTINGS: SKLPaperSettings = {
  paperSize: "F4",
  orientation: "portrait",
  scale: 100,
  spacing: "normal",
  marginTopMm: 10,
  marginBottomMm: 10,
  marginLeftMm: 12,
  marginRightMm: 12,
  fitToOnePage: true,
};

export interface SKLConfig {
  letterNumberFormat: string; // e.g. "S.6/{nomor}/SMABPI 1/V/{tahun}"
  startingNumber: number; // e.g. 375
  academicYear: string; // e.g. "2025/2026"
  decisionCity: string; // e.g. "Bandung"
  decisionDate: string; // e.g. "4 Mei 2026"
  principalTitle: string; // e.g. "Kepala SMA BPI 1 Bandung selaku Ketua Penyelenggara Ujian Sekolah Tahun Pelajaran 2025/2026"
  principalName: string; // e.g. "TATANG, M.Pd"
  principalNipy: string; // e.g. "NIPY. 10079"
  legalBasis: string[];
  showStampAndSignature: boolean;
  paperSettings?: SKLPaperSettings;
}

export const DEFAULT_SKL_CONFIG: SKLConfig = {
  letterNumberFormat: "S.6/{nomor}/SMABPI 1/V/{tahun}",
  startingNumber: 375,
  academicYear: "2025/2026",
  decisionCity: "Bandung",
  decisionDate: "4 Mei 2026",
  principalTitle:
    "Kepala SMA BPI 1 Bandung selaku Ketua Penyelenggara Ujian Sekolah Tahun Pelajaran 2025/2026",
  principalName: "TATANG, M.Pd",
  principalNipy: "10079",
  legalBasis: [
    "Permendikdasmen No. 10 tahun 2025 tentang Standar Kompetensi Lulusan pada Pendidikan Anak Usia Dini, Jenjang Pendidikan Dasar, dan Jenjang Pendidikan Menengah;",
    "Surat Edaran Kepala Dinas Pendidikan Provinsi Jawa Barat Nomor : 23845/PK.03.04.04/PSMA tentang Kelulusan Peserta Didik SMA/SMK/SLB Tahun Ajaran 2025/2026 di Provinsi Jawa Barat",
    "Ketuntasan dari seluruh program pembelajaran pada kurikulum Merdeka;",
    "Surat Keputusan Kepala SMA BPI 1 Bandung Nomor : P.16/415/SMABPI1/V/2026 tentang Kelulusan Peserta Didik SMA BPI 1 Bandung Tahun Pelajaran 2025 – 2026;",
    "Hasil Rapat Pleno Kelulusan Dewan Guru SMA BPI 1 Bandung tanggal 4 Mei 2026",
  ],
  showStampAndSignature: false,
  paperSettings: DEFAULT_PAPER_SETTINGS,
};

export interface SKLSubjectScore {
  code: string;
  name: string;
  score: number;
}

export interface SKLRecord {
  id: string;
  studentId: string;
  letterNumber: string;
  fullName: string;
  birthPlace: string;
  birthDate: string; // e.g. "29 Januari 2008"
  parentName: string;
  nis: string;
  nisn: string;
  className: string; // e.g. "XII-5"
  peminatanPaket: string; // e.g. "XII-5 / Paket 2"
  status: "LULUS" | "TIDAK LULUS";
  subjectScores: SKLSubjectScore[];
  overallAverage: number; // e.g. 86.23
}

export const OFFICIAL_SKL_SUBJECTS = [
  { code: "SKL-01", name: "Pendidikan Agama dan Budi Pekerti" },
  { code: "SKL-02", name: "Pendidikan Pancasila" },
  { code: "SKL-03", name: "Bahasa Indonesia" },
  { code: "SKL-04", name: "Matematika" },
  { code: "SKL-05", name: "Informatika" },
  { code: "SKL-06", name: "Fisika" },
  { code: "SKL-07", name: "Kimia" },
  { code: "SKL-08", name: "Biologi" },
  { code: "SKL-09", name: "Ekonomi" },
  { code: "SKL-10", name: "Bahasa Inggris" },
  { code: "SKL-11", name: "Sejarah" },
  { code: "SKL-12", name: "Pendidikan Jasmani Olahraga dan Kesehatan" },
  { code: "SKL-13", name: "Seni" },
  { code: "SKL-14", name: "Bahasa Sunda" },
];

export function calculateSKLAverage(scores: SKLSubjectScore[]): number {
  if (!scores || scores.length === 0) return 0;
  const total = scores.reduce((acc, curr) => acc + (Number(curr.score) || 0), 0);
  return Number((total / scores.length).toFixed(2));
}

export function formatIndonesianScore(val: number): string {
  if (val == null || isNaN(val)) return "-";
  return val.toFixed(2).replace(".", ",");
}

export function generateLetterNumber(
  format: string,
  seqNumber: number,
  academicYear: string
): string {
  const yearEnd = academicYear.split("/")[1] || "2027";
  return format
    .replace("{nomor}", String(seqNumber))
    .replace("{nomor_urut}", String(seqNumber))
    .replace("{tahun}", yearEnd);
}

// Dummy student identifiers for cleanup & filtering
export const DUMMY_SKL_NIS = new Set([
  "2324.10029",
  "2223.10080",
  "2223.10081",
  "2324.10030",
  "2324.10031",
]);

export function isDummySKLRecord(rec: { nis?: string; fullName?: string }): boolean {
  if (!rec) return false;
  if (rec.nis && DUMMY_SKL_NIS.has(rec.nis)) return true;
  const name = (rec.fullName || "").toUpperCase();
  if (
    name.includes("ALARIC CHESTA") ||
    name.includes("FARHAN AL-GHIFARI") ||
    name.includes("ZAHRA SALSABILA") ||
    name.includes("DANI RAMDANI") ||
    name.includes("NURUL HIKMAH")
  ) {
    return true;
  }
  return false;
}

export function formatIndonesianBirthDate(raw: string | number | undefined): string {
  if (!raw) return "-";
  const str = String(raw).trim();
  if (!str || str === "-") return "-";

  // If it's an Excel serial number like "39960"
  if (/^\d{5}$/.test(str)) {
    const serial = Number(str);
    const date = new Date((serial - (25567 + 2)) * 86400 * 1000);
    if (!isNaN(date.getTime())) {
      const months = [
        "Januari", "Februari", "Maret", "April", "Mei", "Juni",
        "Juli", "Agustus", "September", "Oktober", "November", "Desember"
      ];
      return `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()}`;
    }
  }

  // If it's standard YYYY-MM-DD
  if (/^\d{4}-\d{2}-\d{2}$/.test(str)) {
    const [y, m, d] = str.split("-");
    const months = [
      "Januari", "Februari", "Maret", "April", "Mei", "Juni",
      "Juli", "Agustus", "September", "Oktober", "November", "Desember"
    ];
    const monthName = months[parseInt(m, 10) - 1] || m;
    return `${parseInt(d, 10)} ${monthName} ${y}`;
  }

  return str;
}

export const DEFAULT_SUBJECT_LIST: Array<{ code: string; name: string }> = [
  { code: "SKL-01", name: "Pendidikan Agama dan Budi Pekerti" },
  { code: "SKL-02", name: "Pendidikan Pancasila" },
  { code: "SKL-03", name: "Bahasa Indonesia" },
  { code: "SKL-04", name: "Matematika" },
  { code: "SKL-05", name: "Informatika" },
  { code: "SKL-06", name: "Fisika" },
  { code: "SKL-07", name: "Kimia" },
  { code: "SKL-08", name: "Biologi" },
  { code: "SKL-09", name: "Ekonomi" },
  { code: "SKL-10", name: "Bahasa Inggris" },
  { code: "SKL-11", name: "Sejarah" },
  { code: "SKL-12", name: "Pendidikan Jasmani Olahraga dan Kesehatan" },
  { code: "SKL-13", name: "Seni" },
  { code: "SKL-14", name: "Bahasa Sunda" },
];

export function createBlankSubjectScores(): SKLSubjectScore[] {
  return DEFAULT_SUBJECT_LIST.map((s) => ({
    code: s.code,
    name: s.name,
    score: 0,
  }));
}

export function buildSKLRecordFromStudent(
  student: {
    id?: string | number;
    nis: string;
    nisn: string;
    fullName?: string;
    nama_lengkap?: string;
    className?: string;
    rombel?: string;
    birthPlace?: string;
    tempat_lahir?: string;
    birthDate?: string;
    tanggal_lahir?: string;
    parentName?: string;
    nama_ortu_wali?: string;
  },
  seqNumber: number,
  config: SKLConfig,
  existingRecord?: Partial<SKLRecord>,
  classPeminatanMap?: Record<string, string>
): SKLRecord {
  const className = student.className || student.rombel || "XII-1";
  const fullName = (student.fullName || student.nama_lengkap || "").toUpperCase();
  const birthPlace = student.birthPlace || student.tempat_lahir || "Bandung";
  const birthDate = formatIndonesianBirthDate(student.birthDate || student.tanggal_lahir);
  const parentName = (student.parentName || student.nama_ortu_wali || "-").toUpperCase();
  const nis = student.nis;
  const nisn = student.nisn;

  const letterNumber =
    existingRecord?.letterNumber ||
    generateLetterNumber(config.letterNumberFormat, seqNumber, config.academicYear);

  const subjectScores =
    existingRecord?.subjectScores && existingRecord.subjectScores.length > 0
      ? existingRecord.subjectScores
      : createBlankSubjectScores();

  const hasAnyScore = subjectScores.some((s) => (Number(s.score) || 0) > 0);
  const overallAverage = hasAnyScore ? calculateSKLAverage(subjectScores) : 0;

  const defaultPeminatan =
    (classPeminatanMap && classPeminatanMap[className]) || `${className} / Reguler`;

  return {
    id: `skl-${nis}`,
    studentId: String(student.id || nis),
    letterNumber,
    fullName,
    birthPlace,
    birthDate,
    parentName,
    nis,
    nisn,
    className,
    peminatanPaket: existingRecord?.peminatanPaket || defaultPeminatan,
    status: (existingRecord?.status as "LULUS" | "TIDAK LULUS") || "LULUS",
    subjectScores,
    overallAverage,
  };
}

// Initial Mock Records: Empty array (dynamically loaded from genuine Kelas XII students)
export const initialMockSKLRecords: SKLRecord[] = [];
