import { NavigationSection, NavigationItem, NavigationSubItem } from "@/types/navigation";
import { UserRole } from "./userManagementTypes";
import {
  LayoutDashboard,
  UserCheck,
  GraduationCap,
  Sparkles,
  BookOpen,
  HeartHandshake,
  UserPlus,
  Home,
  ShieldAlert,
  Award,
  FileText,
  User,
  LineChart,
  Calendar,
} from "lucide-react";

/**
 * Helper untuk parsing role (mendukung single role, array role, atau comma-separated string)
 * Contoh: "Guru Mapel, Wali Kelas, Sarpras" -> ["Guru Mapel", "Wali Kelas", "Sarpras"]
 */
export function parseRoles(roleInput?: UserRole | string | UserRole[] | null): UserRole[] {
  if (!roleInput) return [];
  if (Array.isArray(roleInput)) return roleInput;
  return roleInput
    .split(",")
    .map((r) => r.trim() as UserRole)
    .filter(Boolean);
}

/**
 * Memeriksa apakah sebuah rute (pathname) diizinkan untuk Role tertentu.
 * Mendukung Multi-Role: Jika SALAH SATU role mengizinkan rute, akses diberikan (true).
 */
export function canAccessRoute(pathname: string, role: UserRole | string | UserRole[]): boolean {
  const roles = parseRoles(role);
  if (roles.length === 0) return false;

  // Super Admin memiliki akses penuh ke segala rute
  if (roles.includes("Super Admin")) return true;

  // Normalisasi path
  const path = pathname.toLowerCase();

  // Rute login selalu publik
  if (path === "/login") return true;

  // Evaluasi apakah salah satu role mengizinkan akses ke rute ini
  return roles.some((singleRole) => canAccessRouteSingle(pathname, singleRole));
}

/**
 * Logika pengecekan akses rute per-role tunggal
 */
