package com.fieldlabel.collector.ui.screens

import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Mic
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

/**
 * ハンズフリーモードの音声コマンド一覧を表示するマニュアル画面。
 */
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun VoiceManualScreen(
    onNavigateBack: () -> Unit
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("音声コマンド一覧") },
                navigationIcon = {
                    IconButton(onClick = onNavigateBack) {
                        Icon(Icons.Default.ArrowBack, "戻る")
                    }
                }
            )
        }
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .fillMaxSize()
                .verticalScroll(rememberScrollState())
                .padding(innerPadding)
                .padding(horizontal = 16.dp, vertical = 8.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {
            // 説明カード
            Card(
                colors = CardDefaults.cardColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer
                ),
                modifier = Modifier.fillMaxWidth()
            ) {
                Row(
                    modifier = Modifier.padding(16.dp),
                    verticalAlignment = Alignment.Top,
                    horizontalArrangement = Arrangement.spacedBy(12.dp)
                ) {
                    Icon(
                        Icons.Default.Mic,
                        contentDescription = null,
                        tint = MaterialTheme.colorScheme.primary,
                        modifier = Modifier.size(24.dp).padding(top = 2.dp)
                    )
                    Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
                        Text(
                            "ハンズフリーモードの使い方",
                            style = MaterialTheme.typography.titleSmall,
                            fontWeight = FontWeight.SemiBold,
                            color = MaterialTheme.colorScheme.onPrimaryContainer
                        )
                        Text(
                            "① 採集入力ページの「HF開始」ボタンを押す\n" +
                            "② 設定したウェイクワード（例: れこちゃん）を話す\n" +
                            "③ 「はい、どうぞ」と応答したらコマンドを話す\n" +
                            "④ 「HF終了」ボタンまたは「終了」コマンドで停止",
                            style = MaterialTheme.typography.bodySmall,
                            color = MaterialTheme.colorScheme.onPrimaryContainer
                        )
                    }
                }
            }

            // コマンドセクション
            VoiceCommandSection(
                title = "地点・標本操作",
                commands = listOf(
                    VoiceCommand(
                        keywords = listOf("新しい地点", "新規地点", "new location"),
                        description = "現在のGPS位置で新しい地点セッションを開始する",
                        example = "「れこちゃん」→「新しい地点」"
                    ),
                    VoiceCommand(
                        keywords = listOf("標本", "追加", "specimen", "add"),
                        description = "現在のセッションに標本を追加して（設定に応じて）印刷する",
                        example = "「れこちゃん」→「標本」"
                    ),
                    VoiceCommand(
                        keywords = listOf("備考 [テキスト]", "メモ [テキスト]", "notes [text]"),
                        description = "次の標本に備考を設定する。テキストを省略すると入力待ちになる",
                        example = "「れこちゃん」→「備考 落葉樹林内の腐木」"
                    ),
                    VoiceCommand(
                        keywords = listOf("状況", "何番", "status", "how many"),
                        description = "現在の地点IDと採集標本数を読み上げる",
                        example = "「れこちゃん」→「状況」"
                    )
                )
            )

            VoiceCommandSection(
                title = "写真・動画・音声",
                commands = listOf(
                    VoiceCommand(
                        keywords = listOf("写真", "撮影", "photo", "camera", "picture"),
                        description = "カメラを起動して写真を撮影する。撮影後のタグ付けは画面上のダイアログで行う",
                        example = "「れこちゃん」→「写真」"
                    ),
                    VoiceCommand(
                        keywords = listOf("地点写真", "location photo"),
                        description = "カメラを起動し、撮影後はダイアログをスキップして現在の地点に自動で紐づける",
                        example = "「れこちゃん」→「地点写真」"
                    ),
                    VoiceCommand(
                        keywords = listOf("標本写真", "specimen photo"),
                        description = "カメラを起動し、撮影後はダイアログをスキップして最新の標本番号に自動で紐づける",
                        example = "「れこちゃん」→「標本写真」"
                    ),
                    VoiceCommand(
                        keywords = listOf("録画", "video recording"),
                        description = "動画録画を開始する。録画の停止は画面上の「停止」ボタンで行う（HF は録画中は一時停止）",
                        example = "「れこちゃん」→「録画」"
                    ),
                    VoiceCommand(
                        keywords = listOf("録音", "audio recording"),
                        description = "音声録音を開始する。停止ボタンを押すと最新の標本に自動で紐づけて保存し HF が再開する",
                        example = "「れこちゃん」→「録音」"
                    )
                )
            )

            VoiceCommandSection(
                title = "確認・ユーティリティ",
                commands = listOf(
                    VoiceCommand(
                        keywords = listOf("今何番？", "いま何番", "次何番", "what number"),
                        description = "次に追加される標本の番号を読み上げる",
                        example = "「れこちゃん」→「今何番？」"
                    ),
                    VoiceCommand(
                        keywords = listOf("いまどこ？", "今どこ", "現在地", "where am i"),
                        description = "採集地点として登録された座標から現在地までの距離と方角を読み上げる（GPS 取得あり）",
                        example = "「れこちゃん」→「いまどこ？」"
                    ),
                    VoiceCommand(
                        keywords = listOf("タイマー", "timer", "計る"),
                        description = "「何分測りますか？」と聞かれるので分数を話す。時間経過後にビープ音と音声で通知する",
                        example = "「れこちゃん」→「タイマー」→「5分」"
                    ),
                    VoiceCommand(
                        keywords = listOf("ライト", "フラッシュ", "light", "flashlight"),
                        description = "端末のフラッシュライトを点灯・消灯する（交互に切り替え）",
                        example = "「れこちゃん」→「ライト」"
                    ),
                    VoiceCommand(
                        keywords = listOf("ログスタート", "ログ開始", "log start"),
                        description = "経路ログの記録を開始する（フォアグラウンドサービスで GPS を継続記録）",
                        example = "「れこちゃん」→「ログスタート」"
                    ),
                    VoiceCommand(
                        keywords = listOf("ログストップ", "ログ停止", "log stop"),
                        description = "経路ログの記録を停止する",
                        example = "「れこちゃん」→「ログストップ」"
                    )
                )
            )

            VoiceCommandSection(
                title = "カスタムフィールド",
                commands = listOf(
                    VoiceCommand(
                        keywords = listOf("フィールドラベル 値", "field_label value"),
                        description = "設定で登録したカスタムフィールドに値を入力する。フィールドのラベル名を先に話し、続けて値を話す。標本フィールドは最新標本に、地点フィールドは現在の地点に保存される",
                        example = "「れこちゃん」→「体重 12.5」（ラベル「体重」のフィールドに 12.5 を入力）"
                    )
                )
            )

            VoiceCommandSection(
                title = "その他",
                commands = listOf(
                    VoiceCommand(
                        keywords = listOf("繰り返し", "もう一度", "repeat", "again"),
                        description = "最後の音声フィードバックをもう一度読み上げる",
                        example = "「れこちゃん」→「繰り返し」"
                    ),
                    VoiceCommand(
                        keywords = listOf("終了", "end", "finish"),
                        description = "ハンズフリーモードを終了する",
                        example = "「れこちゃん」→「終了」"
                    )
                )
            )

            // ヒントカード
            Card(
                colors = CardDefaults.cardColors(
                    containerColor = MaterialTheme.colorScheme.secondaryContainer
                ),
                modifier = Modifier.fillMaxWidth()
            ) {
                Column(
                    modifier = Modifier.padding(16.dp),
                    verticalArrangement = Arrangement.spacedBy(6.dp)
                ) {
                    Text(
                        "ヒント",
                        style = MaterialTheme.typography.titleSmall,
                        fontWeight = FontWeight.SemiBold,
                        color = MaterialTheme.colorScheme.onSecondaryContainer
                    )
                    listOf(
                        "ウェイクワードは設定画面で変更できます（例: れこちゃん、へいレコーダー）",
                        "音声エンジン言語（日本語/英語）は設定で切り替えられます",
                        "聞き取れなかった場合は「もう一度」コマンドが使えます",
                        "タイマーは1〜180分の範囲で設定できます。1つだけ設定可能で、新しいタイマーをセットすると前のものはキャンセルされます",
                        "「地点写真」「標本写真」はタグ付けダイアログをスキップして素早く記録できます",
                        "録音コマンドはマイクを使用するため HF の音声認識は録音中に一時停止します",
                        "カスタムフィールドの音声入力はフィールドのラベル名が正確に認識される必要があります",
                        "ライトコマンドはフラッシュライトのあるカメラを搭載した端末でのみ動作します",
                        "「いまどこ？」は GPS 取得を行うため、応答に数秒かかる場合があります",
                        "「ログストップ」は「ストップ」を含むため「終了」コマンドより先に判定されます",
                        "画面ロック中は長押しで解除できます",
                        "オフライン環境では音声認識が動作しない場合があります"
                    ).forEach { tip ->
                        Row(
                            horizontalArrangement = Arrangement.spacedBy(8.dp),
                            verticalAlignment = Alignment.Top
                        ) {
                            Text("•", color = MaterialTheme.colorScheme.onSecondaryContainer,
                                style = MaterialTheme.typography.bodySmall)
                            Text(tip,
                                style = MaterialTheme.typography.bodySmall,
                                color = MaterialTheme.colorScheme.onSecondaryContainer)
                        }
                    }
                }
            }

            Spacer(Modifier.height(32.dp))
        }
    }
}

