import { DEFAULT_LANG } from '@/i18n/langConfig';
import { localeDir } from '@/locales/dirMap';

/**
 * 按页面类型与语言动态加载 Markdown 文案（如服务条款、隐私政策）
 */
type MdPageType = 'termsOfService' | 'privacyPolicy';

// 匹配 @/assets/md/{pageName}_{lang}.md，如 termsOfService_en-US.md、privacyPolicy_zh-CN.md
const rawMdModules = import.meta.glob<string>('@/assets/md/*_*.md', {
    query: '?raw',
    import: 'default',
});

const mdLoaders: Record<string, Record<string, () => Promise<string>>> = {};
Object.keys(rawMdModules).forEach((key) => {
    const match = key.match(/\/([^/]+)_([\w-]+)\.md$/);
    if (match) {
        const [, pageName, lang] = match;
        if (!mdLoaders[pageName!]) mdLoaders[pageName!] = {};
        mdLoaders[pageName!]![lang!] = () => (rawMdModules[key] as () => Promise<string>)();
    }
});

const dirByLang: Record<string, 'ltr' | 'rtl'> = { ...localeDir };

export interface LoadMdByLangOptions {
    /** 占位符替换：key 为 MD 中的占位符（如 [Insert Date]），value 为替换后的字符串 */
    replacements?: Record<string, string>;
}

/**
 * 根据当前语言加载 Markdown 内容；无该语言时回退到英文。返回内容及实际使用的语言。
 * 可通过 options.replacements 替换 MD 中的占位符（如 [Insert Date]）。
 */
export async function loadMdByLang(
    page: MdPageType,
    lang: string,
    options?: LoadMdByLangOptions
): Promise<{ content: string; usedLang: string }> {
    const loaders = mdLoaders[page];
    const hasLang = Boolean(loaders?.[lang]);
    const usedLang = hasLang ? lang : DEFAULT_LANG;
    const loader = loaders?.[usedLang] ?? loaders?.[DEFAULT_LANG];
    if (!loader) return { content: '', usedLang };
    let content = await loader();
    const replacements = options?.replacements;
    if (replacements && Object.keys(replacements).length > 0) {
        content = Object.entries(replacements).reduce(
            (acc, [placeholder, value]) => acc.replaceAll(placeholder, value),
            content
        );
    }
    return { content, usedLang };
}

/**
 * 根据语言获取文案方向（ltr/rtl），用于 dir 与样式
 */
export function getDirByLang(lang: string): 'ltr' | 'rtl' {
    return dirByLang[lang] ?? 'ltr';
}

export type { MdPageType };