function canAccessRouteSingle(pathname: string, role: UserRole): boolean {
  if (role === "Super Admin") return true;

  const path = pathname.toLowerCase();
  if (path === "/login") return true;

  switch (role) {
    case "Kurikulum": {
      // FULL: Seluruh Menu Kurikulum
      if (
        path.startsWith("/kurikulum") ||
        path.startsWith("/jadwal") ||
        path.startsWith("/presensi") ||
        path.startsWith("/rapor-bulanan")
      ) {
        return true;
      }
      // READ-ONLY: Data Siswa, Cetak Profil Siswa, Data Guru
      if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa") || path.startsWith("/guru")) {
        return true;
      }
      // SPESIFIK READ-ONLY: Tracer Study & Data Alumni
      if (path.startsWith("/bk/tracer-study")) {
        return true;
      }
      // Dashboard Utama
      if (path === "/") return true;
      return false;
    }

    case "Kesiswaan":
    case "KESISWAAN" as UserRole: {
      // FULL: Seluruh Menu & Submenu Kesiswaan (Kedisiplinan/Poin, Prestasi, Ekskul, Prolife, Dhuha, dll.)
      if (path.startsWith("/kesiswaan")) return true;
      // READ-ONLY: Data Siswa & Cetak Profil Siswa
      if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa")) return true;
      // Dashboard Utama
      if (path === "/") return true;
      return false;
    }

    case "Guru BK": {
      // Role Guru BK
      if (path.startsWith("/bk")) return true;
      if (path.startsWith("/kesiswaan")) return true;
      // SPESIFIK: Presensi & Jurnal KBM Guru Mapel
      if (path.startsWith("/kurikulum/presensi-kbm")) return true;
      // READ-ONLY: Data Siswa & Cetak Profil Siswa
      if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa")) return true;
      if (path === "/") return true;
      return false;
    }

    case "Sarpras": {
      // FULL: Seluruh Menu Sarana & Prasarana
      if (path.startsWith("/sarpras") || path.startsWith("/sarana")) return true;
      if (path === "/") return true;
      return false;
    }

    case "Humas": {
      // FULL: Seluruh Menu Humas
      if (path.startsWith("/humas")) return true;
      // READ-ONLY: Tracer Study & Data Alumni
      if (path.startsWith("/bk/tracer-study")) return true;
      if (path === "/") return true;
      return false;
    }

    case "Tata Usaha (TU)": {
      // FULL: Seluruh Menu TU
      if (path.startsWith("/tu")) return true;
      // FULL (Submenu Kurikulum): Rapor Bulanan, Rapor Semesteran, Nilai Akhir Kelas XII, SKL
      if (
        path.startsWith("/rapor-bulanan") ||
        path.startsWith("/kurikulum/rapor-semesteran") ||
        path.startsWith("/kurikulum/nilai-akhir") ||
        path.startsWith("/kurikulum/skl")
      ) {
        return true;
      }
      // READ-ONLY: Data Siswa, Data Guru, Cetak Profil Siswa
      if (path.startsWith("/siswa") || path.startsWith("/guru") || path.startsWith("/cetak-profil-siswa")) {
        return true;
      }
      if (path === "/") return true;
      return false;
    }

    case "Wali Kelas": {
      // FULL: Submenu Kurikulum Presensi KBM, Presensi Rekap, Rapor Bulanan, Rapor Semesteran, Nilai Akhir, SKL, Catatan Wali Kelas
      if (
        path.startsWith("/kurikulum/presensi-kbm") ||
        path.startsWith("/presensi") ||
        path.startsWith("/rapor-bulanan") ||
        path.startsWith("/kurikulum/rapor-semesteran") ||
        path.startsWith("/kurikulum/nilai-akhir") ||
        path.startsWith("/kurikulum/skl") ||
        path.startsWith("/kurikulum/catatan-wali-kelas") ||
        path.startsWith("/wali-kelas")
      ) {
        return true;
      }
      // READ-ONLY: Data Siswa, Cetak Profil Siswa, Portal Guru
      if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa") || path.startsWith("/guru")) return true;
      if (path === "/") return true;
      return false;
    }

    case "Guru Mapel": {
      // 1. FULL (Menu Kurikulum): Jadwal & Master Mapel, Presensi & Jurnal KBM, Rapor Bulanan, Rapor Semesteran
      if (
        path.startsWith("/jadwal") ||
        path.startsWith("/kurikulum/presensi-kbm") ||
        path.startsWith("/rapor-bulanan") ||
        path.startsWith("/kurikulum/rapor-semesteran") ||
        path.startsWith("/rapor-semesteran") ||
        path.startsWith("/nilai") ||
        path.startsWith("/kurikulum/nilai") ||
        path.startsWith("/kurikulum/penilaian")
      ) {
        return true;
      }
      // 2. READ-ONLY: Data Siswa, Cetak Profil Siswa, & Portal Guru (/guru)
      if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa") || path.startsWith("/guru")) {
        return true;
      }
      // Dashboard Utama
      if (path === "/") return true;
      return false;
    }

    case "Guru Piket": {
      // FULL: Submenu Presensi & Rekapitulasi (/presensi), Portal Guru (/guru)
      if (path.startsWith("/presensi") || path.startsWith("/guru")) return true;
      if (path === "/") return true;
      return false;
    }

    case "Siswa": {
      // Portal Khusus Siswa
      if (path.startsWith("/portal-siswa") || path.startsWith("/siswa")) return true;
      return false;
    }

    case "Orang Tua / Wali": {
      // Portal Khusus Orang Tua & Biodata Siswa
      if (path.startsWith("/portal-ortu") || path.startsWith("/portal-siswa")) return true;
      return false;
    }

    case "Calon Siswa (SPMB)": {
      // Portal Ringkas Calon Siswa
      if (path.startsWith("/spmb")) return true;
      return false;
    }

    case "Panitia SPMB": {
      if (path.startsWith("/spmb")) return true;
      if (path === "/") return true;
      return false;
    }

    default:
      return path === "/";
  }
}

/**
 * Mengecek apakah rute tersebut berstatus READ-ONLY untuk role yang aktif.
 * Mendukung Multi-Role: Jika salah satu role memiliki hak tulis penuh (WRITE),
 * maka rute tersebut berstatus WRITE (bukan read-only, return false).
 */
