<?php
/**
 * NeccoSpeak — Agent UI: 会話フロー タブ（本番 ai-agent-embed v1.5.1.1 の
 * 「会話フロー」タブと同じ見た目・同じ画面構成で描画する）。
 *
 * 本番の会話フロータブは以下の3セクションで構成される（includes/admin-agent-settings.php
 * ai_agent_embed_render_tab_flow()）:
 *   1. ウィジェット動作設定（初期メッセージ・クイックアクション）
 *   2. CTA設定（コールトゥアクション）
 *   3. ナビゲーション設定
 *
 * NeccoSpeak 側のバインド:
 *   - 初期メッセージ        → welcome_message（旧タブ 'appearance' の保存ホワイトリスト）
 *   - クイックアクション    → cta_list のうち type==='message' の行を、本番の行
 *                              エディタ様式（アイコン入力＋ラベル＋送信メッセージ＋
 *                              削除ボタン）で編集する。cta_list は旧タブ 'actions'
 *                              の保存ホワイトリストが所有するため、このエディタは
 *                              'actions' タブの独立した <form> になる（初期メッセージの
 *                              'appearance' フォームとは別）。
 *   - CTA設定               → cta_list のうち type!=='message' の行を、本番の CTA
 *                              カード様式（バッジ＋項目リスト＋編集/削除）で一覧し、
 *                              編集は「+ CTA追加」/「編集」で開くモーダルで行う
 *                              （0.3.0-dev.38 フェーズ2）。includes/admin-cta.php の
 *                              内部ヘルパー（種別／表示条件の選択肢一覧関数のみ）は
 *                              再利用するが、テーブル描画そのもの
 *                              （neccospeak_render_tab_actions()）は本番と見た目が
 *                              異なるため、ここでは呼ばない。
 *   - ナビゲーション設定    → page_context_enabled / nav_list_enabled /
 *                              nav_list_post_types / nav_list_max / link_verify_enabled
 *                              （旧タブ 'content' の保存ホワイトリスト）
 *
 * 保存は includes/agent-ui.php の neccospeak_agent_ui_form_open()/_form_close()
 * （<form action="options.php"> + settings_fields( 'neccospeak_settings_group' ) +
 * hidden `_tab` = 旧タブスラッグ）をそのまま使う。ここでは
 * name="{NECCOSPEAK_OPTION}[key]" の入力を描画するだけで、独自の update_option は
 * 一切行わない。
 *
 * cta_list は単一の option 配列だが、このタブ上では「クイックアクション」
 * （type==='message'）と「CTA」（それ以外）の2つの独立した <form> に分けて
 * 編集する（本番の画面構成に合わせるため）。settings.php の
 * neccospeak_sanitize_cta_list() は送信された cta_list 配列をまるごと
 * 置き換えるため、どちらの <form> を送信しても cta_list 全体が正しく
 * 往復するよう、各 <form> は自分が編集しない側の行を hidden input として
 * そのまま含めて送信する（neccospeak_agent_ui_flow_hidden_cta_row()）。
 * 同じ理由で cta_enabled / cta_home_enabled / cta_chat_enabled / cta_heading /
 * cf7_prefill_enabled も CTA設定フォームが所有し、クイックアクションフォーム
 * 側は hidden で現在値をそのまま引き継ぐ。
 *
 * 新規行の name インデックスが2つの <form> 間で衝突しないよう、クイック
 * アクション側で新規追加した行だけ "qa" 接頭辞付きインデックス
 * （例: cta_list[qa0]）を使う。既存行は元のインデックスをそのまま使う。
 *
 * クイックアクション側の行の追加・削除は assets/admin.js の既存の汎用
 * リピーター実装（data-neccospeak-repeat="qa" / initRepeaters()）をそのまま
 * 流用する。
 *
 * CTA 側は 0.3.0-dev.38（フェーズ2）でカード一覧＋モーダルに刷新したため、
 * 汎用リピーターではなく assets/agent-ui/js/agent-ui.js の initCtaCards() が
 * 同じ規約（__i__ プレースホルダ／単調増加インデックス／雛形行は disabled）で
 * 行の複製・採番・上限判定を引き受ける。カードが持つ入力は 11 キーすべてが
 * hidden で、モーダルはそれを読み書きするだけのクライアントサイド UI
 * （保存経路は従来どおり <form action="options.php"> の POST のまま）。
 *
 * @package NeccoSpeak
 */

defined( 'ABSPATH' ) || exit;

/**
 * cta_list 行の 0.3.0-dev.37 新カラム（subtitle/slot/order/enabled）を hidden
 * input として出力する。フェーズ1ではこの4カラムに専用 UI を与えない（本格 UI
 * はフェーズ2）ため、どのフォームから保存しても現在値がそのまま往復するよう、
 * この3系統の行レンダラ（hidden パススルー／クイックアクション行／CTAカード行）
 * すべてが必ずこれを呼ぶ。
 *
 * 既定値は includes/settings.php の neccospeak_sanitize_cta_list() 側の既定と
 * 一致させてある。特に order は「キーが存在しない・空文字」のとき出力位置に
 * フォールバックする仕様なので、新規行（雛形行）では空文字を送って採番を
 * サニタイザに委ねる。enabled は新規行では '1'（有効）。
 *
 * @param string $base 'neccospeak_options[cta_list][0]' 相当の esc_attr 済み接頭辞。
 * @param array  $row  行データ。雛形行は空配列。
 * @return void
 */
