import type { ComponentType } from "react";
import type { SvgIconProps } from "@mui/material/SvgIcon";

import {
  dashboard,
  DashboardWorkingGroupIsueIcon,
  LayoutDashboard,
  CalendarIcon,
  BusinessReportIcon,
  FileDocumentIcon,
  reciptIcon,
  SettingIcon,
  userIcon,
  MeetingCalendaIcon,
  StakeHolderIcon,
  roleIcon,
  ministryCalendarIcon,
  PlenaryIcon,
  rgcDecisionIcon,
  wgIcon,
  plenariesIcon,
  rgcIcon,
} from "@/components/ui/icon";
import {
  hasPermission,
  isAdminRole,
  isCdcGpsfRole,
  isMinistryRole,
  isCdcRole,
  isCefpRole,
  type AuthPermission,
  type UserRole,
} from "@/features/auth/auth-data";
import { APP_PERMISSIONS } from "@/features/auth/permissions";
import type { LanguageCode } from "@/components/layout/header/header-data";

type NavItemIcon = {
  icon: ComponentType<SvgIconProps>;
  size?: number;
};

export type NavItem = {
  title: string;
  titleEn: string;
  titleKh: string;
  url: string;
  icon?: NavItemIcon;
  isActive?: boolean;
  requiredPermission?: AuthPermission;
  showNotificationBadge?: boolean;
  items: NavItem[];
};

