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.automirrored.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PrivacyPolicyScreen(
    onNavigateBack: () -> Unit = {}
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("プライバシーポリシー") },
                navigationIcon = {
                    IconButton(onClick = onNavigateBack) {
                        Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "戻る")
                    }
                }
            )
        }
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .padding(innerPadding)
                .verticalScroll(rememberScrollState())
                .padding(horizontal = 20.dp, vertical = 16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {

            // アプリ名・開発者
            Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
                Text(
                    "FieldLabel Collector",
                    style = MaterialTheme.typography.titleLarge,
                    fontWeight = FontWeight.Bold
                )
                Text(
                    "開発者：Joe Kutsukake　最終更新：2026年5月15日",
                    style = MaterialTheme.typography.bodySmall,
                    color = MaterialTheme.colorScheme.outline
                )
            }

            Text(
                "Joe Kutsukake（以下「開発者」）は、本アプリにおけるユーザーのプライバシーを尊重し、" +
                "個人情報の保護に努めます。本ポリシーは、本アプリが収集する情報の種類・利用目的・管理方法について説明します。",
                style = MaterialTheme.typography.bodyMedium
            )

            HorizontalDivider()

            // ── 1. 収集する情報 ────────────────────────────────────────────
            PolicySection(title = "1. 収集する情報と利用目的") {
                PolicyItem(
                    heading = "GPS 位置情報",
                    body    = "採集地点の緯度・経度・標高を記録するために精密な位置情報（GPS）を取得します。" +
                              "取得したデータは端末内にのみ保存され、外部サーバーへは送信されません。"
                )
                PolicyItem(
                    heading = "カメラ・写真",
                    body    = "採集した標本の写真を撮影・記録するためにカメラへアクセスします。" +
                              "撮影した写真は端末内にのみ保存され、外部へアップロードされません。"
                )
                PolicyItem(
                    heading = "Bluetooth",
                    body    = "Brother 社製ラベルプリンター（PT-P910BT 等）への BLE 接続に使用します。" +
                              "個人情報はプリンターとの通信に含まれません。"
                )
                PolicyItem(
                    heading = "インターネット通信",
                    body    = "地図タイル画像の取得（CartoDB / 国土地理院）および" +
                              "GPS 座標から住所を求める逆ジオコーディング（Nominatim API）に使用します。" +
                              "氏名・端末 ID 等の個人情報は送信されません。"
                )

                // 強調カード
                Card(
                    colors = CardDefaults.cardColors(
                        containerColor = MaterialTheme.colorScheme.primaryContainer
                    ),
                    modifier = Modifier.fillMaxWidth()
                ) {
                    Text(
                        "採集データ・写真・設定情報はすべて端末内にのみ保存されます。" +
                        "開発者や第三者のサーバーへ送信・保管されることはありません。",
                        style    = MaterialTheme.typography.bodySmall,
                        color    = MaterialTheme.colorScheme.onPrimaryContainer,
                        modifier = Modifier.padding(14.dp)
                    )
                }
            }

            // ── 2. 第三者サービス ──────────────────────────────────────────
            PolicySection(title = "2. 利用する第三者サービス") {
                Text(
                    "本アプリは以下の外部サービスを利用します。アクセス時に端末の IP アドレスが" +
                    "各サービスに記録される場合があります。詳細は各社のプライバシーポリシーをご確認ください。",
                    style = MaterialTheme.typography.bodyMedium
                )
                Spacer(Modifier.height(4.dp))
                listOf(
                    "CartoDB（標準地図タイル） — © OpenStreetMap contributors © CARTO",
                    "国土地理院（地理院標準地図・空中写真タイル）",
                    "Nominatim / OpenStreetMap（逆ジオコーディング）"
                ).forEach { item ->
                    Row(
                        modifier            = Modifier.padding(start = 8.dp, top = 2.dp),
                        horizontalArrangement = Arrangement.spacedBy(6.dp)
                    ) {
                        Text("•", style = MaterialTheme.typography.bodyMedium,
                            color = MaterialTheme.colorScheme.primary)
                        Text(item, style = MaterialTheme.typography.bodyMedium)
                    }
                }
            }

            // ── 3. 権限 ────────────────────────────────────────────────────
            PolicySection(title = "3. アプリが要求する権限") {
                listOf(
                    "ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION" to "採集地点のGPS座標取得",
                    "CAMERA" to "標本写真の撮影",
                    "BLUETOOTH_CONNECT" to "ラベルプリンターへの接続",
                    "INTERNET" to "地図タイル・逆ジオコーディングの通信"
                ).forEach { (perm, desc) ->
                    Column(modifier = Modifier.padding(top = 4.dp)) {
                        Text(
                            perm,
                            style      = MaterialTheme.typography.bodySmall,
                            fontWeight = FontWeight.SemiBold,
                            color      = MaterialTheme.colorScheme.primary
                        )
                        Text(desc, style = MaterialTheme.typography.bodySmall,
                            color = MaterialTheme.colorScheme.onSurface)
                    }
                }
                Spacer(Modifier.height(4.dp))
                Text(
                    "各権限は上記目的以外には使用しません。Android 端末の設定画面からいつでも変更できます。",
                    style = MaterialTheme.typography.bodyMedium
                )
            }

            // ── 4. 第三者提供 ─────────────────────────────────────────────
            PolicySection(title = "4. 個人情報の第三者提供") {
                Text(
                    "開発者は、ユーザーの個人情報を第三者に販売・提供・開示することはありません。" +
                    "ただし、法令に基づく開示請求があった場合はこの限りではありません。",
                    style = MaterialTheme.typography.bodyMedium
                )
            }

            // ── 5. データ管理 ─────────────────────────────────────────────
            PolicySection(title = "5. データの保管とセキュリティ") {
                Text(
                    "採集データ・写真・設定情報はすべて端末内にのみ保存されます。" +
                    "端末の紛失・盗難に備え、Android の画面ロック機能のご利用をお勧めします。" +
                    "開発者はユーザーの端末上のデータにアクセスする手段を持ちません。",
                    style = MaterialTheme.typography.bodyMedium
                )
            }

            // ── 6. 子どものプライバシー ───────────────────────────────────
            PolicySection(title = "6. 子どものプライバシー") {
                Text(
                    "本アプリは13歳未満の方を対象としていません。" +
                    "13歳未満の方から意図せず個人情報を収集した場合は、速やかに削除対応いたします。",
                    style = MaterialTheme.typography.bodyMedium
                )
            }

            // ── 7. ポリシーの変更 ─────────────────────────────────────────
            PolicySection(title = "7. プライバシーポリシーの変更") {
                Text(
                    "本ポリシーは必要に応じて更新される場合があります。" +
                    "重要な変更がある場合はアプリストアのページまたは本画面にてお知らせします。",
                    style = MaterialTheme.typography.bodyMedium
                )
            }

            // ── 8. お問い合わせ ───────────────────────────────────────────
            PolicySection(title = "8. お問い合わせ") {
                Text(
                    "本プライバシーポリシーに関するご質問・ご意見は下記までお問い合わせください。",
                    style = MaterialTheme.typography.bodyMedium
                )
                Spacer(Modifier.height(4.dp))
                Surface(
                    shape = MaterialTheme.shapes.small,
                    tonalElevation = 2.dp,
                    modifier = Modifier.fillMaxWidth()
                ) {
                    Column(
                        modifier = Modifier.padding(horizontal = 14.dp, vertical = 10.dp),
                        verticalArrangement = Arrangement.spacedBy(2.dp)
                    ) {
                        Text(
                            "開発者：Joe Kutsukake",
                            style = MaterialTheme.typography.bodyMedium,
                            fontWeight = FontWeight.SemiBold
                        )
                        Text(
                            "メール：kutu92xjoo@gmail.com",
                            style = MaterialTheme.typography.bodyMedium,
                            color = MaterialTheme.colorScheme.primary
                        )
                    }
                }
            }

            Spacer(Modifier.height(8.dp))
            Text(
                "© 2026 Joe Kutsukake",
                style = MaterialTheme.typography.bodySmall,
                color = MaterialTheme.colorScheme.outline
            )
            Spacer(Modifier.height(16.dp))
        }
    }
}

// ── ヘルパーコンポーザブル ─────────────────────────────────────────────────────

@Composable
private fun PolicySection(
    title:   String,
    content: @Composable ColumnScope.() -> Unit
) {
    Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
        Text(
            text       = title,
            style      = MaterialTheme.typography.titleSmall,
            fontWeight = FontWeight.Bold,
            color      = MaterialTheme.colorScheme.primary
        )
        content()
    }
    HorizontalDivider(color = MaterialTheme.colorScheme.outlineVariant)
}

@Composable
private fun PolicyItem(heading: String, body: String) {
    Column(
        modifier            = Modifier.padding(top = 2.dp),
        verticalArrangement = Arrangement.spacedBy(2.dp)
    ) {
        Text(
            heading,
            style      = MaterialTheme.typography.bodyMedium,
            fontWeight = FontWeight.SemiBold
        )
        Text(
            body,
            style = MaterialTheme.typography.bodyMedium,
            color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.85f)
        )
    }
}
