/**
 * Client-side Exception Reporter (ファサード)
 *
 * pocxr 本番はクライアント例外をサーバーに送信していたが、NS には対応する
 * テレメトリ REST が無いためネットワーク層を全て削除し、
 * `console.error` のみのファサードにする (計画書 §1.2.2 / §3.2(5))。
 * `captureException(err, ctx)` / `setupGlobalErrorHandlers()` / `setUserInfo()` の
 * シグネチャは import 元 (`widget-app-persistent.js` / `openai-realtime-connector.js`)
 * を無改変にするため維持する。
 */

let userId = null;
let sessionId = null;
let handlersInstalled = false;

/**
 * ユーザー情報を設定 (ローカル保持のみ)
 * @param {Object} userInfo - { userId, sessionId }
 */
export function setUserInfo(userInfo) {
  if (userInfo && userInfo.userId) userId = userInfo.userId;
  if (userInfo && userInfo.sessionId) sessionId = userInfo.sessionId;
}

/**
 * 例外を console.error に出力する (ネットワーク送信なし)
 * @param {Error} error - エラーオブジェクト
 * @param {Object} [context] - 追加コンテキスト
 * @returns {Promise<boolean>} - 常に true (出力成功)
 */
export async function reportException(error, context = {}) {
  console.error('[ExceptionReporter]', error && (error.name || 'Error'), error && error.message, {
    userId,
    sessionId,
    ...context,
  });
  return true;
}

/**
 * 後方互換のためのキュー API (即時 console 出力に縮退)
 */
export function queueException(error, context = {}) {
  reportException(error, context).catch(() => {});
}

/**
 * 後方互換のための flush API (キューを持たないため no-op)
 */
export async function flushExceptionQueue() {
  // no-op — reportException が即時出力するためキューは存在しない
}

/**
 * グローバルエラーハンドラーを設定 (console.error 出力のみ、ネットワーク送信なし)
 */
export function setupGlobalErrorHandlers() {
  if (handlersInstalled || typeof window === 'undefined') return;
  handlersInstalled = true;

  window.addEventListener('error', (event) => {
    const error = event.error || new Error(event.message);
    reportException(error, { type: 'uncaught_error', filename: event.filename, lineno: event.lineno });
  });

  window.addEventListener('unhandledrejection', (event) => {
    const error = event.reason instanceof Error ? event.reason : new Error(String(event.reason));
    error.name = error.name || 'UnhandledRejection';
    reportException(error, { type: 'unhandled_rejection' });
  });

  console.log('[ExceptionReporter] Global error handlers initialized (console-only)');
}

/**
 * try-catchラッパー（非同期関数用）
 * @param {Function} fn - 非同期関数
 * @param {Object} [context] - コンテキスト情報
 * @returns {Function} - ラップされた関数
 */
export function withExceptionReporting(fn, context = {}) {
  return async function (...args) {
    try {
      return await fn.apply(this, args);
    } catch (error) {
      reportException(error, { ...context, functionName: fn.name || 'anonymous' });
      throw error;
    }
  };
}

/**
 * 手動でエラーを報告（catchブロック内で使用）。console.error のみ。
 * @param {Error} error - エラーオブジェクト
 * @param {string} [operation] - 操作名
 * @param {Object} [additionalContext] - 追加コンテキスト
 */
export function captureException(error, operation = '', additionalContext = {}) {
  reportException(error, { operation, ...additionalContext });
}

// デフォルトエクスポート
export default {
  setUserInfo,
  reportException,
  queueException,
  flushExceptionQueue,
  setupGlobalErrorHandlers,
  withExceptionReporting,
  captureException
};
