/**
 * OpenAI Realtime API Tool Handler
 * Function Callの処理とレスポンス管理
 *
 * NS 移植版: 記憶機能系 (読み書き・イベントトリガー)・NeonDB 系 (ユーザープロフィール・
 * ケース参照)・UI Control 系 (プロフィールパネル)・外部API依存系
 * (getCurrentPosition / NeccosRAG / search_site_content / getForecast / web_search)
 * のハンドラーは全て削除済み (計画書 §5.1 / §5.4)。残るのは
 * postMessage 系の2ツールのみ:
 *   - navigate_page (postMessage)
 *   - prefill_contact_form (postMessage)
 *
 * 2026-08 撤去記録: GetSystemDate ハンドラー (handleGetSystemDate、
 * クライアント完結) は 0.3.0-dev.60 で削除した — 現在の日時は
 * includes/prompt.php の current_datetime セクションが両モードに常時供給する
 * ようになったため、ツール経由での取得は不要になった。
 */

import { createLogger } from "../debug-logger.js";
import { TOOL_NAMES as TN } from "../../constants/tool-names.js";
// INV-12: LLM に返す文言も §4.4 の辞書経由 (英語フォールバック + ja.po で復元)。
import { t } from "../../ns/ns-rest.js";

// デバッグロガー
const logger = createLogger('ToolHandler');

// FunctionNames は共通定数 tool-names.js (TN) から参照
const FunctionNames = TN;

// ナビゲーションURLマップ: window.__AGENT_CONFIG__.navigation から取得
function getNavigationUrlMap() {
  const navigation = window.__AGENT_CONFIG__?.navigation || {};
  const urlMap = navigation.url_map || {};
  const siteUrl = navigation.site_url || "";
  const result = {};
  for (const [key, val] of Object.entries(urlMap)) {
    result[key] = { title: val.title, url: siteUrl + val.path };
  }
  return result;
}

export class ToolHandler {
  constructor() {
    this.onFunctionResponse = null;
    // ナビゲーション等のアクションコールバック（widget-appのhandleActionと連携）
    this.onAction = null;
    // 会話コンテキスト（呼び出し元 widget-app-persistent.js 互換のため維持。
    // 残存ツールでは参照しないが addConversationContext() は無改変で呼ばれ続ける）
    this._conversationContext = [];
    this._maxContextSize = 15;
    // セッションID（呼び出し元互換のため維持。残存ツールでは未使用）
    this._sessionId = null;
  }

  /**
   * セッションIDを設定 (呼び出し元 widget-app-persistent.js 互換のため維持)
   * @param {string|null} sessionId - セッションID
   */
  setSessionId(sessionId) {
    this._sessionId = sessionId;
  }

  /**
   * ページコンテキストを設定（F-1 provenance用）
   * @param {{ url?: string, title?: string, path?: string }} ctx
   */
  setPageContext(ctx) {
    this._pageContext = ctx || null;
  }

  setOnFunctionResponse(callback) {
    this.onFunctionResponse = callback;
  }

  async handleFunctionCall(functionCall) {
    const { name, call_id, arguments: argsString } = functionCall;

    let args = {};
    try {
      if (argsString) {
        args = JSON.parse(argsString);
      }
    } catch (e) {
      logger.error("Failed to parse function arguments:", e);
    }

    logger.log(` Function call: ${name}`, args);

    switch (name) {
      case FunctionNames.NAVIGATE_PAGE:
        this.handleNavigatePage(call_id, args);
        break;
      case FunctionNames.PREFILL_CONTACT_FORM:
        this.handlePrefillContactForm(call_id, args);
        break;
      default:
        logger.warn(` Unknown function: ${name}`);
        this.sendResponse(call_id, { error: `Unknown function: ${name}` });
    }
  }

  sendResponse(callId, data) {
    if (this.onFunctionResponse) {
      this.onFunctionResponse(callId, data);
    }
  }

  // 2026-08 撤去記録: handleGetSystemDate() を 0.3.0-dev.60 でここから削除
  // — 上記ファイル冒頭コメント参照。

  /**
   * 会話コンテキストに追加（呼び出し元 widget-app-persistent.js 互換のため維持）
   * @param {string} role
   * @param {string} content
   */
  addConversationContext(role, content) {
    if (!content) return;
    this._conversationContext.push({
      role,
      content,
      timestamp: new Date().toISOString()
    });
    // 最大件数を超えたら古いものを削除
    if (this._conversationContext.length > this._maxContextSize) {
      this._conversationContext.shift();
    }
  }

  handleNavigatePage(callId, args) {
    const category = args?.category;
    if (!category || category.length === 0) {
      this.sendResponse(callId, { error: "Category Not Found", category });
      return;
    }

    const urlMap = getNavigationUrlMap();
    const urlInfo = urlMap[category];

    if (!urlInfo) {
      this.sendResponse(callId, { error: "Invalid Category", category });
      return;
    }

    this.sendResponse(callId, {
      result: "success",
      message: t("tool_navigate_say", 'Say "Here is {title}." Do not include URLs or links in the response.').replace(
        "{title}",
        urlInfo.title
      ),
    });

    // テキストモードと同じ handleAction パターンでナビゲーション実行
    if (this.onAction) {
      this.onAction({ type: "navigate", url: urlInfo.url, title: urlInfo.title });
    }
    logger.log(` NavigatePage: ${urlInfo.title} - ${urlInfo.url}`);
  }

  handlePrefillContactForm(callId, args) {
    try {
      this.sendResponse(callId, {
        success: true,
        message: t("tool_form_prefilled", "Automatically filled the contact form with the information."),
      });

      if (this.onAction) {
        this.onAction({ type: "prefill", data: args || {} });
      }
    } catch (error) {
      logger.error("PrefillContactForm error:", error);
      this.sendResponse(callId, {
        success: false,
        error: error.message || t("tool_form_prefill_failed", "Failed to autofill the form"),
      });
    }
  }
}
