/* ============================================================
   聆譯 — useTranslator
   把 LingyiTranslator(WebRTC 引擎)包成 React hook。
   只做真實的 OpenAI 即時翻譯;連不上(例如未設金鑰)時顯示明確提示,
   不會播放任何預設內容。
   回傳: { lines, partial, mode, errorMsg }
     mode: 'idle' | 'connecting' | 'live' | 'error'
   ============================================================ */
const { useState: useStateT, useEffect: useEffectT, useRef: useRefT } = React;

function useTranslator(active, opts) {
  const { source, outLang, voice, settings, onStatus, recordMeta } = opts;
  const [lines, setLines] = useStateT([]);
  const [partial, setPartial] = useStateT(null);
  const [mode, setMode] = useStateT("idle");
  const [errorMsg, setErrorMsg] = useStateT("");
  const engineRef = useRefT(null);
  const linesRef = useRefT([]);    // 目前逐字稿快照(供停止存檔)
  const startedAt = useRefT(0);    // 本次開始時間
  const status = onStatus || function () {};

  // 主生命週期:開始 / 停止
  useEffectT(() => {
    if (!active) {
      if (engineRef.current) { engineRef.current.stop(); engineRef.current = null; }
      setLines([]); setPartial(null); setMode("idle"); setErrorMsg("");
      return;
    }
    let cancelled = false;
    setLines([]); setPartial(null); setErrorMsg("");
    setMode("connecting");
    status("connecting");

    const eng = new LingyiTranslator({
      source, voice,
      origVol: settings.origVol, transVol: settings.transVol,
      onPartial: (t) => { if (!cancelled) setPartial({ out: t }); },
      onFinal: ({ out, src }) => {
        if (cancelled) return;
        // ts 為顯示層用的時間戳(會後回看),不影響翻譯接收邏輯
        setLines((prev) => [...prev, { id: prev.length + "-" + Math.random().toString(36).slice(2, 6), out, src, ts: Date.now() }]);
        setPartial(null);
      },
      onSourceTranscript: () => { /* 來源語逐字稿接口:本版前台不顯示,保留備用 */ },
      onStatus: (st) => { if (!cancelled) status(st); },
      onError: (e) => { if (!cancelled) setErrorMsg(e.message || ""); },
    });
    engineRef.current = eng;

    eng.start({
      source, outputLanguage: outLang,
      backendUrl: settings.backendUrl, overrideKey: settings.apiKey, voice,
      inputDeviceId: settings.inputDevice, outputDeviceId: settings.outputDevice,
    })
      .then(() => { if (!cancelled) setMode("live"); })
      .catch((err) => {
        if (cancelled) return;
        engineRef.current = null;
        setMode("error");
        status("err");
        if (err && err.code === "no_api_key") {
          setErrorMsg("尚未連線:請到「設定 → 連線」確認已填入 OpenAI 金鑰,或在後端 .env 設定後重啟。");
        } else {
          setErrorMsg((err && err.message) || "無法連線,請稍後再試。");
        }
      });

    return () => { cancelled = true; if (engineRef.current) { engineRef.current.stop(); engineRef.current = null; } };
  }, [active]);

  // 即時換輸出語言(不重建連線)
  useEffectT(() => {
    if (engineRef.current && mode === "live") engineRef.current.setOutputLanguage(outLang);
  }, [outLang]);

  // 發聲切換
  useEffectT(() => {
    if (engineRef.current) engineRef.current.setVoice(voice);
  }, [voice]);

  // 音量(原音壓低 / 翻譯音量)
  useEffectT(() => {
    if (engineRef.current) engineRef.current.setVolumes(settings.origVol, settings.transVol);
  }, [settings.origVol, settings.transVol]);

  // 持續快照逐字稿(停止時畫面會清空,先留住內容供存檔)
  useEffectT(() => { linesRef.current = lines; }, [lines]);

  // 開始/停止:停止時若有內容且開啟「自動儲存逐字稿」,存成一筆會議紀錄
  useEffectT(() => {
    if (active) { startedAt.current = Date.now(); linesRef.current = []; return; }
    if (startedAt.current && settings.saveTranscript && linesRef.current && linesRef.current.length
        && window.LingyiRecords && recordMeta) {
      window.LingyiRecords.addRecord({
        title: recordMeta.title || "翻譯",
        ts: startedAt.current,
        durationSec: Math.round((Date.now() - startedAt.current) / 1000),
        fromLang: recordMeta.fromLang || "",
        toLang: recordMeta.toLang || "",
        kind: recordMeta.kind || "",
        lines: linesRef.current.map((l) => ({ out: l.out, src: l.src || "" })),
      });
    }
    startedAt.current = 0;
  }, [active]);

  return { lines, partial, mode, errorMsg };
}

window.useTranslator = useTranslator;
