<?php
/**
 * NeccoSpeak — Agent UI: 音声設定 タブ（本番 ai-agent-embed v1.5.1.1 の
 * 「音声設定」タブと同じ見た目・同じ画面構成で描画する）。
 *
 * 本番の音声設定タブは includes/admin-agent-settings.php
 * ai_agent_embed_render_tab_voice_combined() が
 *   1. 基本設定（AIの声・書き起こし言語・会話のテンポ・音声ボタン表示）
 *   2. カスタム音声設定（外部TTSエンジン）
 * の2セクションで構成するが、NeccoSpeak は 1. のみを描画する（2. は
 * 0.3.0-dev.27 でトルツメ — 下記の削除記録を参照）。
 *
 * NeccoSpeak 側のバインド（統一レイアウト方針 1〜6 準拠）:
 *   - 基本設定 → 本番と同じ4項目・同じ並び順で本ファイルに直接実装（レガシー
 *     レンダラー includes/admin-tabs.php neccospeak_render_tab_voice() の丸ごと
 *     再利用はしない — 「AIの声」の自由入力/select差異・保存値フォールバック
 *     表示など、見た目・挙動を本番と厳密一致させる必要があったため）。
 *     name 属性は NECCOSPEAK_OPTION[voice|show_voice_button|
 *     transcription_language|turn_eagerness] を維持し、includes/settings.php
 *     の既存サニタイズ経路（neccospeak_sanitize_options() →
 *     'voice' タブの neccospeak_tab_fields()）をそのまま利用する。
 *   - voice_enabled（音声機能）は、本番の音声設定タブに対応するコントロールが
 *     存在しない NS 固有項目のため、方針4に従いタブ末尾の「NeccoSpeak独自の設定」
 *     セクションへ移設した。ただし includes/settings.php の 'voice' タブ
 *     フィールド一覧には含まれているため、この画面のどこかに編集フィールドとして
 *     出しておかないと「音声設定」タブを保存するたびに既定値へ無言でリセットされて
 *     しまう（neccospeak_sanitize_field_value() は _tab=voice 送信時、フォームに
 *     存在しないキーを $defaults 側にフォールバックさせる）。
 *   - realtime_model（リアルタイムAPIモデル）も同様に本番の音声設定タブに対応
 *     コントロールが無い NS 固有項目だが、2026-08 のユーザー依頼により「基本設定」
 *     表の先頭行（AI voice より前）へ昇格した — 音声モデルの選択は基本設定の
 *     一部として扱うべきという判断のため。
 *     当初は <input type="text"> + <datalist>（直書き3候補との前方一致）の
 *     「候補付き自由入力」だったが、現在値が直書き候補と前方一致しないと
 *     ブラウザ側の絞り込みで選択肢が一切出ない罠があり（例:
 *     'gpt-realtime-2.1' は 'gpt-realtime-2' 等のどれとも前方一致しない）、
 *     ユーザー報告を受けて2026-08にテキスト側 (tab-model.php の
 *     #ai-agent-adv-model) と同じ本物の <select> 方式へ変更した。サーバー側は
 *     現在値だけを <option selected> として描画し、ブラウザ側で REST
 *     /neccospeak/v1/models の realtime 配列から選択肢を取得して差し替える
 *     （assets/agent-ui/js/agent-ui.js の initModelSelect() — テキスト側と
 *     共通化済み）。JS未実行/取得失敗時は現在値の1件だけが残るため設定値は
 *     失われない。name 属性 (neccospeak_options[realtime_model]) と保存経路
 *     （_rendered 自己申告を含む）は変更していない。
 *   - マイクに関する案内 / 通話中の音声UI（voice_notice_enabled/text,
 *     voice_ui_enabled/visualizer/mute_button/device_select/text_return）も
 *     同じ理由（本番に対応コントロールが無いが 'voice' タブのフィールド一覧に
 *     含まれる）で、「NeccoSpeak独自の設定」セクション内に維持する。
 *   - カスタム音声設定 → 当初は本番パリティのため disabled モック（pro-only
 *     表示・オプションキーなし）として5項目を再現していたが、無料プラグイン
 *     では外部TTS（StyleBertVit2 / FishAudio）連携を提供しない製品判断が
 *     確定したため、0.3.0-dev.27 でセクションごと削除した（本番との意図的
 *     差分）。機能実体は元々存在しない（widget-frame 側の custom_voice DOM は
 *     移植時に削除済み — includes/widget-frame.php の docblock 参照）。
 *
 * @package NeccoSpeak
 */