function neccospeak_agent_ui_flow_hidden_new_columns( $base, $row ) {
	$subtitle = ( isset( $row['subtitle'] ) && is_scalar( $row['subtitle'] ) ) ? (string) $row['subtitle'] : '';
	$slot     = ( isset( $row['slot'] ) && 'main' === (string) $row['slot'] ) ? 'main' : 'sub';
	$order    = ( isset( $row['order'] ) && is_scalar( $row['order'] ) ) ? (string) (int) $row['order'] : '';
	$enabled  = array_key_exists( 'enabled', $row ) ? ( empty( $row['enabled'] ) ? '0' : '1' ) : '1';
	?>
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[subtitle]" value="<?php echo esc_attr( $subtitle ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[slot]" value="<?php echo esc_attr( $slot ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[order]" value="<?php echo esc_attr( $order ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[enabled]" value="<?php echo esc_attr( $enabled ); ?>" />
	<?php
}

/**
 * cta_list の1行をまるごと hidden input として出力する（他方のフォームが
 * 編集しない行を、送信のたびに素通りさせるためのパススルー）。
 *
 * @param string $index_str cta_list 配列のキー（数値文字列 or 'qa0' 等）。
 * @param array  $row       行データ（label/icon/type/value/subtitle/slot/order/enabled/cond/delay/replies/map）。
 * @return void
 */
function neccospeak_agent_ui_flow_hidden_cta_row( $index_str, $row ) {
	$label   = isset( $row['label'] ) ? (string) $row['label'] : '';
	$icon    = isset( $row['icon'] ) ? (string) $row['icon'] : 'none';
	$type    = isset( $row['type'] ) ? (string) $row['type'] : 'link';
	$value   = isset( $row['value'] ) ? (string) $row['value'] : '';
	$cond    = isset( $row['cond'] ) ? (string) $row['cond'] : 'always';
	$delay   = isset( $row['delay'] ) ? (string) $row['delay'] : '10';
	$replies = isset( $row['replies'] ) ? (string) $row['replies'] : '2';
	$map     = ( isset( $row['map'] ) && is_array( $row['map'] ) ) ? $row['map'] : array();
	$base    = esc_attr( NECCOSPEAK_OPTION ) . '[cta_list][' . esc_attr( $index_str ) . ']';
	?>
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[label]" value="<?php echo esc_attr( $label ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[icon]" value="<?php echo esc_attr( $icon ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[type]" value="<?php echo esc_attr( $type ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[value]" value="<?php echo esc_attr( $value ); ?>" />
	<?php neccospeak_agent_ui_flow_hidden_new_columns( $base, $row ); ?>
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[cond]" value="<?php echo esc_attr( $cond ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[delay]" value="<?php echo esc_attr( $delay ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[replies]" value="<?php echo esc_attr( $replies ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][name]" value="<?php echo esc_attr( isset( $map['name'] ) ? (string) $map['name'] : '' ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][email]" value="<?php echo esc_attr( isset( $map['email'] ) ? (string) $map['email'] : '' ); ?>" />
	<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][message]" value="<?php echo esc_attr( isset( $map['message'] ) ? (string) $map['message'] : '' ); ?>" />
	<?php
}

/**
 * クイックアクション行（cta_list[type==='message']）を本番の行エディタ様式
 * （アイコン入力＋ラベル＋送信メッセージ＋削除ボタン）で1行描画する。
 * label/icon/value のみ編集可能。cond/delay/replies/map と 0.3.0-dev.37 の
 * 新カラム（subtitle/slot/order/enabled）は非表示のまま現在値を hidden で
 * 引き継ぐ（CTA設定側で別途設定された値を壊さない）。
 *
 * @param string $index_str '0','1',… （実データ）または 'qa__i__'（新規行の雛形）。
 * @param array  $row       行データ。雛形行は空配列。
 * @param bool   $disabled  雛形行なら true（リピーターが複製するまで送信させない）。
 * @return void
 */
function neccospeak_agent_ui_flow_qa_row( $index_str, $row, $disabled ) {
	$label   = isset( $row['label'] ) ? (string) $row['label'] : '';
	$icon    = isset( $row['icon'] ) ? (string) $row['icon'] : '';
	$value   = isset( $row['value'] ) ? (string) $row['value'] : '';
	$cond    = isset( $row['cond'] ) ? (string) $row['cond'] : 'always';
	$delay   = isset( $row['delay'] ) ? (string) $row['delay'] : '10';
	$replies = isset( $row['replies'] ) ? (string) $row['replies'] : '2';
	$map     = ( isset( $row['map'] ) && is_array( $row['map'] ) ) ? $row['map'] : array();
	$base    = esc_attr( NECCOSPEAK_OPTION ) . '[cta_list][' . esc_attr( $index_str ) . ']';
	$dis     = $disabled ? ' disabled' : '';
	?>
	<div class="neccospeak-repeat-row" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;border:1px solid #dcdcde;border-radius:6px;padding:8px 10px;margin-bottom:8px;background:#f6f7f7;">
		<?php
		// 0.3.0-dev.38 (フェーズ2 §1/§3): 生のテキスト入力を共通アイコン
		// ピッカー（グリフボタン＋hidden input）に差し替える。旧
		// placeholder の「e.g. briefcase-fill」が伝えていた情報は、この
		// リピーター直下の <p class="description">（Bootstrap Icons 名を
		// 入れる旨）がそのまま担っている。キーボードだけで操作する場合の
		// 代替入力手段はピッカー内の検索欄（自由入力＋Enter 確定）。
		neccospeak_agent_ui_icon_field(
			array(
				'name'     => $base . '[icon]',
				'value'    => $icon,
				'disabled' => $disabled,
				'class'    => 'neccospeak-icon-field--qa',
			)
		);
		?>
		<input type="text" class="regular-text"<?php echo esc_attr( $dis ); ?>
			style="width:180px;"
			name="<?php echo esc_attr( $base ); ?>[label]"
			placeholder="<?php echo esc_attr__( 'Button text (e.g. Our services)', 'neccospeak' ); ?>"
			value="<?php echo esc_attr( $label ); ?>" />
		<input type="text" class="regular-text"<?php echo esc_attr( $dis ); ?>
			style="flex:1;min-width:220px;"
			name="<?php echo esc_attr( $base ); ?>[value]"
			placeholder="<?php echo esc_attr__( 'Message to send (e.g. Tell me about your services)', 'neccospeak' ); ?>"
			value="<?php echo esc_attr( $value ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[type]" value="message" />
		<?php neccospeak_agent_ui_flow_hidden_new_columns( $base, $row ); ?>
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[cond]" value="<?php echo esc_attr( $cond ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[delay]" value="<?php echo esc_attr( $delay ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[replies]" value="<?php echo esc_attr( $replies ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][name]" value="<?php echo esc_attr( isset( $map['name'] ) ? (string) $map['name'] : '' ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][email]" value="<?php echo esc_attr( isset( $map['email'] ) ? (string) $map['email'] : '' ); ?>" />
		<input type="hidden" name="<?php echo esc_attr( $base ); ?>[map][message]" value="<?php echo esc_attr( isset( $map['message'] ) ? (string) $map['message'] : '' ); ?>" />
		<button type="button" class="button button-link-delete neccospeak-repeat-remove" style="flex-shrink:0;"><?php echo esc_html__( 'Remove', 'neccospeak' ); ?></button>
	</div>
	<?php
}

/**
 * CTA行（cta_list[type!=='message']）の表示条件バッジ（本番の「メイン
 * （常に表示）」等に相当。NS の実データである cond/delay/replies を元に
 * 生成する）。
 *
 * @param array $row 行データ。
 * @return array{0:string,1:string} array( バッジ文言, ai-agent-badge--* 修飾子 )。
 */
function neccospeak_agent_ui_flow_cta_badge( $row ) {
	$cond = isset( $row['cond'] ) ? (string) $row['cond'] : 'always';
	if ( 'delay' === $cond ) {
		$delay = isset( $row['delay'] ) ? (int) $row['delay'] : 10;
		/* translators: %d: seconds before the CTA appears. */
		return array( sprintf( __( 'Shown after %d seconds', 'neccospeak' ), $delay ), 'draft' );
	}
	if ( 'replies' === $cond ) {
		$replies = isset( $row['replies'] ) ? (int) $row['replies'] : 2;
		/* translators: %d: number of replies before the CTA appears. */
		return array( sprintf( __( 'Shown after reply %d', 'neccospeak' ), $replies ), 'draft' );
	}
	return array( __( 'Always shown', 'neccospeak' ), 'published' );
}

/**
 * CTA の「表示タイミング」(`slot`) の短いバッジ文言。
 *
 * @return array<string,string>
 */
function neccospeak_agent_ui_flow_cta_slot_labels() {
	return array(
		'main' => __( 'Main', 'neccospeak' ),
		'sub'  => __( 'Sub', 'neccospeak' ),
	);
}

/**
 * CTA の「表示タイミング」(`slot`) の <select> 用の説明つき文言（本番
 * ai-agent-embed の CTA モーダル「表示タイミング」セレクトの
 * 「メイン — 常に表示されるボタン」/「サブ — 補助的に表示されるボタン」
 * に対応）。
 *
 * 本番は primary / secondary / end_of_conversation の3値だが、NS の
 * `slot` は neccospeak_sanitize_cta_list() が main / sub の2値しか
 * 受け付けない（dev.37 §2）。存在しない3つ目を UI にだけ生やすと
 * サニタイザが黙って 'sub' に落として保存事故になるため、意図的に
 * 2値に留める。
 *
 * @return array<string,string>
 */
function neccospeak_agent_ui_flow_cta_slot_options() {
	return array(
		'main' => __( 'Main — always shown', 'neccospeak' ),
		'sub'  => __( 'Sub — shown as a secondary button', 'neccospeak' ),
	);
}

/**
 * 0.3.0-dev.38（会話フロー本番パリティ フェーズ2 §2）— CTA 1件を「カード
 * ＋全項目 hidden input」として描画する。
 *
 * dev.37（フェーズ1）まではカード内に <select>/<input> を直接並べる
 * インライン編集式で、`subtitle`/`slot`/`order`/`enabled` の4カラムには UI が
 * 無く hidden で素通しするだけだった。dev.38 では本番と同じく
 *   ・一覧はサマリだけを見せるカード（バッジ＋ラベル＋項目リスト＋編集/削除）
 *   ・編集は「+ CTA追加」/「編集」で開くモーダル
 * に置き換える。したがってカードが持つ入力は 11 キー全部（＋ CF7 の map 3件）
 * が **すべて hidden** になり、モーダルはその hidden を書き換えるだけの
 * クライアントサイド UI になる。
 *
 * この設計の要点（本番との意図的な差分）:
 *   - 本番のモーダルは「保存」ボタンで AJAX（wp_ajax_ai_agent_*）を叩いて
 *     即時 DB 反映するが、NS は既存の <form action="options.php"> POST 経路を
 *     一切変えない。モーダルの「保存」は hidden を書き換えてカードを再描画
 *     するだけで、実際の永続化はタブの「保存」ボタン（= 従来どおり
 *     neccospeak_sanitize_options() 経由）が行う。
 *   - よって JS が無い/落ちた環境でも、既存行の hidden はそのまま POST され
 *     るので保存が壊れない（追加・編集ができなくなるだけ）。
 *
 * @param string $index_str    '0','1',… または '__i__'（新規行の雛形）。
 * @param array  $row          行データ。雛形行は空配列。
 * @param bool   $disabled     雛形行なら true（リピーターが複製するまで送信させない）。
 * @param array  $type_options 動作(type)の選択肢一覧（サマリの文言引きに使う）。
 * @return void
 */
function neccospeak_agent_ui_flow_cta_card( $index_str, $row, $disabled, $type_options ) {
	$label    = isset( $row['label'] ) ? (string) $row['label'] : '';
	$icon     = isset( $row['icon'] ) ? (string) $row['icon'] : 'none';
	$type     = isset( $row['type'] ) ? (string) $row['type'] : 'link';
	$value    = isset( $row['value'] ) ? (string) $row['value'] : '';
	$subtitle = ( isset( $row['subtitle'] ) && is_scalar( $row['subtitle'] ) ) ? (string) $row['subtitle'] : '';
	$slot     = ( isset( $row['slot'] ) && 'main' === (string) $row['slot'] ) ? 'main' : 'sub';
	$order    = ( isset( $row['order'] ) && is_scalar( $row['order'] ) ) ? (string) (int) $row['order'] : '';
	$enabled  = array_key_exists( 'enabled', $row ) ? ! empty( $row['enabled'] ) : true;
	$cond     = isset( $row['cond'] ) ? (string) $row['cond'] : 'always';
	$delay    = isset( $row['delay'] ) ? (int) $row['delay'] : 10;
	$replies  = isset( $row['replies'] ) ? (int) $row['replies'] : 2;
	$map      = ( isset( $row['map'] ) && is_array( $row['map'] ) ) ? $row['map'] : array();

	$base = NECCOSPEAK_OPTION . '[cta_list][' . $index_str . ']';
	$dis  = $disabled ? ' disabled' : '';
	$dash = '—';

	$slot_labels = neccospeak_agent_ui_flow_cta_slot_labels();
	$slot_text   = isset( $slot_labels[ $slot ] ) ? $slot_labels[ $slot ] : $slot;
	$type_text   = isset( $type_options[ $type ] ) ? $type_options[ $type ] : $type;

	list( $cond_text ) = neccospeak_agent_ui_flow_cta_badge( $row );

	// 'none'（NS enum の「アイコン無し」）と未マップの値は空グリフに落とす。
	$glyph = '';
	if ( '' !== $icon && 'none' !== $icon && function_exists( 'neccospeak_frame_chip_icon_bi' ) ) {
		$glyph = neccospeak_frame_chip_icon_bi( $icon );
	}

	$hidden_fields = array(
		'label'    => $label,
		'icon'     => $icon,
		'type'     => $type,
		'value'    => $value,
		'subtitle' => $subtitle,
		'slot'     => $slot,
		'order'    => $order,
		'enabled'  => $enabled ? '1' : '0',
		'cond'     => $cond,
		'delay'    => (string) $delay,
		'replies'  => (string) $replies,
	);
	?>
	<div class="ai-agent-cta-card neccospeak-cta-card<?php echo $enabled ? '' : ' neccospeak-cta-card--off'; ?>"
		data-neccospeak-cta-row data-neccospeak-cta-index="<?php echo esc_attr( $index_str ); ?>">
		<div class="ai-agent-cta-card__header">
			<h4>
				<span class="ai-agent-badge ai-agent-badge--<?php echo ( 'main' === $slot ) ? 'published' : 'draft'; ?>"
					data-neccospeak-cta-slot-badge><?php echo esc_html( $slot_text ); ?></span>
				<span class="neccospeak-cta-card__glyph" data-neccospeak-cta-glyph>
					<?php if ( '' !== $glyph ) : ?>
						<i class="bi bi-<?php echo esc_attr( $glyph ); ?>" aria-hidden="true"></i>
					<?php endif; ?>
				</span>
				<span data-neccospeak-cta-summary="label"><?php echo esc_html( $label ); ?></span>
				<span class="neccospeak-cta-card__off" data-neccospeak-cta-off-note<?php echo $enabled ? ' hidden' : ''; ?>><?php echo esc_html__( '(Disabled)', 'neccospeak' ); ?></span>
			</h4>
			<div class="ai-agent-cta-card__actions">
				<button type="button" class="button button-small" data-neccospeak-cta-edit><?php echo esc_html__( 'Edit', 'neccospeak' ); ?></button>
				<button type="button" class="button button-small button-link-delete" data-neccospeak-cta-remove><?php echo esc_html__( 'Remove', 'neccospeak' ); ?></button>
			</div>
		</div>
		<dl class="ai-agent-data-grid">
			<dt><?php echo esc_html__( 'Action', 'neccospeak' ); ?></dt>
			<dd data-neccospeak-cta-summary="type"><?php echo esc_html( $type_text ); ?></dd>
			<dt><?php echo esc_html__( 'Value / link URL', 'neccospeak' ); ?></dt>
			<dd data-neccospeak-cta-summary="value"><?php echo esc_html( '' !== $value ? $value : $dash ); ?></dd>
			<dt><?php echo esc_html__( 'Subtitle', 'neccospeak' ); ?></dt>
			<dd data-neccospeak-cta-summary="subtitle"><?php echo esc_html( '' !== $subtitle ? $subtitle : $dash ); ?></dd>
			<dt><?php echo esc_html__( 'Display order', 'neccospeak' ); ?></dt>
			<dd data-neccospeak-cta-summary="order"><?php echo esc_html( '' !== $order ? $order : $dash ); ?></dd>
			<dt><?php echo esc_html__( 'Display condition', 'neccospeak' ); ?></dt>
			<dd data-neccospeak-cta-summary="cond"><?php echo esc_html( $cond_text ); ?></dd>
		</dl>
		<?php
		// 11 キー全部を hidden で持つ（モーダルはこの hidden を書き換える）。
		// disabled は雛形行のみ — リピーター（agent-ui.js の CTA 実装）が
		// 複製時に外す。
		foreach ( $hidden_fields as $field_key => $field_value ) :
			?>
			<input type="hidden" data-neccospeak-cta-field="<?php echo esc_attr( $field_key ); ?>"
				name="<?php echo esc_attr( $base . '[' . $field_key . ']' ); ?>"
				value="<?php echo esc_attr( $field_value ); ?>"<?php echo esc_attr( $dis ); ?> />
			<?php
		endforeach;
		foreach ( array( 'name', 'email', 'message' ) as $map_key ) :
			?>
			<input type="hidden" data-neccospeak-cta-field="map.<?php echo esc_attr( $map_key ); ?>"
				name="<?php echo esc_attr( $base . '[map][' . $map_key . ']' ); ?>"
				value="<?php echo esc_attr( isset( $map[ $map_key ] ) ? (string) $map[ $map_key ] : '' ); ?>"<?php echo esc_attr( $dis ); ?> />
			<?php
		endforeach;
		?>
	</div>
	<?php
}

/**
 * 0.3.0-dev.38（フェーズ2 §2）— CTA 追加/編集モーダル。ページに1つだけ
 * 描画され、「+ CTA追加」/カードの「編集」から開かれて、対象カードの
 * hidden input 群を読み書きする。
 *
 * 重要: このモーダル内の入力には **name 属性を一切付けない**。付けると
 * options.php へ一緒に POST されてしまい、cta_list の実体（カードの hidden）
 * と二重送信になるため。値の受け渡しは JS が hidden へ書き戻すことで行う。
 *
 * 同じ理由でモーダルは <form> の **外側** に描画する（フォーム内に置くと
 * テキスト入力での Enter がタブ全体の保存送信を誘発する）。
 *
 * @param array $type_options 動作(type)の選択肢一覧。
 * @param bool  $cf7_active   Contact Form 7 が現在有効かどうか。
 * @return void
 */
function neccospeak_agent_ui_flow_cta_modal( $type_options, $cf7_active ) {
	?>
	<div id="neccospeak-cta-modal" class="ai-agent-modal" style="display:none;" role="dialog" aria-modal="true"
		aria-labelledby="neccospeak-cta-modal-title" data-neccospeak-cta-modal>
		<div class="ai-agent-modal__overlay" data-neccospeak-cta-cancel></div>
		<div class="ai-agent-modal__content">
			<h3 id="neccospeak-cta-modal-title" data-neccospeak-cta-modal-title><?php echo esc_html__( 'Add CTA', 'neccospeak' ); ?></h3>
			<table class="form-table ai-agent-form-table" role="presentation">
				<tbody>
					<tr>
						<th scope="row"><label for="neccospeak-cta-f-slot"><?php echo esc_html__( 'Display timing', 'neccospeak' ); ?></label></th>
						<td>
							<select id="neccospeak-cta-f-slot" data-neccospeak-cta-input="slot">
								<?php foreach ( neccospeak_agent_ui_flow_cta_slot_options() as $slot_val => $slot_label ) : ?>
									<option value="<?php echo esc_attr( $slot_val ); ?>"><?php echo esc_html( $slot_label ); ?></option>
								<?php endforeach; ?>
							</select>
							<p class="description"><?php echo esc_html__( 'Choose when this CTA button is shown.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row">
							<label for="neccospeak-cta-f-label"><?php echo esc_html__( 'Button label', 'neccospeak' ); ?></label>
							<span aria-hidden="true" style="color:#b32d2e;">*</span>
						</th>
						<td>
							<input type="text" id="neccospeak-cta-f-label" class="regular-text" data-neccospeak-cta-input="label"
								placeholder="<?php echo esc_attr__( 'e.g. Request a brochure', 'neccospeak' ); ?>" required />
							<p class="description"><?php echo esc_html__( 'The text visitors see on the button.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Icon', 'neccospeak' ); ?></th>
						<td>
							<?php
							neccospeak_agent_ui_icon_field(
								array(
									'id'    => 'neccospeak-cta-f-icon',
									'value' => '',
								)
							);
							?>
							<p class="description">
								<?php
								printf(
									/* translators: %1$s: opening <a> tag to the Bootstrap Icons site, %2$s: closing </a> tag. */
									esc_html__( 'Shown on the button. Pick from the bundled %1$sBootstrap Icons%2$s set (e.g. file-text, envelope, telephone).', 'neccospeak' ),
									'<a href="https://icons.getbootstrap.com/" target="_blank" rel="noopener noreferrer">',
									'</a>'
								);
								?>
							</p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="neccospeak-cta-f-type"><?php echo esc_html__( 'What the button does', 'neccospeak' ); ?></label></th>
						<td>
							<select id="neccospeak-cta-f-type" data-neccospeak-cta-input="type">
								<?php foreach ( $type_options as $type_val => $type_label ) : ?>
									<option value="<?php echo esc_attr( $type_val ); ?>"><?php echo esc_html( $type_label ); ?></option>
								<?php endforeach; ?>
							</select>
							<?php if ( ! $cf7_active && isset( $type_options['cf7_prefill'] ) ) : ?>
								<p class="description"><?php echo esc_html__( 'Contact Form 7 is inactive, so this action is hidden.', 'neccospeak' ); ?></p>
							<?php endif; ?>
						</td>
					</tr>
					<tr data-neccospeak-cta-value-row>
						<th scope="row"><label for="neccospeak-cta-f-value"><?php echo esc_html__( 'Value / link URL', 'neccospeak' ); ?></label></th>
						<td>
							<input type="text" id="neccospeak-cta-f-value" class="regular-text" data-neccospeak-cta-input="value"
								placeholder="<?php echo esc_attr__( 'https://example.com/contact/', 'neccospeak' ); ?>" />
							<p class="description"><?php echo esc_html__( 'The URL to open, phone number, email address, or message to send — whichever the action above needs. A voice action needs no value.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr data-neccospeak-cta-cf7-row hidden>
						<th scope="row"><?php echo esc_html__( 'Contact Form 7 fields', 'neccospeak' ); ?></th>
						<td>
							<p style="margin:4px 0;">
								<label>
									<?php echo esc_html__( 'Name field', 'neccospeak' ); ?>
									<input type="text" class="regular-text" data-neccospeak-cta-input="map.name" placeholder="your-name" />
								</label>
							</p>
							<p style="margin:4px 0;">
								<label>
									<?php echo esc_html__( 'Email field', 'neccospeak' ); ?>
									<input type="text" class="regular-text" data-neccospeak-cta-input="map.email" placeholder="your-email" />
								</label>
							</p>
							<p style="margin:4px 0;">
								<label>
									<?php echo esc_html__( 'Message field', 'neccospeak' ); ?>
									<input type="text" class="regular-text" data-neccospeak-cta-input="map.message" placeholder="your-message" />
								</label>
							</p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="neccospeak-cta-f-subtitle"><?php echo esc_html__( 'Button subtitle', 'neccospeak' ); ?></label></th>
						<td>
							<input type="text" id="neccospeak-cta-f-subtitle" class="regular-text" data-neccospeak-cta-input="subtitle"
								placeholder="<?php echo esc_attr__( 'e.g. We reply on the next business day', 'neccospeak' ); ?>" />
							<p class="description"><?php echo esc_html__( 'Small explanatory text shown under the button (optional).', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="neccospeak-cta-f-order"><?php echo esc_html__( 'Display order', 'neccospeak' ); ?></label></th>
						<td>
							<input type="number" id="neccospeak-cta-f-order" class="small-text" min="0" max="99" data-neccospeak-cta-input="order" />
							<p class="description"><?php echo esc_html__( 'Lower numbers are shown first. Ties keep the order they were added in.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Enabled', 'neccospeak' ); ?></th>
						<td>
							<label>
								<input type="checkbox" id="neccospeak-cta-f-enabled" data-neccospeak-cta-input="enabled" />
								<?php echo esc_html__( 'Enable this CTA', 'neccospeak' ); ?>
							</label>
						</td>
					</tr>
				</tbody>
			</table>
			<details class="neccospeak-cta-modal__advanced">
				<summary><?php echo esc_html__( 'Advanced options', 'neccospeak' ); ?></summary>
				<table class="form-table ai-agent-form-table" role="presentation">
					<tbody>
						<tr>
							<th scope="row"><label for="neccospeak-cta-f-cond"><?php echo esc_html__( 'Display condition', 'neccospeak' ); ?></label></th>
							<td>
								<select id="neccospeak-cta-f-cond" data-neccospeak-cta-input="cond">
									<?php foreach ( neccospeak_cta_cond_options() as $cond_val => $cond_label ) : ?>
										<option value="<?php echo esc_attr( $cond_val ); ?>"><?php echo esc_html( $cond_label ); ?></option>
									<?php endforeach; ?>
								</select>
								<label style="margin-left:8px;" data-neccospeak-cta-delay-wrap>
									<span class="screen-reader-text"><?php echo esc_html__( 'Seconds', 'neccospeak' ); ?></span>
									<input type="number" min="1" max="300" class="small-text" id="neccospeak-cta-f-delay"
										data-neccospeak-cta-input="delay" /><?php echo esc_html__( 'seconds', 'neccospeak' ); ?>
								</label>
								<label style="margin-left:8px;" data-neccospeak-cta-replies-wrap>
									<span class="screen-reader-text"><?php echo esc_html__( 'Number of replies', 'neccospeak' ); ?></span>
									<input type="number" min="1" max="20" class="small-text" id="neccospeak-cta-f-replies"
										data-neccospeak-cta-input="replies" /><?php echo esc_html__( 'replies', 'neccospeak' ); ?>
								</label>
								<p class="description"><?php echo esc_html__( 'With "Always" the CTA is shown as soon as the conversation starts.', 'neccospeak' ); ?></p>
							</td>
						</tr>
					</tbody>
				</table>
			</details>
			<p class="neccospeak-cta-modal__error" data-neccospeak-cta-error role="alert" hidden></p>
			<div class="ai-agent-modal__actions">
				<button type="button" class="button button-primary" data-neccospeak-cta-apply><?php echo esc_html__( 'Apply', 'neccospeak' ); ?></button>
				<button type="button" class="button" data-neccospeak-cta-cancel><?php echo esc_html__( 'Cancel', 'neccospeak' ); ?></button>
			</div>
			<p class="description" style="margin:8px 0 0;text-align:right;"><?php echo esc_html__( 'Applying updates the card below; press this tab\'s Save button to store the change.', 'neccospeak' ); ?></p>
		</div>
	</div>
	<?php
}

/**
 * 会話フロー タブ本体。
 *
 * @param array $opts neccospeak_editing_options() 相当（キーが揃っている前提）。
 * @return void
 */
function neccospeak_agent_ui_tab_flow( $opts ) {
	$opts = is_array( $opts ) ? $opts : array();

	// cta_list の実データを、CTA編集機能（admin-cta.php）の可用性を前提に
	// 「クイックアクション」（type==='message'）と「CTA」（それ以外）に
	// 分ける。admin-cta.php 側と同じ防御的フィルタ（label/type/value が
	// 揃っていない行は黙ってスキップ）を踏襲する。
	// dev.38: アイコンは admin-cta.php の 11 値 enum（neccospeak_cta_icon_options()）
	// ではなく共通ピッカー（neccospeak_agent_ui_icon_field()）が供給するように
	// なったため、可用性チェックの対象も差し替える。実際に呼ぶ関数だけを見る。
	$cta_ui_ok = function_exists( 'neccospeak_agent_ui_form_open' ) && function_exists( 'neccospeak_agent_ui_icon_field' )
		&& function_exists( 'neccospeak_cta_type_options' ) && function_exists( 'neccospeak_cta_cond_options' );

	$raw_cta_list = ( isset( $opts['cta_list'] ) && is_array( $opts['cta_list'] ) ) ? $opts['cta_list'] : array();
	$all_rows     = array();
	foreach ( $raw_cta_list as $row ) {
		if ( is_array( $row ) && isset( $row['label'], $row['type'], $row['value'] ) ) {
			$all_rows[] = $row;
		}
	}
	$qa_rows   = array();
	$cta_rows  = array();
	foreach ( $all_rows as $i => $row ) {
		if ( 'message' === $row['type'] ) {
			$qa_rows[ (string) $i ] = $row;
		} else {
			$cta_rows[ (string) $i ] = $row;
		}
	}
	$cta_next_index = count( $all_rows ); // 新規行は既存インデックスの続きから採番する。
	$cf7_active     = function_exists( 'neccospeak_cf7_active' ) && neccospeak_cf7_active();
	$cta_max        = defined( 'NECCOSPEAK_CTA_MAX_ITEMS' ) ? NECCOSPEAK_CTA_MAX_ITEMS : 8;

	// 0.3.0-dev.38（フェーズ2 §2）: CTA モーダルの「ボタンを押した時の動作」
	// (type) の選択肢。並び順は本番の CTA モーダル（リンク → 音声 → …）に
	// 合わせて link / voice を先頭に置く。
	//
	//  - 'voice' を admin-cta.php の共有ヘルパではなくここで足すのは dev.37 §6
	//    と同じ理由（共有ヘルパを変えると旧タブの CTA テーブルにも波及する）。
	//  - CF7 が現在無効でも、既存行に 'cf7_prefill' が残っているならその値を
	//    選択肢に含める。含めないと、その行をモーダルで開いて「適用」した
	//    だけで <select> の先頭値に化け、保存で type が書き換わってしまう
	//    （admin-cta.php の neccospeak_cta_type_options( $force ) と同じ趣旨）。
	$cta_has_cf7_row = false;
	foreach ( $cta_rows as $cta_scan_row ) {
		if ( isset( $cta_scan_row['type'] ) && 'cf7_prefill' === (string) $cta_scan_row['type'] ) {
			$cta_has_cf7_row = true;
			break;
		}
	}
	$cta_type_options = array();
	if ( $cta_ui_ok ) {
		$cta_base_types            = neccospeak_cta_type_options( $cf7_active || $cta_has_cf7_row );
		$cta_type_options['link']  = isset( $cta_base_types['link'] ) ? $cta_base_types['link'] : __( 'Link (URL)', 'neccospeak' );
		$cta_type_options['voice'] = __( 'Start a voice conversation', 'neccospeak' );
		foreach ( $cta_base_types as $cta_type_key => $cta_type_label ) {
			if ( 'link' !== $cta_type_key ) {
				$cta_type_options[ $cta_type_key ] = $cta_type_label;
			}
		}
	}

	?>
	<?php $flow_widget_form_ok = function_exists( 'neccospeak_agent_ui_form_open' ); ?>
	<div class="ai-agent-section" id="ai-agent-design">
		<?php if ( $flow_widget_form_ok ) : ?>
			<?php neccospeak_agent_ui_form_open( 'appearance' ); ?>
		<?php endif; ?>
		<div class="ai-agent-section-header">
			<h2><?php echo esc_html__( 'Conversation start', 'neccospeak' ); ?></h2>
			<?php if ( $flow_widget_form_ok ) : ?>
				<div class="ai-agent-section-actions">
					<button type="submit" class="button button-primary"><?php echo esc_html__( 'Save as draft', 'neccospeak' ); ?></button>
				</div>
			<?php endif; ?>
		</div>
		<p class="description"><?php echo esc_html__( 'Set the welcome message and quick actions visitors see when a conversation starts.', 'neccospeak' ); ?></p>

		<?php if ( $flow_widget_form_ok ) : ?>
			<?php /* 2026-08 ユーザー決定: 旧h3「ウィジェット動作設定」はh2と同一ラベルの
			2連続表示になっており、ウィジェット設定タブの同名セクションとも紛らわしかった。
			h2を「会話の開始」、h3を中身どおり「ウェルカムメッセージ」にリネームした。 */ ?>
			<h3 style="margin-top:8px;"><?php echo esc_html__( 'Welcome message', 'neccospeak' ); ?> <span class="ai-agent-badge ai-agent-badge--draft"><?php echo esc_html__( 'Draft editing', 'neccospeak' ); ?></span></h3>
			<table class="form-table ai-agent-form-table">
				<tr>
					<th scope="row"><?php echo esc_html__( 'Welcome message', 'neccospeak' ); ?></th>
					<td>
						<textarea class="large-text" rows="2"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[welcome_message]"
						><?php echo esc_textarea( isset( $opts['welcome_message'] ) ? (string) $opts['welcome_message'] : '' ); ?></textarea>
						<p class="description"><?php echo esc_html__( 'The message shown first when the widget is opened', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</table>
			</form>
		<?php endif; ?>

		<?php if ( $cta_ui_ok ) : ?>
			<?php // クイックアクション（cta_list[type==='message']）: 'actions' タブ所有のため、初期メッセージとは別の独立した <form>。 ?>
			<?php neccospeak_agent_ui_form_open( 'actions' ); ?>
			<h3 style="margin-top:8px;"><?php echo esc_html__( 'Quick actions', 'neccospeak' ); ?></h3>
			<div data-neccospeak-repeat="qa" data-neccospeak-repeat-max="<?php echo esc_attr( (string) $cta_max ); ?>" data-neccospeak-repeat-next="<?php echo esc_attr( (string) count( $qa_rows ) ); ?>">
				<div data-neccospeak-repeat-rows>
					<?php foreach ( $qa_rows as $i => $row ) : ?>
						<?php neccospeak_agent_ui_flow_qa_row( $i, $row, false ); ?>
					<?php endforeach; ?>
				</div>
				<div data-neccospeak-repeat-proto hidden>
					<?php neccospeak_agent_ui_flow_qa_row( 'qa__i__', array(), true ); ?>
				</div>
			</div>
			<p>
				<button type="button" class="button" data-neccospeak-repeat-add="qa"><?php echo esc_html__( '+ Add', 'neccospeak' ); ?></button>
				<span data-neccospeak-repeat-status="qa" role="status" aria-live="polite"></span>
			</p>
			<p class="description">
				<?php echo esc_html__( 'Shortcut buttons shown when the widget opens (up to 4 recommended).', 'neccospeak' ); ?><br>
				<?php
				printf(
					/* translators: %1$s: opening <a> tag to the Bootstrap Icons site, %2$s: closing </a> tag. */
					esc_html__( 'Click the icon button to pick from the bundled %1$sBootstrap Icons%2$s set — the picker\'s search box also accepts a name typed by hand (e.g. briefcase-fill).', 'neccospeak' ),
					'<a href="https://icons.getbootstrap.com/" target="_blank" rel="noopener noreferrer">',
					'</a>'
				);
				?>
			</p>
			<?php
			// この <form> は cta_list 全体を送信するため、CTA設定側が編集する
			// 非 message 行は素通りさせる（保存経路を壊さない）。
			//
			// 要修正1件目（フィールド二重描画）の調査メモ: cta_enabled /
			// cta_home_enabled / cta_chat_enabled / cta_heading / cf7_prefill_enabled
			// は、この hidden 群と、下の CTA設定フォーム「NeccoSpeak独自の設定（CTA）」の
			// 実編集用 input の、両方に name="neccospeak_options[...]" が出現する。
			// これは includes/settings.php の neccospeak_tab_fields()['actions'] が
			// これら5キーを cta_list ごと所有しており、neccospeak_sanitize_options() が
			// 「_tab=actions で送信された $_POST に存在しないキーは false/既定値に
			// 上書きする」（whitelist tab-merge; bool 型は `! empty($input[$key])`）
			// ため、このクイックアクション <form> 単独で保存されたときにこれらの値を
			// 素通りさせる hidden が無いと、CTA設定側で設定した値が毎回消えてしまう
			// （実機で php -r 相当のサニタイズ往復テストで確認済み）。すなわちこれは
			// 同名 hidden+checkbox 対と同じ「正当な2回」であり、削除すると保存破壊
			// バグを新たに作り込むため、削除しない。
			foreach ( $cta_rows as $i => $row ) {
				neccospeak_agent_ui_flow_hidden_cta_row( $i, $row );
			}
			foreach ( array( 'cta_enabled', 'cta_home_enabled', 'cta_chat_enabled' ) as $flow_qa_bool_key ) {
				if ( ! empty( $opts[ $flow_qa_bool_key ] ) ) {
					?>
					<input type="hidden" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[<?php echo esc_attr( $flow_qa_bool_key ); ?>]" value="1" />
					<?php
				}
			}
			?>
			<input type="hidden" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cta_heading]" value="<?php echo esc_attr( isset( $opts['cta_heading'] ) ? (string) $opts['cta_heading'] : '' ); ?>" />
			<?php if ( ! empty( $opts['cf7_prefill_enabled'] ) ) : ?>
				<input type="hidden" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cf7_prefill_enabled]" value="1" />
			<?php endif; ?>
			<?php neccospeak_agent_ui_form_close( __( 'Save', 'neccospeak' ) ); ?>
		<?php endif; ?>
	</div>

	<div class="ai-agent-section" id="ai-agent-cta">
		<?php if ( $cta_ui_ok ) : ?>
			<?php // CTA設定（cta_list[type!=='message']）: クイックアクションと同じ 'actions' タブだが、独立した <form>。 ?>
			<?php neccospeak_agent_ui_form_open( 'actions' ); ?>
			<div class="ai-agent-section-header">
				<h2><?php echo esc_html__( 'CTA settings (call to action)', 'neccospeak' ); ?></h2>
				<div class="ai-agent-section-actions">
					<button type="button" class="button button-primary" data-neccospeak-cta-add><?php echo esc_html__( '+ Add CTA', 'neccospeak' ); ?></button>
				</div>
			</div>
			<p class="description"><?php echo esc_html__( 'Settings for the contact CTA buttons the agent shows. This edits the published CTAs.', 'neccospeak' ); ?></p>

			<?php
			// 0.3.0-dev.38（フェーズ2 §2）: dev.37 までの「行の中に <select>/<input>
			// を並べたインライン編集テーブル」を、本番と同じ「サマリカードの一覧
			// ＋ 追加/編集モーダル」に置き換える。
			//
			// 汎用リピーター（assets/admin.js の initRepeaters()）はここでは
			// 使わない: 「+ CTA追加」がモーダルを開いてから初めて行を生やす
			// 挙動になり、data-neccospeak-repeat-add の「押した瞬間に空行を
			// append する」契約と噛み合わないため。行の複製・採番・上限判定は
			// assets/agent-ui/js/agent-ui.js の initCtaCards() が同じ規約
			// （__i__ プレースホルダ／単調増加インデックス／雛形行は disabled）で
			// 引き受ける。data-neccospeak-repeat="cta" を外したことで
			// assets/admin.js の initCf7MapRows() もこのタブでは何も掴まなくなるが、
			// CF7 のマップ欄はモーダル側（data-neccospeak-cta-cf7-row）が持つので
			// 機能は失われない。
			?>
			<div data-neccospeak-cta-list
				data-neccospeak-cta-max="<?php echo esc_attr( (string) $cta_max ); ?>"
				data-neccospeak-cta-next="<?php echo esc_attr( (string) $cta_next_index ); ?>">
				<p class="description" data-neccospeak-cta-empty<?php echo empty( $cta_rows ) ? '' : ' hidden'; ?>>
					<?php echo esc_html__( 'No CTAs are configured. Use the "+ Add CTA" button to add one.', 'neccospeak' ); ?>
				</p>
				<div data-neccospeak-cta-rows>
					<?php foreach ( $cta_rows as $i => $row ) : ?>
						<?php neccospeak_agent_ui_flow_cta_card( $i, $row, false, $cta_type_options ); ?>
					<?php endforeach; ?>
				</div>
				<div data-neccospeak-cta-proto hidden>
					<?php neccospeak_agent_ui_flow_cta_card( '__i__', array(), true, $cta_type_options ); ?>
				</div>
			</div>
			<p>
				<span data-neccospeak-cta-status role="status" aria-live="polite"></span>
			</p>
			<?php
			// この <form> は cta_list 全体を送信するため、クイックアクション側が
			// 編集する message 行は素通りさせる（保存経路を壊さない）。
			foreach ( $qa_rows as $i => $row ) {
				neccospeak_agent_ui_flow_hidden_cta_row( $i, $row );
			}
			?>

			<?php
			// 「NeccoSpeak独自の設定」見出しの重複解消（要修正1件目・3.）: この見出しはナビゲーション設定
			// セクション（下、'content' フォーム）にも同文言で存在していた。フィールドの保存先フォームは
			// 変更できない（cta_enabled 等は 'actions' タブ所有）ため、見出し文言をセクションごとに区別する。
			//
			// 2026-08 バグ修正: cta_enabled と cf7_prefill_enabled はマスタートグルのため、他の
			// NS独自項目と一緒に非表示にすると新規インストールでCTA/クイックアクション機能・
			// Contact Form 7連携を有効化する手段が管理画面から完全に失われる（voice_enabledと
			// 同じ不具合）。この6行は互いに強く関連する一つのCTA設定セクションのため、まとめて
			// 可視化する。name/値・保存経路は不変。
			?>
			<h3 style="margin-top:24px;"><?php echo esc_html__( 'CTA display settings', 'neccospeak' ); ?></h3>
			<p class="description"><?php echo esc_html__( 'Enable quick actions and CTAs and choose where they are shown.', 'neccospeak' ); ?></p>
			<table class="form-table ai-agent-form-table" role="presentation">
				<tbody>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Enable', 'neccospeak' ); ?></th>
						<td>
							<label>
								<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cta_enabled]" value="1" <?php checked( ! empty( $opts['cta_enabled'] ) ); ?> />
								<?php echo esc_html__( 'Enable quick actions and CTAs', 'neccospeak' ); ?>
							</label>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Show on the home screen', 'neccospeak' ); ?></th>
						<td>
							<label>
								<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cta_home_enabled]" value="1" <?php checked( ! empty( $opts['cta_home_enabled'] ) ); ?> />
								<?php echo esc_html__( 'Show as chips on the home screen', 'neccospeak' ); ?>
							</label>
							<p class="description"><?php echo esc_html__( 'On the home screen, all actions are shown regardless of their display conditions.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Show in chat', 'neccospeak' ); ?></th>
						<td>
							<label>
								<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cta_chat_enabled]" value="1" <?php checked( ! empty( $opts['cta_chat_enabled'] ) ); ?> />
								<?php echo esc_html__( 'Show as buttons during the conversation', 'neccospeak' ); ?>
							</label>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="neccospeak_cta_heading"><?php echo esc_html__( 'Headline', 'neccospeak' ); ?></label></th>
						<td>
							<input type="text" id="neccospeak_cta_heading" class="regular-text"
								name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cta_heading]"
								value="<?php echo esc_attr( isset( $opts['cta_heading'] ) ? (string) $opts['cta_heading'] : '' ); ?>"
								placeholder="<?php echo esc_attr__( 'Quick actions', 'neccospeak' ); ?>" />
							<p class="description"><?php echo esc_html__( 'Leave blank to use the default heading.', 'neccospeak' ); ?></p>
						</td>
					</tr>
					<tr<?php echo $cf7_active ? '' : ' hidden'; ?>>
						<th scope="row"><?php echo esc_html__( 'Contact Form 7', 'neccospeak' ); ?></th>
						<td>
							<label>
								<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[cf7_prefill_enabled]" value="1" <?php checked( ! empty( $opts['cf7_prefill_enabled'] ) ); ?> />
								<?php echo esc_html__( 'Enable the Contact Form 7 prefill action', 'neccospeak' ); ?>
							</label>
							<p class="description"><?php echo esc_html__( 'Adds a "Contact Form 7 (prefill)" type that auto-fills the name, email, and message from the conversation and guides users to the form page.', 'neccospeak' ); ?></p>
							<?php if ( ! $cf7_active && ! empty( $opts['cf7_prefill_enabled'] ) ) : ?>
								<p class="description"><?php echo esc_html__( 'Contact Form 7 is inactive, so this action is hidden.', 'neccospeak' ); ?></p>
							<?php endif; ?>
						</td>
					</tr>
					<tr>
						<th scope="row"><?php echo esc_html__( 'Maximum entries', 'neccospeak' ); ?></th>
						<td>
							<p class="description">
								<?php
								/* translators: %d: maximum number of quick actions + CTAs combined. */
								echo esc_html( sprintf( __( 'You can register up to %d quick actions and CTAs combined.', 'neccospeak' ), $cta_max ) );
								?>
							</p>
						</td>
					</tr>
				</tbody>
			</table>

			<?php neccospeak_agent_ui_form_close( __( 'Save', 'neccospeak' ) ); ?>

			<?php
			// モーダルは <form> の外側 — 中に置くとテキスト入力での Enter が
			// タブ全体の保存送信を誘発する。中の入力に name 属性が無いのも
			// 同じ理由の裏返し（POST されてはいけない編集専用 UI）。
			neccospeak_agent_ui_flow_cta_modal( $cta_type_options, $cf7_active );
			?>
		<?php else : ?>
			<div class="ai-agent-section-header">
				<h2><?php echo esc_html__( 'CTA settings (call to action)', 'neccospeak' ); ?></h2>
			</div>
			<p class="description"><?php echo esc_html__( 'Could not load the CTA editor.', 'neccospeak' ); ?></p>
		<?php endif; ?>
	</div>

	<?php $flow_nav_form_ok = function_exists( 'neccospeak_agent_ui_form_open' ); ?>
	<div class="ai-agent-section" id="ai-agent-basics">
		<?php if ( $flow_nav_form_ok ) : ?>
			<?php neccospeak_agent_ui_form_open( 'content' ); ?>
		<?php endif; ?>
		<div class="ai-agent-section-header">
			<h2><?php echo esc_html__( 'Navigation settings', 'neccospeak' ); ?></h2>
			<?php if ( $flow_nav_form_ok ) : ?>
				<div class="ai-agent-section-actions">
					<button type="submit" class="button button-primary"><?php echo esc_html__( 'Save', 'neccospeak' ); ?></button>
				</div>
			<?php endif; ?>
		</div>
		<?php
		// 0.3.0-dev.37 (会話フロー本番パリティ フェーズ1 §5): ここには本番
		// ai-agent-embed の保存モード説明文（「役割・ゴール・FAQ・会社情報は即時反映。
		// チャンネル設定 (URLマップ) はドラフト保存され、概要タブの『ドラフトを公開』で
		// 本番反映されます」）がそのまま移植されていた。NS の実挙動とは3点食い違う:
		//   1. NS には項目ごとの「即時反映 / ドラフト保存」の区別が無い。ドラフト
		//      ワークフロー（draft_workflow_enabled）が入か切かで、全設定が一括で
		//      どちらかに振る舞う。
		//   2. NS に「チャンネル設定」「URLマップ」という手入力の対応表は無い。この
		//      セクションが持つのは公開ページ一覧の自動生成トグル（nav_list_enabled）。
		//   3. 公開操作はダッシュボードタブ専用ではない。0.3.0-dev.36 以降は全タブ
		//      下部の sticky 変更サマリバー（neccospeak_agent_ui_render_change_summary()）
		//      からも公開・破棄できる。
		// よって説明文を NS の実挙動に置き換える。トグルの在り処の書き方は
		// tab-ai.php:449 の同種の説明文（同じ結論に先に到達している）と揃える。
		?>
		<p class="description ai-agent-save-mode-desc">
			<?php
			printf(
				/* translators: %s: the "Publish changes" button label, wrapped in <strong> tags. */
				esc_html__( 'Everything on this tab follows the one global change management workflow setting (in "NeccoSpeak basic settings" on the AI settings tab): with it off, saving goes live at once; with it on, saving stores a draft that you publish with %s in the change bar at the bottom of any tab.', 'neccospeak' ),
				'<strong>' . esc_html__( 'Publish changes', 'neccospeak' ) . '</strong>'
			);
			?>
		</p>
		<?php // 本番 ai_agent_embed_render_section_basics_navigation() 自身の見出し（admin-agent-settings.php ~1646）。basics_wrapper('navigation') の h2 と文言が重複するが、本番は h2 と h3 の間に basics_wrapper の保存モード説明文（~1537）が挟まって表示される。上で同じ説明文を描画しているため、この h3 は本番どおり踏襲する。 ?>
		<h3 style="margin-top:8px;"><?php echo esc_html__( 'Navigation settings', 'neccospeak' ); ?></h3>
		<p class="description"><?php echo esc_html__( 'Configure which pages on your site the AI agent can guide users to.', 'neccospeak' ); ?></p>

		<?php if ( $flow_nav_form_ok ) : ?>
			<?php
			$nav_types_selected = ( isset( $opts['nav_list_post_types'] ) && is_array( $opts['nav_list_post_types'] ) ) ? $opts['nav_list_post_types'] : array();
			?>
			<table class="form-table ai-agent-form-table">
				<tr>
					<th scope="row"><?php echo esc_html__( 'URL map', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[nav_list_enabled]" value="1" <?php checked( ! empty( $opts['nav_list_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Give the AI a list of published pages so it can guide users to them', 'neccospeak' ); ?>
						</label>
						<p style="margin-top:8px;">
							<?php foreach ( array( 'page' => __( 'Pages', 'neccospeak' ), 'post' => __( 'Posts', 'neccospeak' ) ) as $nav_val => $nav_label ) : ?>
								<label style="margin-right:12px;">
									<input type="checkbox"
										name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[nav_list_post_types][]"
										value="<?php echo esc_attr( $nav_val ); ?>"
										<?php checked( in_array( $nav_val, $nav_types_selected, true ) ); ?> />
									<?php echo esc_html( $nav_label ); ?>
								</label>
							<?php endforeach; ?>
						</p>
						<p>
							<label for="neccospeak_agent_nav_list_max"><?php echo esc_html__( 'Maximum items', 'neccospeak' ); ?></label>
							<input type="number" id="neccospeak_agent_nav_list_max" min="1" max="50" class="small-text"
								name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[nav_list_max]"
								value="<?php echo esc_attr( isset( $opts['nav_list_max'] ) ? (string) $opts['nav_list_max'] : '20' ); ?>" />
							<?php echo esc_html__( 'items max', 'neccospeak' ); ?>
						</p>
						<p class="description"><?php echo esc_html__( 'The AI guides users to the appropriate page based on their questions.', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</table>

			<?php
			// 統一レイアウト方針・項目4: 本番のナビゲーション設定タブに存在しない NeccoSpeak 独自項目（ページごとの案内・リンクチェック）をタブ末尾へ隔離する。機能・バインド・保存経路（'content' フォーム）は変更しない。
			// この会話フロータブには同名の「NeccoSpeak独自の設定」見出しが CTA設定セクション（'actions' フォーム、上の cta_enabled 等）
			// にも存在する。両者は保存先フォーム（_tab）が異なるため1つの <form> に統合できない（'actions' と 'content' は
			// neccospeak_tab_fields() 上の別ホワイトリストで、跨って送信すると他方のタブの値を巻き込んでしまう）。よって
			// 「1タブ内に同一文言の見出しが2回出る」問題は、両見出しの文言をセクションごとに区別することで解消する
			// （フィールドの所有フォームやバインドは一切変更しない）。
			//
			// 2026-08 バグ修正: page_context_enabled はマスタートグルのため、他のNS独自項目と
			// 一緒に非表示にすると新規インストールでページ別指示機能を有効化する手段が管理画面
			// から完全に失われる（voice_enabledと同じ不具合）。同じ表内の link_verify_enabled
			// （既定オンだが調整不可）も一緒に可視化する。name/値・保存経路は不変。
			?>
			<h3 style="margin-top:24px;"><?php echo esc_html__( 'Per-page guidance and link check', 'neccospeak' ); ?></h3>
			<p class="description"><?php echo esc_html__( 'Set per-page guidance from the page editor, and automatically remove assistant links to pages that do not exist.', 'neccospeak' ); ?></p>
			<table class="form-table ai-agent-form-table">
				<tr>
					<th scope="row"><?php echo esc_html__( 'Per-page guidance', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[page_context_enabled]" value="1" <?php checked( ! empty( $opts['page_context_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Set per-page guidance text from the page/post edit screen', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Link check', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[link_verify_enabled]" value="1" <?php checked( ! empty( $opts['link_verify_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Remove links to nonexistent pages from responses', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
			</table>
			</form>
		<?php endif; ?>
	</div>
	<?php
}