const adminNavItems: NavItem[] = [
  {
    title: "Dashboard",
    titleEn: "Dashboard",
    titleKh: "ផ្ទាំងគ្រប់គ្រង",
    url: "/admin/dashboard",
    icon: { icon: dashboard, size: 20 },
    isActive: false,
    items: [],
  },
  {
    title: "Issues Management",
    titleEn: "Issues Management",
    titleKh: "គ្រប់គ្រងបញ្ហា",
    url: "/admin/issues-management",
    icon: { icon: FileDocumentIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Meeting Calendar",
    titleEn: "Meeting Calendar",
    titleKh: "ប្រតិទិនប្រជុំ",
    url: "/admin/meeting-calendar",
    icon: { icon: MeetingCalendaIcon },
    isActive: false,
    items: [],
  },
  {
    title: "User Management",
    titleEn: "User Management",
    titleKh: "គ្រប់គ្រងអ្នកប្រើប្រាស់",
    url: "/admin/user-management",
    icon: { icon: userIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Comment Type",
    titleEn: "Comment Type",
    titleKh: "មតិយោបល់",
    url: "/admin/comment-types",
    icon: { icon: LayoutDashboard, size: 20 },
    isActive: false,
    items: [],
  },
  {
    title: "Role & Permissions",
    titleEn: "Role & Permissions",
    titleKh: "គ្រប់គ្រងតួនាទី និងសិទ្ធិ",
    url: "/admin/role",
    icon: { icon: roleIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Stakeholder",
    titleEn: "Stakeholder",
    titleKh: "អ្នកពាក់ព័ន្ធ",
    url: "/admin/stakeholder",
    icon: { icon: StakeHolderIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Setting",
    titleEn: "Setting",
    titleKh: "ការកំណត់",
    url: "/admin/setting",
    icon: { icon: SettingIcon },
    isActive: false,
    items: [],
  },
];

const pswgNavItems: NavItem[] = [
  {
    title: "Dashboard",
    titleEn: "Dashboard",
    titleKh: "ផ្ទាំងគ្រប់គ្រង",
    url: "/pswg/dashboard",
    icon: { icon: dashboard },
    isActive: false,
    items: [
      {
        title: "Plenary",
        titleEn: "Plenary",
        titleKh: "សម័យប្រជុំពេញអង្គ",
        url: "/pswg/dashboard/plenary",
        isActive: false,
        items: [],
      },
      {
        title: "Working Group",
        titleEn: "Working Group",
        titleKh: "ក្រុមការងារ",
        url: "/pswg/dashboard/working-group",
        isActive: false,
        items: [],
      },
    ],
  },
  {
    title: "Working Group A Issues",
    titleEn: "Working Group A Issues",
    titleKh: "បញ្ហាក្រុមការងារ A",
    url: "/pswg/wg-issues",
    icon: { icon: DashboardWorkingGroupIsueIcon },
    isActive: false,
    requiredPermission: APP_PERMISSIONS.workingGroupIssue.read,
    items: [],
  },
  {
    title: "Meeting Requests",
    titleEn: "Meeting Requests",
    titleKh: "សំណើប្រជុំ",
    url: "/pswg/meeting-requests",
    icon: { icon: CalendarIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Meeting Summary",
    titleEn: "Meeting Summary",
    titleKh: "សេចក្តីសង្ខេបកិច្ចប្រជុំ",
    url: "/pswg/meeting-summary",
    icon: { icon: BusinessReportIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Progress Report",
    titleEn: "Progress Report",
    titleKh: "របាយការណ៍វឌ្ឍនភាព",
    url: "/pswg/progress-report",
    icon: { icon: FileDocumentIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Issue Matrix",
    titleEn: "Issue Matrix",
    titleKh: "តារាងបញ្ហា",
    url: "/pswg/issue-matrix",
    icon: { icon: reciptIcon },
    isActive: false,
    requiredPermission: APP_PERMISSIONS.issueMatrix.read,
    items: [],
  },
];

const ministryNavItems: NavItem[] = [
  {
    title: "Dashboard",
    titleEn: "Dashboard",
    titleKh: "ផ្ទាំងគ្រប់គ្រង",
    url: "/ministry/dashboard",
    icon: { icon: dashboard },
    isActive: false,
    items: [],
  },
  {
    title: "Meeting Requests",
    titleEn: "Meeting Requests",
    titleKh: "សំណើប្រជុំ",
    url: "/ministry/meeting-requests",
    icon: { icon: CalendarIcon },
    isActive: false,
    showNotificationBadge: true,
    items: [],
  },
  {
    title: "Meeting Calendar",
    titleEn: "Meeting Calendar",
    titleKh: "ប្រតិទិនប្រជុំ",
    url: "/ministry/meeting-calendar",
    icon: { icon: ministryCalendarIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Meeting Summary",
    titleEn: "Meeting Summary",
    titleKh: "សេចក្តីសង្ខេបកិច្ចប្រជុំ",
    url: "/ministry/meeting-summary",
    icon: { icon: BusinessReportIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Progress Reports",
    titleEn: "Progress Reports",
    titleKh: "របាយការណ៍វឌ្ឍនភាព",
    url: "/ministry/progress-reports",
    icon: { icon: FileDocumentIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Issue Matrix",
    titleEn: "Issue Matrix",
    titleKh: "តារាងបញ្ហា",
    url: "/ministry/issue-matrix",
    icon: { icon: reciptIcon },
    isActive: false,
    requiredPermission: APP_PERMISSIONS.issueMatrix.read,
    items: [],
  },
  {
    title: "Plenary",
    titleEn: "Plenary",
    titleKh: "សម័យប្រជុំពេញអង្គ",
    url: "",
    icon: { icon: PlenaryIcon },
    isActive: false,
    items: [
      {
        title: "Dashboard",
        titleEn: "Dashboard",
        titleKh: "ផ្ទាំងគ្រប់គ្រង",
        url: "/ministry/plenary/dashboard",
        icon: { icon: dashboard },
        isActive: false,
        items: [],
      },
      {
        title: "Plenaries",
        titleEn: "Plenaries",
        titleKh: "សម័យប្រជុំពេញអង្គ",
        url: "/ministry/plenary/plenaries",
        icon: { icon: plenariesIcon },
        isActive: false,
        items: [],
      },
      {
        title: "RGC Decisions",
        titleEn: "RGC Decisions",
        titleKh: "សេចក្តីសម្រេចរបស់រាជរដ្ឋាភិបាល",
        url: "/ministry/plenary/rgc-decisions",
        icon: { icon: rgcIcon },
        isActive: false,
        items: [],
      },
    ],
  },
];

const cdcGpsfNavItems: NavItem[] = [
  {
    title: "WG",
    titleEn: "WG",
    titleKh: "ក្រុមការងារ",
    url: "",
    icon: { icon: wgIcon },
    isActive: false,
    items: [
      {
        title: "Dashboard",
        titleEn: "Dashboard",
        titleKh: "ផ្ទាំងគ្រប់គ្រង",
        url: "/cdc-gpsf/dashboard",
        icon: { icon: dashboard },
        isActive: false,
        items: [],
      },
      {
        title: "PSWG Meeting Request",
        titleEn: "PSWG Meeting Request",
        titleKh: "សំណើប្រជុំ PSWG",
        url: "/cdc-gpsf/meeting-requests",
        icon: { icon: CalendarIcon },
        isActive: false,
        showNotificationBadge: true,
        items: [],
      },
      {
        title: "WG Meeting",
        titleEn: "WG Meeting",
        titleKh: "កិច្ចប្រជុំក្រុមការងារ",
        url: "/cdc-gpsf/meeting-calendar",
        icon: { icon: ministryCalendarIcon },
        isActive: false,
        items: [],
      },
      {
        title: "Meeting Summary",
        titleEn: "Meeting Summary",
        titleKh: "សេចក្តីសង្ខេបកិច្ចប្រជុំ",
        url: "/cdc-gpsf/meeting-summary",
        icon: { icon: BusinessReportIcon },
        isActive: false,
        items: [],
      },
      {
        title: "Issue Matrix",
        titleEn: "Issue Matrix",
        titleKh: "តារាងបញ្ហា",
        url: "/cdc-gpsf/issue-matrix",
        icon: { icon: reciptIcon },
        isActive: false,
        requiredPermission: APP_PERMISSIONS.issueMatrix.read,
        items: [],
      },
    ],
  },
  {
    title: "Plenary",
    titleEn: "Plenary",
    titleKh: "សម័យប្រជុំពេញអង្គ",
    url: "",
    icon: { icon: PlenaryIcon },
    isActive: false,
    items: [
      {
        title: "Dashboard",
        titleEn: "Dashboard",
        titleKh: "ផ្ទាំងគ្រប់គ្រង",
        url: "/cdc-gpsf/plenary/dashboard",
        icon: { icon: dashboard },
        isActive: false,
        items: [],
      },
      {
        title: "Plenary",
        titleEn: "Plenary",
        titleKh: "សម័យប្រជុំពេញអង្គ",
        url: "/cdc-gpsf/plenary/plenaries",
        icon: { icon: plenariesIcon },
        isActive: false,
        items: [],
      },
      {
        title: "RGC Decision",
        titleEn: "RGC Decision",
        titleKh: "សេចក្តីសម្រេច RGC",
        url: "/cdc-gpsf/plenary/rgc-decisions",
        icon: { icon: rgcIcon },
        isActive: false,
        items: [],
      },
    ],
  },
  {
    title: "Progress Report",
    titleEn: "Progress Report",
    titleKh: "របាយការណ៍វឌ្ឍនភាព",
    url: "/cdc-gpsf/progress-reports",
    icon: { icon: FileDocumentIcon },
    isActive: false,
    items: [],
  },
  {
    title: "Issue Matrix and RGC Decision",
    titleEn: "Issue Matrix and RGC Decision",
    titleKh: "តារាងបញ្ហា និងសេចក្តីសម្រេច RGC",
    url: "/cdc-gpsf/issue-matrix-rgc-decision",
    icon: { icon: reciptIcon },
    isActive: false,
    items: [],
  },
];

const cdcNavItems: NavItem[] = [
  {
    title: "Dashboard",
    titleEn: "Dashboard",
    titleKh: "ផ្ទាំងគ្រប់គ្រង",
    url: "/cdc/dashboard/plenary",
    icon: { icon: dashboard },
    isActive: false,
    items: [
      {
        title: "Plenary",
        titleEn: "Plenary",
        titleKh: "សម័យប្រជុំពេញអង្គ",
        url: "/cdc/dashboard/plenary",
        isActive: false,
        items: [],
      },
      {
        title: "Working Group",
        titleEn: "Working Group",
        titleKh: "ក្រុមការងារ",
        url: "/cdc/dashboard/working-group",
        isActive: false,
        items: [],
      },
    ],
  },
  {
    title: "CDC Issue Matrix",
    titleEn: "CDC Issue Matrix",
    titleKh: "តារាងបញ្ហា CDC",
    url: "/cdc/cdc-issue-matrix",
    icon: { icon: ministryCalendarIcon },
    isActive: false,
    requiredPermission: APP_PERMISSIONS.cdcIssueMatrix.read,
    items: [],
  },
  {
    title: "Issue Matrix",
    titleEn: "Issue Matrix",
    titleKh: "តារាងបញ្ហា",
    url: "/cdc/issue-matrix",
    icon: { icon: reciptIcon },
    isActive: false,
    items: [],
  },
  {
    title: "RGC Decision",
    titleEn: "RGC Decision",
    titleKh: "សេចក្តីសម្រេច RGC",
    url: "/cdc/rgc-decision",
    icon: { icon: rgcDecisionIcon },
    isActive: false,
    items: [],
  },
];

const cefpNavItems: NavItem[] = [
  {
    title: "Dashboard",
    titleEn: "Dashboard",
    titleKh: "ផ្ទាំងគ្រប់គ្រង",
    url: "/cefp/dashboard/plenary",
    icon: { icon: dashboard },
    isActive: false,
    items: [
      {
        title: "Plenary",
        titleEn: "Plenary",
        titleKh: "សម័យប្រជុំពេញអង្គ",
        url: "/cefp/dashboard/plenary",
        isActive: false,
        items: [],
      },
      {
        title: "Working Group",
        titleEn: "Working Group",
        titleKh: "ក្រុមការងារ",
        url: "/cefp/dashboard/working-group",
        isActive: false,
        items: [],
      },
    ],
  },
  {
    title: "CEFP Issue Matrix",
    titleEn: "CEFP Issue Matrix",
    titleKh: "តារាងបញ្ហា CEFP",
    url: "/cefp/cefp-issue-matrix",
    icon: { icon: ministryCalendarIcon },
    isActive: false,
    requiredPermission: APP_PERMISSIONS.cefpIssueMatrix.read,
    items: [],
  },
  {
    title: "Issue Matrix",
    titleEn: "Issue Matrix",
    titleKh: "តារាងបញ្ហា",
    url: "/cefp/issue-matrix",
    icon: { icon: reciptIcon },
    isActive: false,
    items: [],
  },
  {
    title: "RGC Decision",
    titleEn: "RGC Decision",
    titleKh: "សេចក្តីសម្រេច RGC",
    url: "/cefp/rgc-decision",
    icon: { icon: rgcDecisionIcon },
    isActive: false,
    items: [],
  },
];

function translateNavItems(
  items: NavItem[],
  language: LanguageCode,
): NavItem[] {
  return items.map((item) => ({
    ...item,
    title: language === "kh" ? item.titleKh : item.titleEn,
    items: translateNavItems(item.items, language),
  }));
}

function filterNavItemsByPermissions(
  items: NavItem[],
  permissions: AuthPermission[],
): NavItem[] {
  return items.flatMap((item) => {
    const requiredPermission = item.requiredPermission;
    const canViewItem =
      !requiredPermission ||
      hasPermission(
        permissions,
        requiredPermission.action,
        requiredPermission.subject,
      );

    if (!canViewItem) return [];

    return [
      {
        ...item,
        items: filterNavItemsByPermissions(item.items, permissions),
      },
    ];
  });
}

function getSidebarNavItems(role: UserRole | null) {
  if (isAdminRole(role)) return adminNavItems;
  if (isMinistryRole(role)) return ministryNavItems;
  if (isCdcGpsfRole(role)) return cdcGpsfNavItems;
  if (isCdcRole(role)) return cdcNavItems;
  if (isCefpRole(role)) return cefpNavItems;
  return pswgNavItems;
}

export function getSidebarNavItemsByPathname(
  pathname: string,
  role: UserRole | null,
  language: LanguageCode,
  permissions: AuthPermission[] = [],
) {
  let navItems: NavItem[];

  if (pathname.startsWith("/admin")) {
    navItems = adminNavItems;
  } else if (pathname.startsWith("/ministry")) {
    navItems = ministryNavItems;
  } else if (pathname.startsWith("/pswg")) {
    navItems = pswgNavItems;
  } else if (pathname.startsWith("/cdc-gpsf")) {
    navItems = cdcGpsfNavItems;
  } else if (pathname.startsWith("/cdc")) {
    navItems = cdcNavItems;
  } else if (pathname.startsWith("/cefp")) {
    navItems = cefpNavItems;
  } else {
    navItems = getSidebarNavItems(role);
  }

  return translateNavItems(
    filterNavItemsByPermissions(navItems, permissions),
    language,
  );
}
