// app/i18n.jsx — 다국어(i18n) 딕셔너리 + 로케일 컨텍스트
// window.RibbonI18n 로 노출. data.jsx 다음, 나머지 앱(jsx) 이전에 로드된다(index.html 순서).
//
// 지원 언어: 한국어(기본) · 日本語 · English · 中文. 선택은 상단 셀렉트박스(main.jsx),
// 저장은 localStorage('ribbon.locale'), 전역 미러는 window.RibbonData.currentLocale
// (chat.jsx 가 /api/chat 에 locale 로 실어 보냄 → 백엔드가 프롬프트 언어를 맞춘다).

const RIBBON_LOCALES = [
  { id: 'ko', label: '한국어', short: 'KO' },
  { id: 'ja', label: '日本語', short: 'JA' },
  { id: 'en', label: 'English', short: 'EN' },
  { id: 'zh', label: '中文', short: 'ZH' },
];
const RIBBON_DEFAULT_LOCALE = 'ko';

// 채팅 표면(UI 크롬) 문자열 — 키별 4개 언어. 없으면 t() 가 ko 로 폴백.
const RIBBON_STRINGS = {
  ko: {
    app_title: '알파카 — 리본 AI', prototype: '시제품',
    nav_chat: '챗봇', nav_admin: '관리자',
    lang_title: '언어 / Language', tenant_title: '업체 전환',
    status_online: '온라인', status_context: '맥락 유지 중',
    hdr_new: '새 대화', hdr_faq: 'FAQ 관리', hdr_close: '대화 종료(저장)',
    welcome_title: '무엇을 도와드릴까요?',
    welcome_sub: '리본 ERP의 인벤토리·예약·매출 데이터를 분석해 차트와 표로 답해 드려요. 맥락은 대화 내내 이어집니다.',
    suggested: '추천 질문',
    input_placeholder: '차종·기간·지표를 포함해 질문해 보세요',
    disclaimer: '리본 AI는 실수할 수 있어요. 중요한 수치는 원본 데이터를 확인하세요.',
    analyzing: '분석 중…', understanding: '질문 이해 중…', sources: '출처',
    act_copy: '복사', act_regen: '재생성', act_export: '내보내기', act_report: '문제제기',
    copied: '복사했어요', exported: '차트를 PNG로 내보냈어요',
    empty_reply: '(빈 응답)',
    side_recent: '최근 대화', side_empty: '아직 저장된 대화가 없어요.', side_pinned: '고정 질문', side_manage: '관리',
    act_delete: '삭제', act_pin: '고정',
    rel_now: '방금', rel_min: (n) => `${n}분 전`, rel_hour: (n) => `${n}시간 전`, rel_day: (n) => `${n}일 전`,
    faq_title: '자주 묻는 질문 관리', faq_sub: '자주 쓰는 질문을 등록하면 시작화면·사이드바에 노출됩니다',
    faq_new: '새 질문 등록', faq_placeholder: '예: 지점별 가동률 비교해줘', faq_add: '등록', faq_uses: (n) => `사용 ${n}회`,
    step_suffix: (n) => `${n}단계째`,
    calling: (name) => `${name} 호출 중`,
  },
  ja: {
    app_title: 'アルパカ — リボンAI', prototype: '試作',
    nav_chat: 'チャット', nav_admin: '管理',
    lang_title: '言語 / Language', tenant_title: '事業者切替',
    status_online: 'オンライン', status_context: '文脈を保持中',
    hdr_new: '新しい会話', hdr_faq: 'FAQ管理', hdr_close: '会話を終了(保存)',
    welcome_title: 'ご用件は何でしょう？',
    welcome_sub: 'リボンERPの在庫・予約・売上データを分析し、チャートと表でお答えします。文脈は会話の間ずっと保持されます。',
    suggested: 'おすすめの質問',
    input_placeholder: '車種・期間・指標を含めて質問してください',
    disclaimer: 'リボンAIは誤ることがあります。重要な数値は元データをご確認ください。',
    analyzing: '分析中…', understanding: '質問を理解中…', sources: '出典',
    act_copy: 'コピー', act_regen: '再生成', act_export: 'エクスポート', act_report: '問題報告',
    copied: 'コピーしました', exported: 'チャートをPNGで書き出しました',
    empty_reply: '(空の応答)',
    side_recent: '最近の会話', side_empty: '保存された会話はまだありません。', side_pinned: '固定質問', side_manage: '管理',
    act_delete: '削除', act_pin: '固定',
    rel_now: 'たった今', rel_min: (n) => `${n}分前`, rel_hour: (n) => `${n}時間前`, rel_day: (n) => `${n}日前`,
    faq_title: 'よくある質問の管理', faq_sub: 'よく使う質問を登録すると開始画面・サイドバーに表示されます',
    faq_new: '新しい質問を登録', faq_placeholder: '例: 拠点別の稼働率を比較して', faq_add: '登録', faq_uses: (n) => `使用 ${n}回`,
    step_suffix: (n) => `${n}ステップ目`,
    calling: (name) => `${name} を呼び出し中`,
  },
  en: {
    app_title: 'Alpaca — Reborn AI', prototype: 'Prototype',
    nav_chat: 'Chat', nav_admin: 'Admin',
    lang_title: 'Language / 언어', tenant_title: 'Switch company',
    status_online: 'Online', status_context: 'Context kept',
    hdr_new: 'New chat', hdr_faq: 'Manage FAQ', hdr_close: 'End & save',
    welcome_title: 'How can I help you?',
    welcome_sub: 'I analyze Reborn ERP inventory, booking, and revenue data and answer with charts and tables. Context is kept throughout the conversation.',
    suggested: 'Suggested questions',
    input_placeholder: 'Ask with a vehicle type, period, and metric',
    disclaimer: 'Reborn AI can make mistakes. Verify important figures against the source data.',
    analyzing: 'Analyzing…', understanding: 'Understanding your question…', sources: 'Sources',
    act_copy: 'Copy', act_regen: 'Regenerate', act_export: 'Export', act_report: 'Report',
    copied: 'Copied', exported: 'Exported chart as PNG',
    empty_reply: '(empty response)',
    side_recent: 'Recent', side_empty: 'No saved conversations yet.', side_pinned: 'Pinned', side_manage: 'Manage',
    act_delete: 'Delete', act_pin: 'Pin',
    rel_now: 'just now', rel_min: (n) => `${n}m ago`, rel_hour: (n) => `${n}h ago`, rel_day: (n) => `${n}d ago`,
    faq_title: 'Manage FAQs', faq_sub: 'Registered questions appear on the welcome screen and sidebar',
    faq_new: 'Add a question', faq_placeholder: 'e.g. Compare utilization by branch', faq_add: 'Add', faq_uses: (n) => `${n} uses`,
    step_suffix: (n) => `step ${n}`,
    calling: (name) => `calling ${name}`,
  },
  zh: {
    app_title: 'Alpaca — Reborn AI', prototype: '原型',
    nav_chat: '聊天', nav_admin: '管理',
    lang_title: '语言 / Language', tenant_title: '切换企业',
    status_online: '在线', status_context: '保持上下文',
    hdr_new: '新对话', hdr_faq: 'FAQ 管理', hdr_close: '结束并保存',
    welcome_title: '有什么可以帮您？',
    welcome_sub: '我会分析 Reborn ERP 的库存、预订和营收数据，用图表和表格作答。整个对话过程中都会保持上下文。',
    suggested: '推荐问题',
    input_placeholder: '请包含车型、时间段和指标来提问',
    disclaimer: 'Reborn AI 可能会出错。重要数据请核对原始数据。',
    analyzing: '分析中…', understanding: '正在理解问题…', sources: '来源',
    act_copy: '复制', act_regen: '重新生成', act_export: '导出', act_report: '反馈问题',
    copied: '已复制', exported: '已将图表导出为 PNG',
    empty_reply: '（空回复）',
    side_recent: '最近对话', side_empty: '还没有已保存的对话。', side_pinned: '置顶问题', side_manage: '管理',
    act_delete: '删除', act_pin: '置顶',
    rel_now: '刚刚', rel_min: (n) => `${n}分钟前`, rel_hour: (n) => `${n}小时前`, rel_day: (n) => `${n}天前`,
    faq_title: '常见问题管理', faq_sub: '登记常用问题后会显示在欢迎页和侧边栏',
    faq_new: '添加新问题', faq_placeholder: '例：按门店比较出租率', faq_add: '添加', faq_uses: (n) => `使用 ${n} 次`,
    step_suffix: (n) => `第${n}步`,
    calling: (name) => `正在调用 ${name}`,
  },
};

