import { IconSchool } from '@material-hu/icons/tabler';
import List from '@material-hu/mui/List';

import HuSidebarNavItem from '@material-hu/components/design-system/Sidebar/components/NavItem';

import useAuth from 'src/contexts/JWTContext';
import useLearningTitle from 'src/pages/dashboard/Learning/common/hooks/useLearningTitle';
import useCoursesTitle from 'src/pages/dashboard/Learning/Courses/hooks/useCoursesTitle';
import { coursesRoutes } from 'src/pages/dashboard/Learning/Courses/routes';
import usePathsTitle from 'src/pages/dashboard/Learning/Paths/hooks/usePathsTitle';
import { pathsRoutes } from 'src/pages/dashboard/Learning/Paths/routes';
import useSessionsTitle from 'src/pages/dashboard/Learning/Sessions/hooks/useSessionsTitle';
import { sessionsRoutes } from 'src/pages/dashboard/Learning/Sessions/routes';
import useSettingsTitle from 'src/pages/dashboard/Learning/Settings/hooks/useSettingsTitle';
import { settingsRoutes } from 'src/pages/dashboard/Learning/Settings/routes';
import { insertIf } from 'src/utils/arrayUtils';
import { hasAllPermissions, UserPermissions } from 'src/utils/permissions';

import useGetSidebarIcon from '../hooks/useGetSidebarIcon';
import { type SidebarItemProps } from '../types';
import { getItemIsActive, getSubItemIsActive } from '../utils';

type ItemInfo = { isNew?: boolean } | undefined;

const LearningItem = ({
  isCollapsed,
  onClick,
  isActive: isActiveProp,
}: SidebarItemProps) => {
  const getIcon = useGetSidebarIcon();
  const { permissions } = useAuth();
  const learningTitle = useLearningTitle();
  const coursesTitle = useCoursesTitle();
  const pathsTitle = usePathsTitle();
  const sessionsTitle = useSessionsTitle();
  const settingsTitle = useSettingsTitle();

  const showCourses = hasAllPermissions(permissions, [
    UserPermissions.MANAGE_COURSES,
  ]);
  const showPaths = hasAllPermissions(permissions, [
    UserPermissions.MANAGE_PATHS,
  ]);
  const showSessions = hasAllPermissions(permissions, [
    UserPermissions.MANAGE_LEARNING_SESSIONS,
  ]);
  const showSettings = hasAllPermissions(permissions, [
    UserPermissions.MANAGE_LEARNING_SETTINGS,
  ]);

  const subItems: Array<{
    key: string;
    title: string;
    path: string;
    info: ItemInfo;
  }> = [
    ...insertIf(showCourses, {
      key: 'courses',
      title: coursesTitle,
      path: coursesRoutes.base(),
      info: undefined,
    }),
    ...insertIf(showPaths, {
      key: 'paths',
      title: pathsTitle,
      path: pathsRoutes.base(),
      info: undefined,
    }),
    ...insertIf(showSessions, {
      key: 'sessions',
      title: sessionsTitle,
      path: sessionsRoutes.base(),
      info: { isNew: true },
    }),
    ...insertIf(showSettings, {
      key: 'settings',
      title: settingsTitle,
      path: settingsRoutes.base(),
      info: { isNew: true },
    }),
  ];

  const isActive = isActiveProp ?? subItems.some(i => getItemIsActive(i.path));

  const renderSubItems = () => {
    if (isCollapsed) return null;
    return (
      <List
        disablePadding
        sx={{ '& > *:not(:last-child)': { mb: 0 } }}
      >
        {subItems.map((item, index) => (
          <HuSidebarNavItem
            key={item.key}
            depth={1}
            isLastChild={index === subItems.length - 1}
            active={getSubItemIsActive(item.path)}
            isCollapsed={isCollapsed}
            onClick={onClick}
            title={item.title}
            path={item.path}
            info={item.info}
          />
        ))}
      </List>
    );
  };

  return (
    <HuSidebarNavItem
      key="learnings"
      depth={0}
      title={learningTitle}
      icon={getIcon({ defaultIcon: IconSchool, key: 'Learnings' })}
      path={subItems[0]?.path ?? coursesRoutes.base()}
      isCollapsed={isCollapsed}
      onClick={onClick}
      active={isActive}
      open={isActive}
    >
      {renderSubItems()}
    </HuSidebarNavItem>
  );
};

export default LearningItem;
