import { APP_ROUTE_METAS } from '@/defines/appRoutes';
import { withLangPrefix } from '@/hooks/useAppNavigate';

export interface NavMenuItem {
    name: string;
    /** 完整路径（含语言前缀，按渲染模式而定）：SSG → /en/home；CSR → /home。 */
    path: string;
    locale?: string;
}

/** 渲染模式编译期常量（vite.config 的 define 注入），用于两套实现的编译期隔离。 */
const isCSR = import.meta.env.VITE_RENDER_MODE === 'csr';

// ————————————————————————————————————————————————————————————————
// CSR 模式：从路由「纯数据」清单 APP_ROUTE_METAS 生成菜单（取 hideInMenu !== true 的项）。
// 该清单不 import 任何组件，故不会牵出 routes.tsx→BasicLayout→Topbar 的循环依赖；
// routes.tsx 与本文件共同消费这份清单，实现「路由与菜单单一数据源」。
// ————————————————————————————————————————————————————————————————

function getCsrMenuItems(): NavMenuItem[] {
    return APP_ROUTE_METAS.filter((meta) => meta.hideInMenu !== true).map((meta) => ({
        name: meta.name,
        path: `/${meta.path}`,
        locale: meta.locale,
    }));
}

// ————————————————————————————————————————————————————————————————
// SSG 模式：与 CSR 同源，都从 APP_ROUTE_METAS 派生（取 hideInMenu !== true 的项）；
// 差异仅在路径拼法——SSG 由 withLangPrefix 按当前语言补 /<lang> 前缀。
// framework 模式的路由源（src/routes.ts）是 route()/prefix() DSL，无 name/hideInMenu 可反推，
// 故菜单不从 routes.ts 反推，而与 CSR 共用这份纯数据清单。
// ————————————————————————————————————————————————————————————————

function getSsgMenuItems(lang?: string): NavMenuItem[] {
    return APP_ROUTE_METAS.filter((meta) => meta.hideInMenu !== true).map((meta) => ({
        name: meta.name,
        path: withLangPrefix(meta.path, lang),
        locale: meta.locale,
    }));
}

/**
 * 获取导航菜单项。两种渲染模式同源，都从 defines/appRoutes.ts 的 APP_ROUTE_METAS 派生，
 * 按编译期常量 VITE_RENDER_MODE 隔离路径拼法：
 * - CSR：path 为 /<segment>。
 * - SSG：path 为 /<lang>/<segment>（withLangPrefix 按当前语言补前缀）。
 *
 * 构建时非当前模式的分支会被 dead-code 消除。APP_ROUTE_METAS 是纯数据、无组件依赖，不构成循环依赖。
 *
 * @param lang 当前语言短码（来自 useParams().lang）。仅 SSG 使用；CSR 忽略。
 */
export function getNavMenuItems(lang?: string): NavMenuItem[] {
    if (isCSR) return getCsrMenuItems();
    return getSsgMenuItems(lang);
}
