import { useCallback } from 'react';

import { useNavigate, useParams, type NavigateOptions } from 'react-router-dom';

import { DEFAULT_LANG } from '@/i18n/langConfig';

/**
 * 统一的"语言前缀感知"导航封装，屏蔽 CSR / SSG 两种渲染模式的路由差异。
 *
 * 背景：项目支持两种渲染模式（见 docs/SSG.md），路由结构不同：
 * - SSG（framework）模式：路由为 /:lang/xxx（如 /en/home），内部跳转需带语言前缀。
 * - CSR 模式：路由为 /xxx（如 /home），无语言前缀。
 *
 * 渲染模式在**构建期**由 vite.config 的 define 注入为编译期常量 import.meta.env.VITE_RENDER_MODE，
 * 因此这里直接按模式区分，而非靠运行时 useParams().lang 是否有值来"猜"模式
 * （SSG 下若当前不在 :lang 路由，useParams().lang 也会是 undefined，那种判断会误判）。
 *
 * 调用方一律传**不含语言前缀的逻辑路径**（如 'home'、'/privacy'），前缀由本封装按模式补齐。
 */

/** 默认语言短码（如 en-US → en），SSG 下当前无 :lang 段时的回退前缀。 */
const DEFAULT_LANG_SEGMENT = DEFAULT_LANG.split('-')[0];

const isSSG = import.meta.env.VITE_RENDER_MODE !== 'csr';

/** 把逻辑路径归一为以单个 '/' 开头、无重复斜杠的形式（'home' / '/home' → '/home'）。 */
function normalizePath(to: string): string {
    return `/${to.replace(/^\/+/, '')}`;
}

/**
 * 给逻辑路径补语言前缀。
 * - SSG 模式：/<lang><path>（lang 缺省用默认语言短码）。
 * - CSR 模式：原样返回（无前缀）。
 * @param to 不含语言前缀的逻辑路径，如 'home' 或 '/privacy'。
 * @param lang 当前语言短码；缺省回退默认语言短码。CSR 模式下忽略此参数。
 */
export function withLangPrefix(to: string, lang?: string): string {
    const path = normalizePath(to);
    if (!isSSG) return path;
    const seg = lang || DEFAULT_LANG_SEGMENT;
    return `/${seg}${path}`;
}

/**
 * 语言前缀感知的 navigate。用法与 react-router 的 navigate 一致，但 to 只传逻辑路径（不带语言前缀）。
 * SSG 下自动补当前语言前缀，CSR 下原样跳转。
 *
 * 注意：仅处理**内部 SPA 路由**跳转。外链（http/mailto）、整页跳转请直接用 <a> / window.location。
 */
export function useAppNavigate() {
    const navigate = useNavigate();
    // SSG 下取当前 URL 的语言段以保持同语言导航；CSR 下 useParams 无 lang，忽略。
    const { lang } = useParams();

    return useCallback(
        (to: string, options?: NavigateOptions) => {
            navigate(withLangPrefix(to, lang), options);
        },
        [navigate, lang]
    );
}