// 시작화면 추천 질문 칩 — 언어별. 클릭 시 해당 언어 질문이 그대로 전송된다(LLM 이 다국어 처리).
const RIBBON_CHIPS = {
  ko: window.RibbonData.STARTER_CHIPS,
  ja: [
    '明日の済州の天気と祝日を踏まえて、SUVの料金をどう設定すべき？',
    '今後どの車種クラスを増やすべき？稼働率を基準に教えて',
    '今週末、済州で何かイベントはある？料金に反映されてる？',
    '近づく祝日を教えて、その週の料金をシミュレーションして',
    '今週の済州SUVの稼働率とおすすめ料金を教えて',
    '済州フリート全体の稼働率と機会損失需要を要約して',
  ],
  en: [
    "Given tomorrow's Jeju weather and holidays, how should I set SUV rates?",
    'Which vehicle segments should I add? Base it on utilization.',
    'Any events in Jeju this weekend? Are they reflected in the rates?',
    "Tell me the upcoming holidays and simulate that week's rates.",
    "Show this week's Jeju SUV utilization and recommended rates.",
    'Summarize Jeju fleet-wide utilization and unmet demand.',
  ],
  zh: [
    '根据明天济州的天气和公休日，SUV 的价格该怎么定？',
    '接下来应该增加哪个车型级别？请以出租率为依据。',
    '这个周末济州有什么活动吗？价格反映了吗？',
    '告诉我即将到来的公休日，并模拟那一周的价格。',
    '给我这周济州 SUV 的出租率和推荐价格。',
    '总结济州全车队的出租率和流失需求。',
  ],
};