defined( 'ABSPATH' ) || exit;

/**
 * 音声設定 タブ本体。
 *
 * @param array $opts neccospeak_editing_options() 相当。
 * @return void
 */
function neccospeak_agent_ui_tab_voice( $opts ) {
	$opts = is_array( $opts ) ? $opts : array();

	// 「音声設定」ヘッダーの save-mode チップ用（tab-ai.php と同じ判定）。
	$draft_workflow_active = function_exists( 'neccospeak_draft_workflow_active' ) && neccospeak_draft_workflow_active();

	// 本番 admin-agent-settings.php ai_agent_embed_render_tab_voice() の
	// 「AIの声」select と同じ並び・ラベル（marin/cedar のみ「（推奨・最高品質）」付き）。
	$voice_list        = array( 'alloy', 'ash', 'ballad', 'coral', 'echo', 'sage', 'shimmer', 'verse', 'marin', 'cedar' );
	$voice_recommended = array( 'marin', 'cedar' );
	$voice_current     = isset( $opts['voice'] ) ? (string) $opts['voice'] : '';

	// 本番の「書き起こし言語」select と同じ並び・ラベル。
	// 値マッピング: NS の transcription_language は enum( 'auto','ja','en','zh','ko','es','fr','de','pt' )
	// （includes/settings.php neccospeak_field_specs()）。本番 select には 'auto' の
	// <option> が無いが、NS のバックエンド既定は 'auto'（=OpenAI に言語を送らず
	// 自動判定）なので、選択肢が無いと「保存値 auto なのに先頭の 日本語 (ja) が
	// 選択中に見え、保存すると黙って ja 固定に化ける」罠になっていた
	// (2026-08-07)。本番からの意図的差分として 'auto' を先頭に追加する。
	// name/サニタイズ経路は変更しない。
	$transcription_languages = array(
		'auto' => __( 'Automatic detection (auto)', 'neccospeak' ),
		'ja' => '日本語 (ja)',
		'en' => 'English (en)',
		'zh' => '中文 (zh)',
		'ko' => '한국어 (ko)',
		'es' => 'Español (es)',
		'fr' => 'Français (fr)',
		'de' => 'Deutsch (de)',
		'pt' => 'Português (pt)',
	);

	// 本番の「会話のテンポ」select と同じ並び・ラベル。
	// 値マッピング: NS の turn_eagerness は enum( 'auto','low','medium','high' )
	// （includes/settings.php neccospeak_field_specs()）で、本番の4値と1:1対応。
	$turn_eagerness_options = array(
		'auto'   => __( 'Auto (same as Standard)', 'neccospeak' ),
		'low'    => __( 'Careful — waits patiently until the user finishes speaking', 'neccospeak' ),
		'medium' => __( 'Standard', 'neccospeak' ),
		'high'   => __( 'Quick — responds immediately even to short utterances', 'neccospeak' ),
	);

	// NS固有: リアルタイムAPIモデルの現在値（本番に対応項目なし）。選択肢は
	// テキスト側の #ai-agent-adv-model と同様、ブラウザ側で REST
	// /neccospeak/v1/models の realtime 配列から動的取得する
	// (assets/agent-ui/js/agent-ui.js initModelSelect())。サーバー側はここでは
	// 現在値のみを <option selected> として描画する（本ファイル冒頭のdocblock
	// 参照）。
	$realtime_model_current = isset( $opts['realtime_model'] ) && '' !== $opts['realtime_model'] ? (string) $opts['realtime_model'] : 'gpt-realtime-2';

	// NS固有: 通話中の音声UI「波形表示」select の選択肢。
	$voice_ui_visualizer_options = array(
		'none' => __( 'Do not show', 'neccospeak' ),
		'bars' => __( 'Bars', 'neccospeak' ),
		'dots' => __( 'Dots', 'neccospeak' ),
	);
	?>
	<div class="ai-agent-section" id="ai-agent-voice">
		<?php neccospeak_agent_ui_form_open( 'voice' ); ?>
		<div class="ai-agent-section-header">
			<h2><?php echo esc_html__( 'Voice settings', 'neccospeak' ); ?></h2>
			<div class="ai-agent-section-actions">
				<span class="ai-agent-save-mode ai-agent-save-mode--<?php echo $draft_workflow_active ? 'draft' : 'immediate'; ?>"
					title="<?php echo $draft_workflow_active ? esc_attr__( 'Because the change management workflow is enabled, your changes are saved as a draft.', 'neccospeak' ) : esc_attr__( 'Because the change management workflow is disabled, your changes are published immediately when saved.', 'neccospeak' ); ?>">
					<?php echo $draft_workflow_active ? esc_html__( 'Saved as draft', 'neccospeak' ) : esc_html__( 'Applied immediately', 'neccospeak' ); ?>
				</span>
				<button type="submit" class="button button-primary"><?php esc_html_e( 'Save', 'neccospeak' ); ?></button>
			</div>
		</div>
		<p class="description"><?php echo esc_html__( 'Settings for voice conversation mode. You can adjust the AI voice, language, and response sensitivity.', 'neccospeak' ); ?></p>

		<h3><?php echo esc_html__( 'Basic settings', 'neccospeak' ); ?></h3>
		<table class="form-table ai-agent-form-table" role="presentation">
			<tbody>
				<?php /* 2026-08 バグ修正: voice_enabled は「NeccoSpeak独自の設定」非表示ブロックに
				誤って含まれており、新規インストールで音声チャットを有効化する手段が管理画面から
				完全に失われていた（マスタートグルのため、他のNS独自項目とは性質が異なる）。
				このチェックボックスだけを可視の基本設定側へ昇格させる。name/値・保存経路は不変。 */ ?>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Voice feature', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_enabled]" value="1" <?php checked( ! empty( $opts['voice_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Enable voice conversation (HTTPS required; the browser connects directly to OpenAI)', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row">
						<label for="neccospeak_realtime_model"><?php echo esc_html__( 'Realtime API model', 'neccospeak' ); ?></label>
					</th>
					<td>
						<select id="neccospeak_realtime_model"
							name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[realtime_model]">
							<option value="<?php echo esc_attr( $realtime_model_current ); ?>" selected="selected"><?php echo esc_html( $realtime_model_current ); ?></option>
						</select>
						<span id="neccospeak-realtime-model-status" style="margin-left:8px; color:#999;"></span>
						<p class="description"><?php echo esc_html__( 'The model used in voice (Realtime) mode. The list is fetched automatically from the OpenAI API.', 'neccospeak' ); ?></p>
					</td>
				</tr>

				<tr>
					<th scope="row">
						<label for="neccospeak_voice"><?php echo esc_html__( 'AI voice', 'neccospeak' ); ?></label>
					</th>
					<td>
						<select id="neccospeak_voice" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice]">
							<?php if ( '' !== $voice_current && ! in_array( $voice_current, $voice_list, true ) ) : ?>
								<?php // 保存値が本番の選択肢リストに無い場合（旧設定・手動設定など）は先頭にそのまま表示し、無言で別の声に切り替わらないようにする。 ?>
								<option value="<?php echo esc_attr( $voice_current ); ?>" selected="selected"><?php echo esc_html( $voice_current ); ?></option>
							<?php endif; ?>
							<?php foreach ( $voice_list as $v ) : ?>
								<option value="<?php echo esc_attr( $v ); ?>" <?php selected( $voice_current, $v ); ?>>
									<?php echo esc_html( in_array( $v, $voice_recommended, true ) ? sprintf( /* translators: %s: voice name. */ __( '%s (recommended, best quality)', 'neccospeak' ), $v ) : $v ); ?>
								</option>
							<?php endforeach; ?>
						</select>
						<p class="description"><?php echo esc_html__( 'Select the AI voice used in voice conversation mode.', 'neccospeak' ); ?></p>
					</td>
				</tr>

				<tr>
					<th scope="row">
						<label for="neccospeak_transcription_language"><?php echo esc_html__( 'Transcription language', 'neccospeak' ); ?></label>
					</th>
					<td>
						<select id="neccospeak_transcription_language" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[transcription_language]">
							<?php foreach ( $transcription_languages as $val => $label ) : ?>
								<option value="<?php echo esc_attr( $val ); ?>" <?php selected( isset( $opts['transcription_language'] ) ? $opts['transcription_language'] : '', $val ); ?>><?php echo esc_html( $label ); ?></option>
							<?php endforeach; ?>
						</select>
						<p class="description"><?php echo esc_html__( 'The language used when transcribing the user\'s speech.', 'neccospeak' ); ?></p>
					</td>
				</tr>

				<tr>
					<th scope="row">
						<label for="neccospeak_turn_eagerness"><?php echo esc_html__( 'Conversation tempo', 'neccospeak' ); ?></label>
						<span class="dashicons dashicons-editor-help ai-agent-tooltip" role="img" tabindex="0" title="<?php echo esc_attr__( 'How quickly the AI decides that the user has finished speaking in voice mode (technical name: turn eagerness). "Careful" waits for long questions to finish, while "Quick" responds immediately even to short utterances.', 'neccospeak' ); ?>" aria-label="<?php echo esc_attr__( 'Explanation of conversation tempo (turn eagerness)', 'neccospeak' ); ?>"></span>
					</th>
					<td>
						<select id="neccospeak_turn_eagerness" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[turn_eagerness]">
							<?php foreach ( $turn_eagerness_options as $val => $label ) : ?>
								<option value="<?php echo esc_attr( $val ); ?>" <?php selected( isset( $opts['turn_eagerness'] ) ? $opts['turn_eagerness'] : '', $val ); ?>><?php echo esc_html( $label ); ?></option>
							<?php endforeach; ?>
						</select>
						<p class="description"><?php echo esc_html__( 'The tempo at which the AI decides the user has finished speaking in voice mode (technical name: turn eagerness). "Careful" makes it easier to handle long questions.', 'neccospeak' ); ?></p>
					</td>
				</tr>

				<tr>
					<th scope="row"><?php echo esc_html__( 'Voice button visibility', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[show_voice_button]" value="1" <?php checked( ! empty( $opts['show_voice_button'] ) ); ?> />
							<?php echo esc_html__( 'Show the voice mode toggle button in the widget', 'neccospeak' ); ?>
						</label>
						<p class="description"><?php echo esc_html__( 'When disabled, only text chat is available.', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</tbody>
		</table>

		<?php
		// 「音声モードのプロンプトはテキストモードと統一されました…」という
		// 常設 notice は 0.3.0-dev.28 で削除（本番からの移植痕。過去状態を知る
		// 人向けの変更告知であり、新規ユーザーには意味を成さないうえ、実在
		// しない「話し方・性格」「回答ルール」タブを参照していた）。
		// 音声がテキストと同じプロンプト設定を使うこと自体は現仕様どおり。
		// 統一レイアウト方針4: 本番の音声設定タブに存在しない NS 固有項目は、
		// すべてタブ末尾の「NeccoSpeak独自の設定」セクションへ隔離する
		// （realtime_model は2026-08のユーザー依頼により基本設定へ昇格済み。
		// voice_enabled も2026-08にマスタートグルとして基本設定側へ再昇格した
		// — 非表示のままだと新規インストールで音声チャットを有効化する手段が
		// 消えるバグだったため。現在ここに残るのは voice_notice_*・voice_ui_*
		// のみ）。これらは includes/settings.php の 'voice' タブフィールド一覧
		// に含まれるため、保存経路上ここで編集可能にしておく必要がある。詳細は
		// 本ファイル冒頭のdocblock参照。
		?>
		<?php /* 2026-08 ユーザー決定: 「NeccoSpeak独自の設定」セクションを一旦非表示にする。
		DOMからは削除しない — hidden化した項目のinputはそのままPOSTされ続けるため、保存時に
		チェックボックスが未チェック扱いになって機能が意図せずOFFになる事故を防ぐ。フィールドの
		name/値・保存経路は変更しない。 */ ?>
		<div style="display:none" aria-hidden="true" data-neccospeak-extras-hidden="1">
		<h3 style="margin-top:24px;"><?php echo esc_html__( 'NeccoSpeak-specific settings', 'neccospeak' ); ?></h3>
		<p class="description"><?php echo esc_html__( 'NeccoSpeak-specific items that do not exist in the production (paid) version\'s screens.', 'neccospeak' ); ?></p>

		<h4 style="margin-top:16px;"><?php echo esc_html__( 'Microphone notice', 'neccospeak' ); ?></h4>
		<p class="description"><?php echo esc_html__( 'A notice shown before starting voice mode to inform users about microphone use.', 'neccospeak' ); ?></p>
		<table class="form-table ai-agent-form-table" role="presentation">
			<tbody>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Microphone usage notice', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_notice_enabled]" value="1" <?php checked( ! empty( $opts['voice_notice_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Show a microphone usage notice before starting voice mode', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row">
						<label for="neccospeak_voice_notice_text"><?php echo esc_html__( 'Notice text', 'neccospeak' ); ?></label>
					</th>
					<td>
						<textarea id="neccospeak_voice_notice_text" class="large-text" rows="2" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_notice_text]"><?php echo esc_textarea( isset( $opts['voice_notice_text'] ) ? (string) $opts['voice_notice_text'] : '' ); ?></textarea>
						<p class="description"><?php echo esc_html__( 'If left blank, the default notice text is used.', 'neccospeak' ); ?></p>
					</td>
				</tr>
			</tbody>
		</table>

		<h4 style="margin-top:16px;"><?php echo esc_html__( 'Voice UI during calls', 'neccospeak' ); ?></h4>
		<p class="description"><?php echo esc_html__( 'Configure the UI elements shown during voice mode.', 'neccospeak' ); ?></p>
		<table class="form-table ai-agent-form-table" role="presentation">
			<tbody>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Voice UI', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_ui_enabled]" value="1" <?php checked( ! empty( $opts['voice_ui_enabled'] ) ); ?> />
							<?php echo esc_html__( 'Show the voice UI (waveform display, mute, device switching, etc.) during calls', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row">
						<label for="neccospeak_voice_ui_visualizer"><?php echo esc_html__( 'Waveform display', 'neccospeak' ); ?></label>
					</th>
					<td>
						<select id="neccospeak_voice_ui_visualizer" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_ui_visualizer]">
							<?php foreach ( $voice_ui_visualizer_options as $val => $label ) : ?>
								<option value="<?php echo esc_attr( $val ); ?>" <?php selected( isset( $opts['voice_ui_visualizer'] ) ? $opts['voice_ui_visualizer'] : '', $val ); ?>><?php echo esc_html( $label ); ?></option>
							<?php endforeach; ?>
						</select>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Mute button', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_ui_mute_button]" value="1" <?php checked( ! empty( $opts['voice_ui_mute_button'] ) ); ?> />
							<?php echo esc_html__( 'Show a mute button', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Device selection', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_ui_device_select]" value="1" <?php checked( ! empty( $opts['voice_ui_device_select'] ) ); ?> />
							<?php echo esc_html__( 'Show a microphone device selection menu', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php echo esc_html__( 'Recognized text display', 'neccospeak' ); ?></th>
					<td>
						<label>
							<input type="checkbox" name="<?php echo esc_attr( NECCOSPEAK_OPTION ); ?>[voice_ui_text_return]" value="1" <?php checked( ! empty( $opts['voice_ui_text_return'] ) ); ?> />
							<?php echo esc_html__( 'Show the recognized speech text on screen', 'neccospeak' ); ?>
						</label>
					</td>
				</tr>
			</tbody>
		</table>
		</div>

		<?php // 保存ボタンはヘッダー内 section-actions に移設済みのため、form_close()（末尾ボタン付き）ではなく素の </form> で閉じる。 ?>
		</form>
	</div>

	<?php
}
