<?php
/**
 * NeccoSpeak — Agent UI: モデル・詳細設定 タブ（本番 ai-agent-embed v1.5.1.1 の
 * 「モデル・詳細設定」タブと同じ見た目・同じ画面構成で描画する）。
 *
 * 本番のモデル・詳細設定タブは includes/admin-agent-settings.php
 * ai_agent_embed_render_tab_model() が
 *   1. AIモデル設定（使用モデル・創造性・最大トークン数）＋ ツール使用設定／指示
 *      ＋ プロンプトプレビュー
 *   2. 記憶設定（Mem0）
 * の2セクションで構成する。
 *
 * NeccoSpeak 側のバインド:
 *   - 使用モデル / 創造性 / 最大トークン数 → model / temperature / max_tokens
 *     （本番では「モデル・詳細設定」タブ専属のフィールドで、「AI設定」タブには
 *      現れない。NS側もこのタブのみで描画し、二重描画はしていない）
 *   - ツール使用設定 → tools_site_search / tools_instructions は可視のまま。
 *     2026-08 撤去記録: tools_current_datetime（コード名バッジ GetSystemDate）は
 *     0.3.0-dev.60 でこのタブの行ごと削除した — includes/tools.php の
 *     current_datetime ツール撤去に伴う（同ファイルの撤去記録コメント参照）。
 *     ツール行のコード名バッジは 0.3.0-dev.30 から NS の実ツールコード
 *     （site_search — includes/tools.php）を表示する（NeccosRAG は本番専用コードで
 *     NS に実体が無いため置換）。NSに実体の無い本番ツール7種の disabled モック行は
 *     当初本番パリティで表示していたが、無料プラグインでは提供しない製品判断により
 *     0.3.0-dev.29 でトルツメ（本番との意図的差分 — 本文中の削除記録コメント参照）。本番の
 *     並び順どおりに表示する（いずれも pocxr 側 constants/tool-names.js と
 *     public/javascripts/openai-realtime-agent/tool/tool-definitions.mjs の ALL_TOOLS に
 *     実在するツールコードであることを確認済み）。
 *   - 記憶設定（Mem0） → NeccoSpeak にはユーザー記憶機能が無いため、当初は disabled
 *     モックで本番パリティ表示していたが 0.3.0-dev.30 でセクションごとトルツメ
 *     （本番との意図的差分 — 本文中の削除記録コメント参照）。
 *   - プロンプトプレビュー → includes/admin-tabs.php の
 *     neccospeak_render_prompt_preview_mode() を再利用。
 *
 * NeccoSpeak 独自の設定（本番の同タブに無い項目。非表示化済み）:
 *   - ツールを有効にする（tools_enabled マスタートグル） → 本番の「モデル・ツール設定」は
 *     個別ツールごとのトグルのみを動的描画し（admin-agent-settings.php の
 *     ai_agent_embed_render_section_model() はツールテーブルを空の <tbody> として出力し、
 *     JS が ai_agent_fetch_tool_policies の結果を1ツール1行で流し込む）、全体を束ねる
 *     単一のマスターON/OFF行は存在しない。NS独自の行のため非表示化した（97行目付近）。
 *   - ページ情報の取得（tools_get_page_info / get_page_info） → NS独自(Phase 6)実装の
 *     ツールで、本番バックエンド（pocxr）の constants/tool-names.js /
 *     tool-definitions.mjs のいずれにも get_page_info というツールコードは存在しない
 *     （NeccosRAG・GetSystemDate等とは異なり本番に対応行が無い）ため非表示化した
 *     （119行目付近）。2026-08 撤去記録: このコメントが対比に使う GetSystemDate
 *     自体の行は 0.3.0-dev.60 でこのタブから削除済み（上記バインド節参照）—
 *     ここでの言及は本番側ツール一覧との比較文脈としてのみ残す。
 *   - クライアントのリクエストタイムアウト（秒） → chat_timeout_seconds。
 *     旧 includes/admin-tabs.php neccospeak_render_tab_general() のマークアップを
 *     そのまま転記（同じ 'general' 保存ホワイトリスト）。tab-ai.php の
 *     「AI基本設定」イントロ表からはこの行を含めモデル/創造性/最大トークン数の
 *     行ごと除去し、このタブへのリンク行に差し替え済み（tab-ai.php 側コメント参照）
 *     ので、二重描画にはならない。
 *
 * @package NeccoSpeak
 */

defined( 'ABSPATH' ) || exit;

/**
 * モデル・詳細設定 タブ本体。
 *
 * @param array $opts neccospeak_editing_options() 相当。
 * @return void
 */