export function isReadOnlyRoute(pathname: string, role: UserRole | string | UserRole[]): boolean {
  const roles = parseRoles(role);
  if (roles.length === 0) return false;
  if (roles.includes("Super Admin")) return false;

  // Filter role yang memiliki akses ke rute ini
  const accessibleRoles = roles.filter((r) => canAccessRouteSingle(pathname, r));
  if (accessibleRoles.length === 0) return true;

  // Jika ada salah satu role yang memiliki hak akses penuh (bukan read-only), berikan akses WRITE
  const hasFullWrite = accessibleRoles.some((r) => !isReadOnlySingleRole(pathname, r));
  return !hasFullWrite;
}

function isReadOnlySingleRole(pathname: string, role: UserRole): boolean {
  if (role === "Super Admin") return false;

  const path = pathname.toLowerCase();

  // Kurikulum: Data Siswa, Cetak Profil Siswa, Data Guru, Tracer Study adalah READ-ONLY
  if (role === "Kurikulum") {
    if (
      path.startsWith("/siswa") ||
      path.startsWith("/cetak-profil-siswa") ||
      path.startsWith("/guru") ||
      path.startsWith("/bk/tracer-study")
    ) {
      return true;
    }
  }

  // Kesiswaan: Data Siswa & Cetak Profil Siswa adalah READ-ONLY
  if (role === "Kesiswaan" || (role as string) === "KESISWAAN") {
    if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa")) {
      return true;
    }
  }

  // Guru BK: Data Siswa, Cetak Profil Siswa, Data Guru adalah READ-ONLY
  if (role === "Guru BK") {
    if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa") || path.startsWith("/guru")) {
      return true;
    }
  }

  // Humas: Tracer Study adalah READ-ONLY
  if (role === "Humas") {
    if (path.startsWith("/bk/tracer-study")) return true;
  }

  // TU: Data Siswa, Data Guru, Cetak Profil Siswa adalah READ-ONLY
  if (role === "Tata Usaha (TU)") {
    if (path.startsWith("/siswa") || path.startsWith("/guru") || path.startsWith("/cetak-profil-siswa")) {
      return true;
    }
  }

  // Wali Kelas: Data Siswa & Data Guru adalah READ-ONLY
  if (role === "Wali Kelas") {
    if (path.startsWith("/siswa") || path.startsWith("/guru") || path.startsWith("/cetak-profil-siswa")) return true;
  }

  // Guru Mapel: Data Siswa, Cetak Profil Siswa, & Data Guru adalah READ-ONLY
  if (role === "Guru Mapel") {
    if (path.startsWith("/siswa") || path.startsWith("/cetak-profil-siswa") || path.startsWith("/guru")) {
      return true;
    }
  }

  // Guru Piket: Data Guru adalah READ-ONLY
  if (role === "Guru Piket") {
    if (path.startsWith("/guru")) return true;
  }

  return false;
}

/**
 * Filter Navigation Config Secara Dinamis Berdasarkan Role User.
 * Mendukung Multi-Role Checkbox: Menggabungkan (Union) seluruh hak akses menu
 * dari seluruh role yang dicentang secara otomatis.
 */