function ribbonNormLocale(x) {
  return RIBBON_LOCALES.some((l) => l.id === x) ? x : RIBBON_DEFAULT_LOCALE;
}
function ribbonInitialLocale() {
  try {
    const saved = localStorage.getItem('ribbon.locale');
    if (saved) return ribbonNormLocale(saved);
  } catch (e) {}
  // 브라우저 언어 추정(첫 방문): ja/en/zh 면 그 언어, 그 외는 기본(ko).
  const nav = (typeof navigator !== 'undefined' && (navigator.language || '')).toLowerCase();
  if (nav.startsWith('ja')) return 'ja';
  if (nav.startsWith('zh')) return 'zh';
  if (nav.startsWith('en')) return 'en';
  return RIBBON_DEFAULT_LOCALE;
}

// t(locale, key, ...args): 문자열 또는 함수(보간) 모두 지원. 미정의 키는 ko 폴백 후 키 자체.
function ribbonT(locale, key, ...args) {
  const loc = ribbonNormLocale(locale);
  const val = (RIBBON_STRINGS[loc] && RIBBON_STRINGS[loc][key]) ?? (RIBBON_STRINGS.ko && RIBBON_STRINGS.ko[key]) ?? key;
  return typeof val === 'function' ? val(...args) : val;
}
function ribbonChips(locale) {
  const loc = ribbonNormLocale(locale);
  return RIBBON_CHIPS[loc] || RIBBON_CHIPS.ko;
}

// 로케일 컨텍스트 — App 이 Provider 로 감싸고, 하위 컴포넌트는 useLocale()/useT() 로 소비.
const RibbonLocaleCtx = React.createContext(RIBBON_DEFAULT_LOCALE);
function ribbonUseLocale() { return React.useContext(RibbonLocaleCtx); }
function ribbonUseT() {
  const loc = React.useContext(RibbonLocaleCtx);
  return React.useCallback((key, ...args) => ribbonT(loc, key, ...args), [loc]);
}

// 전역 미러 — 최초 로드 시점에 세팅(훅 밖의 함수(askBackendStream 등)가 참조).
window.RibbonData.currentLocale = ribbonInitialLocale();

window.RibbonI18n = {
  LOCALES: RIBBON_LOCALES,
  DEFAULT: RIBBON_DEFAULT_LOCALE,
  normLocale: ribbonNormLocale,
  initialLocale: ribbonInitialLocale,
  t: ribbonT,
  chips: ribbonChips,
  LocaleCtx: RibbonLocaleCtx,
  useLocale: ribbonUseLocale,
  useT: ribbonUseT,
};
