/**
 * Navigation Context
 *
 * ページURLとAIエージェントの文脈を紐付けるマップ。
 * pjax遷移時にコンテキストとクイックアクションを動的に更新する。
 * WordPress側プラグイン(Session 4)から postMessage で page-navigation を受信。
 *
 * データソース:
 *   1. window.__AGENT_CONFIG__.page_contexts（サーバーからJSON設定を注入）
 *   2. フォールバック: 従来のハードコードデータ（__AGENT_CONFIG__ が未定義の場合）
 */

import { t } from "../ns/ns-rest.js";

// ── JSON設定からデータを取得、未定義時はハードコードにフォールバック ──

const cfg = globalThis.window === undefined ? undefined : globalThis.__AGENT_CONFIG__;

/**
 * フォールバックデータ（最小限）
 * __AGENT_CONFIG__.page_contexts が存在しない環境でのデフォルト。
 * 本番環境ではサーバー設定（config/defaults.json）からページコンテキストが注入されるため、
 * ここではデフォルトコンテキストのみ保持する。
 */
const FALLBACK_PAGES = {};

// 0.3.0 (i18n): ブランド名ハードコードをやめ、サイト名は
// __AGENT_CONFIG__.locale.site_name (= get_bloginfo('name'))、文言は §4.4 の
// window.__NS_I18N__ 辞書から引く。ソース上のリテラルは英語フォールバックのみ
// (INV-12)。site_name 未注入時 (フレーム外) は空文字になる。
const FALLBACK_SITE_NAME = cfg?.locale?.site_name || "";

const FALLBACK_DEFAULT = {
  label: FALLBACK_SITE_NAME,
  prompt: t("nav_default_prompt", "The user is browsing the {site} website.").replace("{site}", FALLBACK_SITE_NAME),
  // quick_actions はここに持たない（ui_settings.quick_actions_ui を EJS で描画）
};

// ── データソースの解決 ──

const pageContexts = cfg?.page_contexts?.pages || FALLBACK_PAGES;
const defaultContext = cfg?.page_contexts?.default || FALLBACK_DEFAULT;

/**
 * PAGE_CONTEXTS: 外部からの参照用（後方互換）
 */
export const PAGE_CONTEXTS = pageContexts;

/**
 * パスを正規化（末尾スラッシュ付き）
 */
function normalizePath(urlOrPath) {
  let path;
  try {
    const url = new URL(urlOrPath, "https://placeholder.local");
    path = url.pathname;
  } catch {
    path = urlOrPath || "/";
  }
  if (!path.endsWith("/")) path += "/";
  return path;
}

/**
 * URL パスからページコンテキストを取得
 * 先頭一致で最も長いマッチを返す
 *
 * @param {string} urlOrPath - URL またはパス
 * @returns {object} コンテキスト
 */
export function getPageContext(urlOrPath) {
  const path = normalizePath(urlOrPath);

  // 最長一致で検索
  let bestMatch = null;
  let bestLen = 0;

  for (const key of Object.keys(pageContexts)) {
    if (path.startsWith(key) && key.length > bestLen) {
      bestMatch = key;
      bestLen = key.length;
    }
  }

  return bestMatch ? pageContexts[bestMatch] : defaultContext;
}

/**
 * ページコンテキストからプロンプト注入用テキストを生成
 *
 * @param {object} pageData - { url, title, path }
 * @returns {string} プロンプト用テキスト
 */
export function getPageContextMessage(pageData) {
  if (!pageData) return "";

  const ctx = getPageContext(pageData.url || pageData.path || "/");

  const parts = [t("nav_current_page", "[Current page] {label}").replace("{label}", ctx.label)];
  if (pageData.title) parts.push(t("nav_page_title", "Page title: {title}").replace("{title}", pageData.title));
  if (pageData.url) parts.push(`URL: ${pageData.url}`);
  if (ctx.prompt) parts.push(ctx.prompt);

  return parts.join("\n");
}

/**
 * 現在ページのクイックアクションを取得
 *
 * ページ別 page_contexts に quick_actions が設定されていればそれを返す。
 * 未設定（default コンテキスト含む）の場合は空配列を返し、
 * EJS で描画済みの ui_settings.quick_actions_ui をそのまま維持する。
 *
 * @param {string} urlOrPath - URL またはパス
 * @returns {Array<{text: string, action: string, icon?: string}>}
 */
export function getQuickActions(urlOrPath) {
  const path = normalizePath(urlOrPath);

  // ページ別コンテキストにマッチした場合のみ、そのページの quick_actions を返す
  let bestMatch = null;
  let bestLen = 0;
  for (const key of Object.keys(pageContexts)) {
    if (path.startsWith(key) && key.length > bestLen) {
      bestMatch = key;
      bestLen = key.length;
    }
  }

  if (bestMatch) {
    const ctx = pageContexts[bestMatch];
    return ctx.quickActions || ctx.quick_actions || [];
  }

  // デフォルトコンテキスト: 空配列（EJS初期表示を維持）
  return [];
}

/**
 * 現在ページのCTAアクションを取得
 *
 * @param {string} urlOrPath - URL またはパス
 * @returns {Array<{text: string, url: string, icon?: string}>}
 */
export function getCtaActions(urlOrPath) {
  const ctx = getPageContext(urlOrPath);
  return ctx.ctaActions || ctx.cta_actions || [];
}

/**
 * 現在ページのウェルカムメッセージを取得
 *
 * @param {string} urlOrPath - URL またはパス
 * @returns {{ message: string, icon: string }}
 */
export function getWelcomeOverride(urlOrPath) {
  const ctx = getPageContext(urlOrPath);
  return {
    message: ctx.welcomeMessage || ctx.welcome_message || "",
    icon: ctx.welcomeIcon || ctx.welcome_icon || "",
  };
}

/**
 * postMessage 受信時のページナビゲーション処理
 *
 * @param {object} data - { url, title, path }
 * @param {object} callbacks - { onContextUpdate, onQuickActionsUpdate, onWelcomeUpdate }
 */
export function handlePageNavigation(data, callbacks = {}) {
  const ctx = getPageContext(data.url || data.path || "/");
  const quickActions = getQuickActions(data.url || data.path || "/");
  const contextMessage = getPageContextMessage(data);

  if (callbacks.onContextUpdate) {
    callbacks.onContextUpdate({
      pageContext: data,
      contextMessage,
      label: ctx.label,
    });
  }

  if (callbacks.onQuickActionsUpdate) {
    callbacks.onQuickActionsUpdate(quickActions);
  }

  if (callbacks.onWelcomeUpdate) {
    const welcome = getWelcomeOverride(data.url || data.path || "/");
    if (welcome.message) {
      callbacks.onWelcomeUpdate(welcome);
    }
  }
}
