package com.example.godeye.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.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.example.godeye.utils.PreferenceManager
import com.example.godeye.utils.PermissionHelper

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(
    preferenceManager: PreferenceManager,
    permissionHelper: PermissionHelper,
    onNavigateBack: () -> Unit
) {
    val serverUrl by preferenceManager.serverUrl.collectAsStateWithLifecycle()
    val deviceName by preferenceManager.deviceName.collectAsStateWithLifecycle()
    val autoConnect by preferenceManager.autoConnect.collectAsStateWithLifecycle()
    val autoApprove by preferenceManager.autoApprove.collectAsStateWithLifecycle()

    var tempServerUrl by remember(serverUrl) { mutableStateOf(serverUrl) }
    var tempDeviceName by remember(deviceName) { mutableStateOf(deviceName) }
    var showPermissionDialog by remember { mutableStateOf(false) }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(rememberScrollState())
            .padding(16.dp),
        verticalArrangement = Arrangement.spacedBy(16.dp)
    ) {
        // Заголовок
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceBetween,
            verticalAlignment = Alignment.CenterVertically
        ) {
            Text(
                text = "Настройки",
                style = MaterialTheme.typography.headlineMedium,
                fontWeight = FontWeight.Bold
            )
            IconButton(onClick = onNavigateBack) {
                Icon(Icons.Default.Close, contentDescription = "Закрыть")
            }
        }

        HorizontalDivider()

        // Секция "Подключение к серверу"
        SettingsSection(title = "Подключение к серверу") {
            // URL сервера
            OutlinedTextField(
                value = tempServerUrl,
                onValueChange = { tempServerUrl = it },
                label = { Text("URL сервера") },
                placeholder = { Text("http://192.168.219.108:3001") },
                leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
                modifier = Modifier.fillMaxWidth(),
                singleLine = true
            )

            // Кнопка сохранения URL
            Button(
                onClick = {
                    if (tempServerUrl.isNotBlank()) {
                        preferenceManager.setServerUrl(tempServerUrl.trim())
                    }
                },
                modifier = Modifier.align(Alignment.End),
                enabled = tempServerUrl.trim() != serverUrl
            ) {
                Icon(Icons.Default.Done, contentDescription = null)
                Spacer(modifier = Modifier.width(8.dp))
                Text("Сохранить URL")
            }

            // Автоматическое подключение
            Card(
                modifier = Modifier.fillMaxWidth(),
                colors = CardDefaults.cardColors(
                    containerColor = MaterialTheme.colorScheme.surfaceVariant
                )
            ) {
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp),
                    horizontalArrangement = Arrangement.SpaceBetween,
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    Column(modifier = Modifier.weight(1f)) {
                        Text(
                            text = "Автоматическое подключение",
                            style = MaterialTheme.typography.titleMedium,
                            fontWeight = FontWeight.Medium
                        )
                        Text(
                            text = "Подключаться к серверу при запуске приложения",
                            style = MaterialTheme.typography.bodyMedium,
                            color = MaterialTheme.colorScheme.onSurfaceVariant
                        )
                    }
                    Switch(
                        checked = autoConnect,
                        onCheckedChange = { preferenceManager.setAutoConnect(it) }
                    )
                }
            }
        }

        // Секция "Устройство"
        SettingsSection(title = "Устройство") {
            // Имя устройства
            OutlinedTextField(
                value = tempDeviceName,
                onValueChange = { tempDeviceName = it },
                label = { Text("Имя устройства") },
                placeholder = { Text("Android Device") },
                leadingIcon = { Icon(Icons.Default.Phone, contentDescription = null) },
                modifier = Modifier.fillMaxWidth(),
                singleLine = true
            )

            // Кнопка сохранения имени
            Button(
                onClick = {
                    if (tempDeviceName.isNotBlank()) {
                        preferenceManager.setDeviceName(tempDeviceName.trim())
                    }
                },
                modifier = Modifier.align(Alignment.End),
                enabled = tempDeviceName.trim() != deviceName
            ) {
                Icon(Icons.Default.Done, contentDescription = null)
                Spacer(modifier = Modifier.width(8.dp))
                Text("Сохранить имя")
            }

            // ID устройства (только для чтения)
            OutlinedTextField(
                value = preferenceManager.getDeviceId(),
                onValueChange = { },
                label = { Text("ID устройства") },
                leadingIcon = { Icon(Icons.Default.Info, contentDescription = null) },
                modifier = Modifier.fillMaxWidth(),
                enabled = false,
                singleLine = true
            )
        }

        // Секция "Безопасность"
        SettingsSection(title = "Безопасность") {
            // Автоматическое подтверждение
            Card(
                modifier = Modifier.fillMaxWidth(),
                colors = CardDefaults.cardColors(
                    containerColor = if (autoApprove)
                        MaterialTheme.colorScheme.errorContainer
                    else
                        MaterialTheme.colorScheme.surfaceVariant
                )
            ) {
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp),
                    horizontalArrangement = Arrangement.SpaceBetween,
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    Column(modifier = Modifier.weight(1f)) {
                        Text(
                            text = "Автоматическое подтверждение",
                            style = MaterialTheme.typography.titleMedium,
                            fontWeight = FontWeight.Medium,
                            color = if (autoApprove)
                                MaterialTheme.colorScheme.onErrorContainer
                            else
                                MaterialTheme.colorScheme.onSurfaceVariant
                        )
                        Text(
                            text = if (autoApprove) "⚠️ Операторы получат доступ без подтверждения"
                                  else "Запрашивать подтверждение для каждого запроса",
                            style = MaterialTheme.typography.bodyMedium,
                            color = if (autoApprove)
                                MaterialTheme.colorScheme.onErrorContainer
                            else
                                MaterialTheme.colorScheme.onSurfaceVariant
                        )
                    }
                    Switch(
                        checked = autoApprove,
                        onCheckedChange = { preferenceManager.setAutoApprove(it) }
                    )
                }
            }
        }

        // Секция "Разрешения"
        SettingsSection(title = "Разрешения") {
            val hasAllPermissions = permissionHelper.hasAllPermissions()

            Card(
                modifier = Modifier.fillMaxWidth(),
                colors = CardDefaults.cardColors(
                    containerColor = if (hasAllPermissions)
                        MaterialTheme.colorScheme.primaryContainer
                    else
                        MaterialTheme.colorScheme.errorContainer
                )
            ) {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp),
                    verticalArrangement = Arrangement.spacedBy(12.dp)
                ) {
                    Row(
                        horizontalArrangement = Arrangement.spacedBy(8.dp),
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Icon(
                            if (hasAllPermissions) Icons.Default.CheckCircle else Icons.Default.Warning,
                            contentDescription = null,
                            tint = if (hasAllPermissions)
                                MaterialTheme.colorScheme.onPrimaryContainer
                            else
                                MaterialTheme.colorScheme.onErrorContainer
                        )
                        Text(
                            text = if (hasAllPermissions) "Все разрешения предоставлены" else "Требуются разрешения",
                            style = MaterialTheme.typography.titleMedium,
                            fontWeight = FontWeight.Medium,
                            color = if (hasAllPermissions)
                                MaterialTheme.colorScheme.onPrimaryContainer
                            else
                                MaterialTheme.colorScheme.onErrorContainer
                        )
                    }

                    // Список разрешений
                    PermissionHelper.REQUIRED_PERMISSIONS.forEach { permission ->
                        val hasPermission = permissionHelper.hasPermission(permission)
                        val permissionName = getPermissionDisplayName(permission)

                        Row(
                            horizontalArrangement = Arrangement.spacedBy(8.dp),
                            verticalAlignment = Alignment.CenterVertically
                        ) {
                            Icon(
                                if (hasPermission) Icons.Default.Check else Icons.Default.Close,
                                contentDescription = null,
                                tint = if (hasPermission)
                                    MaterialTheme.colorScheme.onPrimaryContainer
                                else
                                    MaterialTheme.colorScheme.onErrorContainer
                            )
                            Text(
                                text = permissionName,
                                style = MaterialTheme.typography.bodyMedium,
                                color = if (hasAllPermissions)
                                    MaterialTheme.colorScheme.onPrimaryContainer
                                else
                                    MaterialTheme.colorScheme.onErrorContainer
                            )
                        }
                    }

                    if (!hasAllPermissions) {
                        Button(
                            onClick = { showPermissionDialog = true },
                            modifier = Modifier.fillMaxWidth()
                        ) {
                            Icon(Icons.Default.Lock, contentDescription = null)
                            Spacer(modifier = Modifier.width(8.dp))
                            Text("Запросить разрешения")
                        }
                    }
                }
            }
        }
    }

    // Диалог запроса разрешений
    if (showPermissionDialog) {
        AlertDialog(
            onDismissRequest = { showPermissionDialog = false },
            title = { Text("Разрешения приложения") },
            text = {
                Text("Для корректной работы приложению необходимы разрешения на доступ к камере, микрофону и интернету.")
            },
            confirmButton = {
                TextButton(
                    onClick = {
                        showPermissionDialog = false
                        permissionHelper.requestPermissions { granted ->
                            // Результат обработается автоматически через recomposition
                        }
                    }
                ) {
                    Text("Предоставить")
                }
            },
            dismissButton = {
                TextButton(onClick = { showPermissionDialog = false }) {
                    Text("Отмена")
                }
            }
        )
    }
}

@Composable
private fun SettingsSection(
    title: String,
    content: @Composable ColumnScope.() -> Unit
) {
    Column(
        verticalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        Text(
            text = title,
            style = MaterialTheme.typography.titleLarge,
            fontWeight = FontWeight.SemiBold,
            color = MaterialTheme.colorScheme.primary
        )
        content()
    }
}

private fun getPermissionDisplayName(permission: String): String {
    return when (permission) {
        android.Manifest.permission.CAMERA -> "Камера"
        android.Manifest.permission.RECORD_AUDIO -> "Микрофон"
        android.Manifest.permission.INTERNET -> "Интернет"
        android.Manifest.permission.ACCESS_NETWORK_STATE -> "Состояние сети"
        android.Manifest.permission.WAKE_LOCK -> "Предотвращение блокировки"
        android.Manifest.permission.POST_NOTIFICATIONS -> "Уведомления"
        else -> permission.split(".").lastOrNull() ?: permission
    }
}
