import { I18n } from 'i18n-js';
import { useEffect, useMemo } from 'react';
import zh from './zh';
import en from './en';
import { useSettingsStore } from '../store/settingsStore';
import type { Locale } from '../store/settingsStore';

/**
 * i18n 实例（plan.md「1.3 国际化」）。
 * - useSettingsStore.locale 驱动语言切换
 * - 组件用 useT() hook 拿到 t 函数，locale 变化时自动重渲染
 */

const i18n = new I18n({ zh, en });
i18n.defaultLocale = 'zh';
i18n.enableFallback = true;

export default i18n;

/** 收集对象的所有叶子路径（用于测试 key 一致性）。 */
function collectKeys(obj: unknown, prefix = ''): string[] {
  const keys: string[] = [];
  if (obj && typeof obj === 'object') {
    for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {
      const path = prefix ? `${prefix}.${k}` : k;
      if (v && typeof v === 'object') {
        keys.push(...collectKeys(v, path));
      } else {
        keys.push(path);
      }
    }
  }
  return keys;
}

/** 导出 key 集合（测试用）。 */
export const zhKeys = new Set(collectKeys(zh));
export const enKeys = new Set(collectKeys(en));

/**
 * React hook：返回绑定当前 locale 的 t 函数。
 * 订阅 settingsStore.locale，变化时触发组件重渲染。
 *
 * 用法：const t = useT(); t('home.title')
 */
export function useT() {
  const locale = useSettingsStore(s => s.locale);
  // 副作用移入 useEffect，避免在渲染期间修改全局状态（React Concurrent 安全）
  useEffect(() => {
    i18n.locale = locale;
  }, [locale]);
  // 同步设置一次（首次渲染时 useEffect 尚未执行，保证当次渲染翻译正确）
  i18n.locale = locale;
  return useMemo(() => i18n.t.bind(i18n), []);
}

/** 非响应式翻译（用于 store/工具函数，不在组件里）。 */
export function t(key: string, options?: Record<string, unknown>): string {
  return i18n.t(key, options);
}

/** 设置当前 locale（store 变化时由 hook 调用，也可手动）。 */
export function setLocale(locale: Locale): void {
  i18n.locale = locale;
}