export function filterNavigationByRole(
  sections: NavigationSection[],
  role: UserRole | string | UserRole[]
): NavigationSection[] {
  const roles = parseRoles(role);
  if (roles.length === 0) return [];

  // 1. Super Admin: Tampilkan semua menu tanpa filter
  if (roles.includes("Super Admin")) {
    return sections;
  }

  // 2. Khusus Siswa: Tampilkan Sidebar Portal Siswa dengan Tab Navigasi Vertikal
  if (roles.includes("Siswa") && !roles.includes("Super Admin")) {
    return [
      {
        title: "Portal Peserta Didik",
        items: [
          {
            id: "portal-siswa-home",
            title: "Portal Siswa",
            href: "/portal-siswa",
            icon: GraduationCap,
            status: "available",
            description: "Rekam jejak nilai, presensi harian & dhuha, pelanggaran, ekskul, dan prestasi",
          },
          {
            id: "portal-siswa-profil",
            title: "Profil & Akademik",
            href: "/portal-siswa?tab=profil",
            icon: User,
            status: "available",
            description: "Informasi profil pokok dan ringkasan akademik peserta didik",
          },
          {
            id: "portal-siswa-rapor",
            title: "Analisis Rapor Siswa",
            href: "/portal-siswa?tab=rapor",
            icon: LineChart,
            status: "available",
            description: "Grafik tren progresif dan capaian nilai rapor semester 1 s.d. 6",
          },
          {
            id: "portal-siswa-presensi",
            title: "Presensi & Shalat Dhuha",
            href: "/portal-siswa?tab=presensi",
            icon: Calendar,
            status: "available",
            description: "Rekap presensi harian KBM dan shalat dhuha Jumat",
          },
          {
            id: "portal-siswa-kedisiplinan",
            title: "Catatan Pelanggaran Siswa",
            href: "/portal-siswa?tab=kedisiplinan",
            icon: ShieldAlert,
            status: "available",
            description: "Poin kedisiplinan dan rekap pembinaan tata tertib",
          },
          {
            id: "portal-siswa-ekskul",
            title: "Ekskul, Prolife & Prestasi",
            href: "/portal-siswa?tab=ekskul",
            icon: Award,
            status: "available",
            description: "Keikutsertaan ekstrakurikuler, program prolife, dan piagam prestasi",
          },
          {
            id: "portal-siswa-biodata",
            title: "Biodata Siswa",
            href: "/portal-siswa/biodata",
            icon: FileText,
            status: "available",
            description: "Formulir biodata mandiri lengkap peserta didik SMA BPI 1 Bandung",
          },
        ],
      },
    ];
  }

  // 3. Khusus Orang Tua murni: Sidebar Portal Orang Tua dengan Tab Navigasi Vertikal
  if (roles.includes("Orang Tua / Wali") && !roles.includes("Super Admin") && !roles.includes("Siswa")) {
    return [
      {
        title: "Portal Orang Tua / Wali",
        items: [
          {
            id: "portal-ortu-home",
            title: "Portal Siswa",
            href: "/portal-ortu",
            icon: GraduationCap,
            status: "available",
            description: "Monitoring real-time nilai, kehadiran, kedisiplinan, dan kegiatan ananda",
          },
          {
            id: "portal-ortu-profil",
            title: "Profil & Akademik",
            href: "/portal-ortu?tab=profil",
            icon: User,
            status: "available",
            description: "Informasi profil pokok dan ringkasan akademik ananda",
          },
          {
            id: "portal-ortu-rapor",
            title: "Analisis Rapor Siswa",
            href: "/portal-ortu?tab=rapor",
            icon: LineChart,
            status: "available",
            description: "Grafik tren progresif dan capaian nilai rapor ananda semester 1 s.d. 6",
          },
          {
            id: "portal-ortu-presensi",
            title: "Presensi & Shalat Dhuha",
            href: "/portal-ortu?tab=presensi",
            icon: Calendar,
            status: "available",
            description: "Rekap presensi harian KBM dan shalat dhuha Jumat ananda",
          },
          {
            id: "portal-ortu-kedisiplinan",
            title: "Catatan Pelanggaran Siswa",
            href: "/portal-ortu?tab=kedisiplinan",
            icon: ShieldAlert,
            status: "available",
            description: "Poin kedisiplinan dan rekap pembinaan tata tertib ananda",
          },
          {
            id: "portal-ortu-ekskul",
            title: "Ekskul, Prolife & Prestasi",
            href: "/portal-ortu?tab=ekskul",
            icon: Award,
            status: "available",
            description: "Keikutsertaan ekstrakurikuler, program prolife, dan piagam prestasi ananda",
          },
          {
            id: "portal-ortu-biodata",
            title: "Biodata Siswa",
            href: "/portal-ortu/biodata",
            icon: FileText,
            status: "available",
            description: "Formulir biodata lengkap peserta didik SMA BPI 1 Bandung",
          },
        ],
      },
    ];
  }

  // 4. Khusus Calon Siswa SPMB murni: Sidebar SPMB Ringkas
  if (roles.length === 1 && roles[0] === "Calon Siswa (SPMB)") {
    return [
      {
        title: "Portal SPMB",
        items: [
          {
            id: "spmb-calon-home",
            title: "Pengumuman Kelulusan SPMB",
            href: "/spmb",
            icon: UserPlus,
            status: "available",
            description: "Status seleksi penerimaan peserta didik baru dan surat hasil kelulusan",
          },
        ],
      },
    ];
  }

  // 5. Penggabungan (Union) Hak Akses Menu untuk Role Staf & Guru (Multi-Role)
  return sections
    .map((section) => {
      const filteredItems = section.items
        .map((item) => filterItemForMultipleRoles(item, roles))
        .filter((item): item is NavigationItem => item !== null);

      return {
        ...section,
        items: filteredItems,
      };
    })
    .filter((section) => section.items.length > 0);
}

