import type { ReactNode } from 'react';
import {
  AppstoreOutlined,
  ContactsOutlined,
  DashboardOutlined,
  KeyOutlined,
  MenuOutlined,
  ProfileOutlined,
  SafetyCertificateOutlined,
  SettingOutlined,
  TeamOutlined,
  ThunderboltOutlined,
} from '@ant-design/icons';
import { PERMISSION } from '@/constants/permissions';
import Customers from '@/pages/business/customers';
import Orders from '@/pages/business/orders';
import Dashboard from '@/pages/dashboard';
import ButtonPermission from '@/pages/system/permission/button';
import MenuPermission from '@/pages/system/permission/menu';
import Roles from '@/pages/system/roles';
import Users from '@/pages/system/users';

export interface AppRouteItem {
  /** 完整路径，同时作为菜单 key */
  path: string;
  title: string;
  icon?: ReactNode;
  /** 页面组件。仅作为分组的路由可以不传 */
  element?: ReactNode;
  /** 访问该路由所需权限码 */
  permission?: string;
  hideInMenu?: boolean;
  children?: AppRouteItem[];
}

/**
 * 路由 / 菜单唯一数据源。
 * 新增页面时在这里配置即可，侧边栏、面包屑、路由守卫会自动生效。
 */
export const appRoutes: AppRouteItem[] = [
  {
    path: '/dashboard',
    title: '工作台',
    icon: <DashboardOutlined />,
    permission: PERMISSION.DASHBOARD_VIEW,
    element: <Dashboard />,
  },
  {
    path: '/system',
    title: '系统管理',
    icon: <SettingOutlined />,
    children: [
      {
        path: '/system/users',
        title: '用户管理',
        icon: <TeamOutlined />,
        permission: PERMISSION.USER_VIEW,
        element: <Users />,
      },
      {
        path: '/system/roles',
        title: '角色管理',
        icon: <SafetyCertificateOutlined />,
        permission: PERMISSION.ROLE_VIEW,
        element: <Roles />,
      },
      {
        path: '/system/permission',
        title: '权限中心',
        icon: <KeyOutlined />,
        children: [
          {
            path: '/system/permission/menu',
            title: '菜单权限',
            icon: <MenuOutlined />,
            permission: PERMISSION.PERMISSION_MENU,
            element: <MenuPermission />,
          },
          {
            path: '/system/permission/button',
            title: '按钮权限',
            icon: <ThunderboltOutlined />,
            permission: PERMISSION.PERMISSION_BUTTON,
            element: <ButtonPermission />,
          },
        ],
      },
    ],
  },
  {
    path: '/business',
    title: '业务管理',
    icon: <AppstoreOutlined />,
    children: [
      {
        path: '/business/orders',
        title: '订单管理',
        icon: <ProfileOutlined />,
        permission: PERMISSION.ORDER_VIEW,
        element: <Orders />,
      },
      {
        path: '/business/customers',
        title: '客户管理',
        icon: <ContactsOutlined />,
        permission: PERMISSION.CUSTOMER_VIEW,
        element: <Customers />,
      },
    ],
  },
];

/** 从路由树中找到某个路径的完整面包屑链路。 */
export function findBreadcrumb(
  pathname: string,
  routes: AppRouteItem[] = appRoutes,
  parent: AppRouteItem[] = [],
): AppRouteItem[] | null {
  for (const route of routes) {
    const trail = [...parent, route];
    if (route.path === pathname) return trail;
    if (route.children) {
      const result = findBreadcrumb(pathname, route.children, trail);
      if (result) return result;
    }
  }
  return null;
}

/** 找到一组路由中第一个有权限访问的页面路径。 */
export function findFirstAccessiblePath(
  item: AppRouteItem,
  hasPermission: (permission?: string) => boolean,
): string | null {
  if (item.permission && !hasPermission(item.permission)) return null;

  if (item.children?.length) {
    for (const child of item.children) {
      if (child.hideInMenu) continue;
      const target = findFirstAccessiblePath(child, hasPermission);
      if (target) return target;
    }
    return null;
  }

  return item.path;
}
