import type { ReactNode } from 'react';
import {
  AppstoreOutlined,
  ContactsOutlined,
  DashboardOutlined,
  ProfileOutlined,
  SettingOutlined,
  TeamOutlined,
} from '@ant-design/icons';
import Customers from '@/pages/business/customers';
import Orders from '@/pages/business/orders';
import Dashboard from '@/pages/dashboard';
import Users from '@/pages/system/users';

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

/**
 * 路由 / 菜单唯一数据源。
 * 新增页面时在这里配置即可，侧边栏、面包屑会自动生效。
 */
export const appRoutes: AppRouteItem[] = [
  {
    path: '/dashboard',
    title: '工作台',
    icon: <DashboardOutlined />,
    element: <Dashboard />,
  },
  {
    path: '/system',
    title: '系统管理',
    icon: <SettingOutlined />,
    children: [
      {
        path: '/system/users',
        title: '用户管理',
        icon: <TeamOutlined />,
        element: <Users />,
      },
    ],
  },
  {
    path: '/business',
    title: '业务管理',
    icon: <AppstoreOutlined />,
    children: [
      {
        path: '/business/orders',
        title: '订单管理',
        icon: <ProfileOutlined />,
        element: <Orders />,
      },
      {
        path: '/business/customers',
        title: '客户管理',
        icon: <ContactsOutlined />,
        element: <Customers />,
      },
    ],
  },
];

/** 从路由树中找到某个路径的完整面包屑链路。 */
export const 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 const findFirstPath = (item: AppRouteItem): string | null => {
  if (item.children?.length) {
    for (const child of item.children) {
      if (child.hideInMenu) continue;
      const target = findFirstPath(child);
      if (target) return target;
    }
    return null;
  }

  return item.path;
};