function neccospeak_agent_ui_tab_model( $opts ) {
	$opts = is_array( $opts ) ? $opts : array();
	?>
	<div class="ai-agent-section" id="ai-agent-advanced">
		<div class="ai-agent-section-header">
			<h2><?php echo esc_html__( 'Model & tool settings', 'neccospeak' ); ?></h2>
		</div>
		<p class="description">
			<?php
			printf(
				/* translators: %1$s: 「即時反映」(強調), %2$s: 「ドラフト保存」(強調) */
				esc_html__( 'Advanced model and LLM settings. Model selection is %1$s, while advanced LLM parameters such as temperature are %2$s and must be published from the Dashboard tab.', 'neccospeak' ),
				'<strong>' . esc_html__( 'Applied immediately', 'neccospeak' ) . '</strong>',
				'<strong>' . esc_html__( 'Saved as a draft', 'neccospeak' ) . '</strong>'
			);
			?>
		</p>

		<h3><?php echo esc_html__( 'AI model settings', 'neccospeak' ); ?></h3>
		<?php if ( function_exists( 'neccospeak_agent_ui_form_open' ) ) : ?>
			<?php neccospeak_agent_ui_form_open( 'general' ); ?>
			<table class="form-table ai-agent-form-table">
				<tr>
					<th scope="row"><?php echo esc_html__( 'Model', 'neccospeak' ); ?></th>
					<td>
						<?php $neccospeak_current_model = isset( $opts['model'] ) && '' !== $opts['model'] ? (string) $opts['model'] : 'gpt-4o-mini'; ?>
						<select id="ai-agent-adv-model"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[model]">
							<option value="<?php echo esc_attr( $neccospeak_current_model ); ?>" selected="selected"><?php echo esc_html( $neccospeak_current_model ); ?></option>
						</select>
						<span id="ai-agent-adv-model-status" style="margin-left:8px; color:#999;"></span>
						<p class="description"><?php echo esc_html__( 'Model used only in text conversation mode. Voice mode uses a separate model, selected on the Voice settings tab. The list is fetched automatically from the OpenAI API.', 'neccospeak' ); ?></p>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Response creativity', 'neccospeak' ); ?><span class="dashicons dashicons-editor-help ai-agent-tooltip" role="img" tabindex="0" title="<?php echo esc_attr__( 'Controls how much responses vary (technical name: temperature). Lower values give more factual, consistent responses; higher values give more diverse, creative responses. Valid range: 0-1.2 in text mode, 0.6-1.2 in voice mode. The standard range is 0.6-0.9.', 'neccospeak' ); ?>" aria-label="<?php echo esc_attr__( 'Description of response creativity (temperature parameter)', 'neccospeak' ); ?>"></span></th>
					<td>
						<input type="range" id="ai-agent-adv-temperature" min="0" max="1.2" step="0.1" value="0.6"
							style="width:300px;vertical-align:middle;"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[temperature]" />
						<span id="ai-agent-adv-temperature-val" style="margin-left:8px; font-weight:600;">0.6</span>
						<p class="description"><?php echo esc_html__( 'Low: factual ↔ high: creative (technical name: temperature, 0-1.2). Standard is 0.6-0.9. When using voice mode, 0.6 or higher is recommended.', 'neccospeak' ); ?></p>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Maximum characters per response', 'neccospeak' ); ?><span class="dashicons dashicons-editor-help ai-agent-tooltip" role="img" tabindex="0" title="<?php echo esc_attr__( 'Upper limit on the length of a single response (technical name: max output tokens). One token is roughly 1-2 Japanese characters. Lower values give shorter answers; higher values give more detailed answers. The standard is around 800.', 'neccospeak' ); ?>" aria-label="<?php echo esc_attr__( 'Description of maximum characters per response (max output tokens)', 'neccospeak' ); ?>"></span></th>
					<td>
						<input type="number" id="ai-agent-adv-max-tokens" class="small-text" min="100" max="4096" step="100" value="800"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[max_tokens]" />
						<p class="description"><?php echo esc_html__( 'Maximum length of a single response (technical name: max output tokens; 100-4096, standard around 800). One token is roughly 1-2 Japanese characters.', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</table>
			<?php neccospeak_agent_ui_form_close( __( 'Save', 'neccospeak' ) ); ?>
		<?php endif; ?>

		<h3><?php echo esc_html__( 'Tool usage settings', 'neccospeak' ); ?></h3>
		<p class="description"><?php echo esc_html__( 'Controls which features (tools) the AI agent can use.', 'neccospeak' ); ?></p>
		<p class="description"><?php echo esc_html__( 'The current date and time is always supplied to the assistant automatically — no setting needed.', 'neccospeak' ); ?></p>
		<?php if ( function_exists( 'neccospeak_agent_ui_form_open' ) ) : ?>
			<?php neccospeak_agent_ui_form_open( 'content' ); ?>
			<table class="form-table ai-agent-form-table">
				<?php /* 2026-08 バグ修正: tools_enabled は「本番に単一マスター行が無い」という
				理由で非表示にされていたが、これはマスタートグルのため他のNS独自項目とは性質が
				異なる — 非表示のままだと新規インストールでツール機能を有効化する手段が管理画面
				から完全に失われる（voice_enabledと同じ不具合）。可視の行へ昇格させる。
				name/値・保存経路は不変。 */ ?>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Enable tools', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[tools_enabled]" value="1" <?php checked( ! empty( $opts['tools_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Allow the AI to use tools', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row">
						<?php echo esc_html__( 'Site search', 'neccospeak' ); ?>
						<code style="font-size:11px;color:#888;">site_search</code>
					</th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[tools_site_search]" value="1" <?php checked( ! empty( $opts['tools_site_search'] ) ); ?> />
							<?php echo esc_html__( 'Searches pages and posts on this site by keyword.', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<?php /* 2026-08 バグ修正: get_page_info の行自体は本番に対応が無いためNS独自の
				表記(コード名の注記)は残すが、非表示化していたのは誤り — tools_site_search という
				兄弟トグルは同じ「NS独自・本番に対応なし」の理由でも可視のままだった。片方だけ
				非表示にする理由がないため、こちらも可視化する。値・保存経路は不変（既定値は
				tools_site_search と同じくfalseのまま = 個別オプトイン）。 */ ?>
				<tr>
					<th scope="row">
						<?php echo esc_html__( 'Get page information', 'neccospeak' ); ?>
						<code style="font-size:11px;color:#888;">get_page_info</code>
					</th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[tools_get_page_info]" value="1" <?php checked( ! empty( $opts['tools_get_page_info'] ) ); ?> />
							<?php echo esc_html__( 'Fetches details of a page on this site (title, excerpt, last updated) by URL or ID.', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<?php /* 2026-08 撤去記録: 「現在の日時」行 (tools_current_datetime /
				GetSystemDate) をここで丸ごと削除 (0.3.0-dev.60) — 本番の
				current_datetime ツールに対応していた NS 独自(Phase 6)実装のツールは
				includes/tools.php の登録から撤去済み（同ファイルの撤去記録コメント
				参照）。tab_fields/field_specs からも同時に除去済みなので、dev.50 の
				「隠すと POST され続けて false 化する」再発形には当たらない（隠すのでは
				なく行自体を消している）。日時は現在、設定不要で常に AI に渡される
				(includes/prompt.php の current_datetime セクション、両モード)。 */ ?>
				<?php /* 本番にのみ存在する7ツール（getCurrentPosition / search_site_content /
				getForecast / web_search / LoadChatLog / read_memory / retrieve_memory）の
				disabledモック行は 0.3.0-dev.29 でトルツメ（無料プラグインでは提供しない
				製品判断・本番との意図的差分）。name属性を持たない純粋な表示行だった
				ため保存経路への影響なし。 */ ?>
			</table>
			<h3><?php echo esc_html__( 'Tool usage instructions', 'neccospeak' ); ?></h3>
			<p class="description"><?php echo esc_html__( 'Enter additional instructions for tool usage, one item per line (e.g. site search, current date and time).', 'neccospeak' ); ?></p>
			<textarea class="large-text" rows="4"
				name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[tools_instructions]"
				placeholder="<?php echo esc_attr( __( "One item per line\ne.g. When the site search tool is called, never include search result URLs in the response text", 'neccospeak' ) ); ?>"
			><?php echo esc_textarea( isset( $opts['tools_instructions'] ) ? (string) $opts['tools_instructions'] : '' ); ?></textarea>
			<?php neccospeak_agent_ui_form_close( __( 'Save', 'neccospeak' ) ); ?>
		<?php endif; ?>

		<?php if ( function_exists( 'neccospeak_compose_system_prompt_ex' ) && function_exists( 'neccospeak_render_prompt_preview_mode' ) ) : ?>
			<h3 style="margin-top:32px;"><?php echo esc_html__( 'Prompt preview', 'neccospeak' ); ?></h3>
			<p class="description"><?php echo esc_html__( 'Shows the full system prompt generated from the current settings. Saved settings are reflected.', 'neccospeak' ); ?></p>
			<?php
			$text_result = neccospeak_compose_system_prompt_ex( $opts, 'text' );
			$rt_result   = neccospeak_compose_system_prompt_ex( $opts, 'realtime' );
			?>
			<p>
				<select id="ai-agent-prompt-preview-mode">
					<option value="text"><?php echo esc_html__( 'Text mode', 'neccospeak' ); ?></option>
					<option value="realtime"><?php echo esc_html__( 'Voice mode', 'neccospeak' ); ?></option>
				</select>
			</p>
			<?php
			neccospeak_render_prompt_preview_mode( 'text', $text_result, '', $opts );
			neccospeak_render_prompt_preview_mode(
				'realtime',
				$rt_result,
				__( 'Voice mode instructions are limited to about 8,000 bytes (about 2,600 Japanese characters).', 'neccospeak' ),
				$opts
			);
			?>
		<?php endif; ?>
	</div>

	<?php /* 記憶設定（Mem0）セクションは 0.3.0-dev.30 でトルツメ。無料プラグインでは
	ユーザー記憶機能を提供しない製品判断（本番との意図的差分）。実体は移植時に
	全撤去済み（memory_enabled キーの意図的不在・#profile-panel 削除 —
	includes/widget-frame.php 参照）で、name属性の無い表示モックのみだった。 */ ?>

	<?php /* 2026-08 ユーザー決定: 「NeccoSpeak独自の設定」セクションを一旦非表示にする。
	DOMからは削除しない — hidden化した項目のinputはそのままPOSTされ続けるため、保存時に
	チェックボックスが未チェック扱いになって機能が意図せずOFFになる事故を防ぐ。フィールドの
	name/値・保存経路は変更しない。 */ ?>
	<div style="display:none" aria-hidden="true" data-neccospeak-extras-hidden="1">
	<div class="ai-agent-section" id="ai-agent-model-ns-only">
		<div class="ai-agent-section-header">
			<h2><?php echo esc_html__( 'NeccoSpeak-specific settings', 'neccospeak' ); ?></h2>
		</div>
		<p class="description"><?php echo esc_html__( 'NeccoSpeak-specific items that do not exist in the production (paid) version\'s screens.', 'neccospeak' ); ?></p>
		<?php if ( function_exists( 'neccospeak_agent_ui_form_open' ) ) : ?>
			<?php neccospeak_agent_ui_form_open( 'general' ); ?>
			<table class="form-table ai-agent-form-table">
				<tr>
					<th scope="row">
						<label for="neccospeak_chat_timeout_seconds"><?php echo esc_html__( 'Client request timeout (seconds)', 'neccospeak' ); ?></label>
					</th>
					<td>
						<?php $neccospeak_chat_timeout = isset( $opts['chat_timeout_seconds'] ) ? (int) $opts['chat_timeout_seconds'] : 130; ?>
						<input
							type="number"
							min="10"
							max="240"
							step="1"
							id="neccospeak_chat_timeout_seconds"
							class="small-text"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[chat_timeout_seconds]"
							value="<?php echo esc_attr( (string) $neccospeak_chat_timeout ); ?>"
						/>
						<p class="description"><?php echo esc_html__( 'How long the visitor\'s browser waits for a response before showing a timeout message (10-240). Keep it at 130 or higher unless you know your server responds faster. Shorter values may cut off replies that are still being generated.', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</table>
			<?php neccospeak_agent_ui_form_close( __( 'Save', 'neccospeak' ) ); ?>
		<?php endif; ?>
	</div>
	</div>

	<script>
	( function () {
		'use strict';

		document.addEventListener( 'DOMContentLoaded', function () {
			// D2: 創造性スライダーの現在値ライブ表示。
			var range = document.getElementById( 'ai-agent-adv-temperature' );
			var out   = document.getElementById( 'ai-agent-adv-temperature-val' );
			if ( range && out ) {
				range.addEventListener( 'input', function () {
					out.textContent = range.value;
				} );
			}

			// D12: プロンプトプレビューのモード切替（旧ラジオ→セレクト）。
			var select = document.getElementById( 'ai-agent-prompt-preview-mode' );
			if ( select ) {
				var applyMode = function () {
					var mode   = select.value;
					var panels = document.querySelectorAll( '.neccospeak-preview-panel' );
					for ( var i = 0; i < panels.length; i++ ) {
						if ( panels[ i ].getAttribute( 'data-mode' ) === mode ) {
							panels[ i ].removeAttribute( 'hidden' );
						} else {
							panels[ i ].setAttribute( 'hidden', 'hidden' );
						}
					}
				};
				select.addEventListener( 'change', applyMode );
				applyMode();
			}
		} );
	} )();
	</script>
	<?php
}
