/**
 * i18n Helper Utilities
 * 用于处理审批流程中的国际化 key 解析
 */

import { getTranslations, type Locale } from '@/locales';

/**
 * 解析 i18n key 为实际的翻译文本
 * @param key - i18n key (例如: "approvals.workRecord.processName")
 * @param locale - 语言 ('zh' | 'en')
 * @returns 翻译后的文本，如果 key 不存在则返回原始 key
 */
export function translateKey(key: string, locale: Locale = 'zh'): string {
  // 如果不是 i18n key 格式（不包含点号），直接返回
  if (!key || !key.includes('.')) {
    return key;
  }

  try {
    const t = getTranslations(locale);
    const parts = key.split('.');
    
    // 递归访问嵌套对象
    let value: any = t;
    for (const part of parts) {
      if (value && typeof value === 'object' && part in value) {
        value = value[part];
      } else {
        // key 不存在，返回原始 key
        return key;
      }
    }
    
    // 确保返回的是字符串
    return typeof value === 'string' ? value : key;
  } catch (error) {
    console.warn(`Failed to translate key: ${key}`, error);
    return key;
  }
}

/**
 * 批量翻译对象中的所有 i18n key
 * @param obj - 包含 i18n key 的对象
 * @param locale - 语言
 * @returns 翻译后的对象
 */
export function translateObject<T extends Record<string, any>>(
  obj: T,
  locale: Locale = 'zh'
): T {
  if (!obj || typeof obj !== 'object') {
    return obj;
  }

  const result: any = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    const value = obj[key];

    if (typeof value === 'string') {
      // 如果是字符串，尝试翻译
      result[key] = translateKey(value, locale);
    } else if (typeof value === 'object' && value !== null) {
      // 如果是对象或数组，递归翻译
      result[key] = translateObject(value, locale);
    } else {
      // 其他类型直接复制
      result[key] = value;
    }
  }

  return result as T;
}

/**
 * 检查字符串是否为 i18n key 格式
 * @param str - 要检查的字符串
 * @returns 是否为 i18n key
 */
export function isI18nKey(str: string): boolean {
  if (!str || typeof str !== 'string') {
    return false;
  }
  
  // i18n key 格式: 包含点号，且以字母开头
  return /^[a-zA-Z][a-zA-Z0-9.]*$/.test(str) && str.includes('.');
}

/**
 * 用于组件中的 Hook，自动翻译 i18n key
 * @param key - i18n key 或普通字符串
 * @param locale - 语言
 * @returns 翻译后的文本
 */
export function useI18nKey(key: string | undefined, locale: Locale = 'zh'): string {
  if (!key) {
    return '';
  }
  
  return isI18nKey(key) ? translateKey(key, locale) : key;
}