/**
 * Helper untuk mengevaluasi dan menggabungkan izin menu item dan anak-anak menu (children)
 * untuk pengguna dengan lebih dari 1 role.
 */
function filterItemForMultipleRoles(item: NavigationItem, roles: UserRole[]): NavigationItem | null {
  // Evaluasi filter untuk masing-masing role yang dimiliki
  const results = roles
    .map((r) => filterItemByRole(item, r))
    .filter((res): res is NavigationItem => res !== null);

  if (results.length === 0) return null;

  // Jika item tidak memiliki sub-menu (children), kembalikan item asli
  if (!item.children || item.children.length === 0) {
    return item;
  }

  // Jika salah satu role memberikan izin akses ke seluruh sub-menu (misal Kurikulum pada menu kurikulum)
  const hasFullChildrenRole = results.some(
    (res) => res.children && res.children.length === item.children!.length
  );
  if (hasFullChildrenRole) {
    return item;
  }

  // Gabungkan seluruh sub-menu (children) unik yang diizinkan dari setiap role
  const mergedChildrenMap = new Map<string, NavigationSubItem>();
  for (const res of results) {
    if (res.children) {
      for (const child of res.children) {
        if (!mergedChildrenMap.has(child.id)) {
          mergedChildrenMap.set(child.id, child);
        }
      }
    }
  }

  // Pertahankan urutan konfigurasi navigasi asli (item.children)
  const mergedChildren = item.children.filter((child) => mergedChildrenMap.has(child.id));
  if (mergedChildren.length === 0) {
    return null;
  }

  return {
    ...item,
    children: mergedChildren,
  };
}

/**
 * Helper untuk filter item dan anak-anak menu (children) per single-role
 */