// ─────────────────────────────────────────────────────────────────────────────
// データクラス & コンポーネント
// ─────────────────────────────────────────────────────────────────────────────

private data class VoiceCommand(
    val keywords:    List<String>,
    val description: String,
    val example:     String
)

@Composable
private fun VoiceCommandSection(
    title:    String,
    commands: List<VoiceCommand>
) {
    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
        Text(
            title,
            style     = MaterialTheme.typography.titleMedium,
            fontWeight = FontWeight.SemiBold,
            color     = MaterialTheme.colorScheme.primary
        )
        commands.forEach { cmd ->
            VoiceCommandCard(cmd)
        }
    }
}

@Composable
private fun VoiceCommandCard(cmd: VoiceCommand) {
    Card(
        modifier = Modifier.fillMaxWidth(),
        colors   = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Column(
            modifier = Modifier.padding(12.dp),
            verticalArrangement = Arrangement.spacedBy(6.dp)
        ) {
            // キーワードチップ行
            Row(
                horizontalArrangement = Arrangement.spacedBy(6.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {
                cmd.keywords.forEachIndexed { index, kw ->
                    Surface(
                        shape = MaterialTheme.shapes.extraSmall,
                        color = MaterialTheme.colorScheme.primary
                    ) {
                        Text(
                            "「$kw」",
                            style    = MaterialTheme.typography.labelSmall,
                            color    = MaterialTheme.colorScheme.onPrimary,
                            modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp)
                        )
                    }
                    if (index < cmd.keywords.lastIndex) {
                        Text("/", style = MaterialTheme.typography.labelSmall,
                            color = MaterialTheme.colorScheme.outline)
                    }
                }
            }
            // 説明
            Text(
                cmd.description,
                style = MaterialTheme.typography.bodySmall,
                color = MaterialTheme.colorScheme.onSurfaceVariant
            )
            // 例
            Text(
                cmd.example,
                style = MaterialTheme.typography.bodySmall,
                color = MaterialTheme.colorScheme.outline
            )
        }
    }
}