function filterItemByRole(item: NavigationItem, role: UserRole): NavigationItem | null {
  const itemId = item.id;

  // 1. KURIKULUM
  if (role === "Kurikulum") {
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "cetak-profil-siswa" || itemId === "guru") {
      return item;
    }
    if (itemId === "kurikulum") {
      return item; // Seluruh children kurikulum diizinkan
    }
    if (itemId === "bk") {
      const tracerChild = item.children?.filter((c) => c.id === "bk-tracer-study");
      if (tracerChild && tracerChild.length > 0) {
        return {
          ...item,
          children: tracerChild,
        };
      }
      return null;
    }
    return null;
  }

  // 2. KESISWAAN
  if (role === "Kesiswaan" || (role as string) === "KESISWAAN") {
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "cetak-profil-siswa") {
      return item;
    }
    if (itemId === "kesiswaan") {
      return item; // Seluruh menu kesiswaan full
    }
    return null;
  }

  // 3. SARANA & PRASARANA (SARPRAS)
  if (role === "Sarpras") {
    if (itemId === "dashboard" || itemId === "sarana-prasarana") {
      return item;
    }
    return null;
  }

  // 4. HUMAS
  if (role === "Humas") {
    if (itemId === "dashboard" || itemId === "humas") {
      return item;
    }
    if (itemId === "bk") {
      const tracerChild = item.children?.filter((c) => c.id === "bk-tracer-study");
      if (tracerChild && tracerChild.length > 0) {
        return {
          ...item,
          children: tracerChild,
        };
      }
      return null;
    }
    return null;
  }

  // 5. GURU BK
  if (role === "Guru BK") {
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "cetak-profil-siswa") {
      return item;
    }
    if (itemId === "bk") {
      return item; // Seluruh menu BK
    }
    if (itemId === "kurikulum") {
      const kbmChild = item.children?.filter((c) => c.id === "kurikulum-presensi-kbm");
      if (kbmChild && kbmChild.length > 0) {
        return {
          ...item,
          children: kbmChild,
        };
      }
      return null;
    }
    if (itemId === "kesiswaan") {
      return item;
    }
    return null;
  }

  // 6. TATA USAHA (TU)
  if (role === "Tata Usaha (TU)") {
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "guru" || itemId === "cetak-profil-siswa") {
      return item;
    }
    if (itemId === "tu") {
      return item; // Seluruh menu TU
    }
    if (itemId === "kurikulum") {
      const tuAllowedKurikulum = [
        "rapor-bulanan",
        "rapor-semesteran",
        "nilai-akhir-xii",
        "skl",
      ];
      const filtered = item.children?.filter((c) => tuAllowedKurikulum.includes(c.id));
      if (filtered && filtered.length > 0) {
        return {
          ...item,
          children: filtered,
        };
      }
      return null;
    }
    return null;
  }

  // 7. WALI KELAS
  if (role === "Wali Kelas") {
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "cetak-profil-siswa") {
      return item;
    }
    if (itemId === "kurikulum") {
      const waliAllowedKurikulum = [
        "kurikulum-presensi-kbm",
        "presensi-rekap",
        "rapor-bulanan",
        "rapor-semesteran",
        "nilai-akhir-xii",
        "skl",
        "catatan-wali-kelas",
      ];
      const filtered = item.children?.filter((c) => waliAllowedKurikulum.includes(c.id));
      if (filtered && filtered.length > 0) {
        return {
          ...item,
          children: filtered,
        };
      }
      return null;
    }
    return null;
  }

  // 8. GURU MAPEL
  if (role === "Guru Mapel") {
    // Menu Utama diizinkan: Dashboard, Data Siswa (READ-ONLY), Cetak Profil Siswa (READ-ONLY)
    if (itemId === "dashboard" || itemId === "siswa" || itemId === "cetak-profil-siswa") {
      return item;
    }
    // Submenu Kurikulum:
    // 1. Jadwal & Master Mapel (jadwal-mapel)
    // 2. Presensi & Jurnal KBM (kurikulum-presensi-kbm)
    // 3. Rapor Bulanan (rapor-bulanan)
    // 4. Rapor Semesteran (rapor-semesteran)
    if (itemId === "kurikulum") {
      const mapelAllowed = [
        "jadwal-mapel",
        "kurikulum-presensi-kbm",
        "rapor-bulanan",
        "rapor-semesteran",
      ];
      const filtered = item.children?.filter((c) => mapelAllowed.includes(c.id));
      if (filtered && filtered.length > 0) {
        return {
          ...item,
          children: filtered,
        };
      }
      return null;
    }
    // Sembunyikan modul/menu lain di luar poin 1 dan 2: Sarpras, Humas, TU, BK, Nilai Akhir XII, SKL, Catatan Wali Kelas, dll.
    return null;
  }

  // 9. GURU PIKET
  if (role === "Guru Piket") {
    if (itemId === "dashboard") return item;
    if (itemId === "presensi-rekap") return item;
    if (itemId === "kurikulum") {
      const piketAllowed = ["presensi-rekap"];
      const filtered = item.children?.filter((c) => piketAllowed.includes(c.id));
      if (filtered && filtered.length > 0) {
        return {
          ...item,
          children: filtered,
        };
      }
      return null;
    }
    return null;
  }

  // 10. PANITIA SPMB
  if (role === "Panitia SPMB") {
    if (itemId === "dashboard" || itemId === "spmb") {
      return item;
    }
    return null;
  }

  return item;
}
