package com.seven.ikar.kotlin.feature.settings

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.seven.ikar.kotlin.core.settings.AppLanguageMode
import com.seven.ikar.kotlin.core.settings.AppProxyType
import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot
import com.seven.ikar.kotlin.core.settings.AppThemeMode
import com.seven.ikar.kotlin.ui.IkarRowDivider
import com.seven.ikar.kotlin.ui.IkarScreenSurface
import com.seven.ikar.kotlin.ui.IkarSectionCard
import com.seven.ikar.kotlin.ui.IkarSectionTitle
import com.seven.ikar.kotlin.ui.IkarSimpleHeader
import com.seven.ikar.kotlin.ui.IkarToggleRow
import com.seven.ikar.kotlin.ui.IkarValueRow
import com.seven.ikar.kotlin.ui.theme.TelegramBlue
import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted

@Composable
fun PrivacySettingsV2Screen(
    onBackClick: () -> Unit,
    onBlockedUsersClick: () -> Unit,
    onExceptionsClick: () -> Unit
) {
    IkarScreenSurface(modifier = Modifier.fillMaxSize()) {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical))
                .verticalScroll(rememberScrollState())
                .padding(horizontal = 18.dp, vertical = 16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {
            IkarSimpleHeader(title = "Конфиденциальность", onBackClick = onBackClick)
            IkarSectionCard {
                IkarSectionTitle("Исключения", modifier = Modifier.padding(bottom = 12.dp))
                IkarValueRow("Заблокированные пользователи", "Список блокировок хранится в настройках конфиденциальности.", "Открыть", onClick = onBlockedUsersClick)
                IkarRowDivider(startIndent = 0.dp)
                IkarValueRow("Исключения приватности", "Списки «всегда разрешать» и «никогда не разрешать» для телефона, фото и историй.", "Открыть", onClick = onExceptionsClick)
            }
            IkarSectionCard {
                Text("Подключено к серверному контракту", style = MaterialTheme.typography.titleLarge, color = TelegramBlue)
                Text(
                    "Основные переключатели конфиденциальности и безопасности доступны через прежний экран; этот экран оставляет навигацию по подразделам как в Telegram.",
                    modifier = Modifier.padding(top = 6.dp),
                    style = MaterialTheme.typography.bodySmall,
                    color = TelegramInkMuted
                )
            }
        }
    }
}

@Composable
fun BlockedUsersPlaceholderScreen(onBackClick: () -> Unit) {
    SimpleSettingsInfoScreen(
        title = "Заблокированные",
        body = "Сервер уже хранит список заблокированных пользователей в настройках конфиденциальности. Следующий слой: выбор пользователя с поиском и быстрым снятием блокировки.",
        onBackClick = onBackClick
    )
}

@Composable
fun PrivacyExceptionsPlaceholderScreen(onBackClick: () -> Unit) {
    SimpleSettingsInfoScreen(
        title = "Исключения",
        body = "Контракт поддерживает списки разрешённых и запрещённых пользователей. Для полного интерфейса как в Telegram нужен выбор пользователей из контактов и отдельные правила для каждого поля.",
        onBackClick = onBackClick
    )
}

@Composable
fun ThemePlaceholderScreen(
    state: AppSettingsUiState,
    onBackClick: () -> Unit,
    onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit,
    onResetClick: () -> Unit
) {
    val snapshot = state.snapshot
    IkarSettingsScaffold(title = "Тема", onBackClick = onBackClick) {
        IkarSectionCard {
            IkarSectionTitle("Режим", modifier = Modifier.padding(bottom = 10.dp))
            AppThemeMode.entries.forEachIndexed { index, mode ->
                SelectableSettingsRow(
                    title = mode.themeTitle(),
                    subtitle = mode.themeSubtitle(),
                    selected = snapshot.themeMode == mode,
                    onClick = { onSnapshotChanged { it.copy(themeMode = mode) } }
                )
                if (index != AppThemeMode.entries.lastIndex) {
                    IkarRowDivider(startIndent = 0.dp)
                }
            }
        }
        IkarSectionCard {
            IkarSectionTitle("Оформление", modifier = Modifier.padding(bottom = 10.dp))
            IkarValueRow(
                "Акцент",
                "Быстрый выбор фирменного цвета.",
                accentColorTitle(snapshot.accentColorName),
                onClick = { onSnapshotChanged { it.copy(accentColorName = nextAccent(it.accentColorName)) } }
            )
            IkarRowDivider(startIndent = 0.dp)
            IkarToggleRow(
                "Анимированные фоны",
                "Живые градиенты в чатах как в Telegram.",
                snapshot.animatedBackgrounds,
                onCheckedChange = { value -> onSnapshotChanged { it.copy(animatedBackgrounds = value) } }
            )
            IkarRowDivider(startIndent = 0.dp)
            IkarToggleRow(
                "Крупные эмодзи",
                "Показывать одиночные эмодзи как большие стикеры.",
                snapshot.largeEmoji,
                onCheckedChange = { value -> onSnapshotChanged { it.copy(largeEmoji = value) } }
            )
        }
        Button(onClick = onResetClick, modifier = Modifier.fillMaxWidth()) {
            Text("Сбросить")
        }
    }
}

@Composable
fun LanguagePlaceholderScreen(
    state: AppSettingsUiState,
    onBackClick: () -> Unit,
    onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit
) {
    val snapshot = state.snapshot
    IkarSettingsScaffold(title = "Язык", onBackClick = onBackClick) {
        IkarSectionCard {
            IkarSectionTitle("Язык приложения", modifier = Modifier.padding(bottom = 10.dp))
            AppLanguageMode.entries.forEachIndexed { index, mode ->
                SelectableSettingsRow(
                    title = mode.languageTitle(),
                    subtitle = mode.languageSubtitle(),
                    selected = snapshot.languageMode == mode,
                    onClick = { onSnapshotChanged { it.copy(languageMode = mode) } }
                )
                if (index != AppLanguageMode.entries.lastIndex) {
                    IkarRowDivider(startIndent = 0.dp)
                }
            }
        }
        IkarSectionCard {
            Text("Локализация сохранена", style = MaterialTheme.typography.titleMedium, color = TelegramBlue)
            Text(
                "Значение уже хранится локально. Для полного эффекта нужно применить его в базовом контексте приложения или слое локали Compose.",
                modifier = Modifier.padding(top = 6.dp),
                style = MaterialTheme.typography.bodySmall,
                color = TelegramInkMuted
            )
        }
    }
}

@Composable
fun ProxyPlaceholderScreen(
    state: AppSettingsUiState,
    onBackClick: () -> Unit,
    onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit
) {
    val snapshot = state.snapshot
    IkarSettingsScaffold(title = "Прокси", onBackClick = onBackClick) {
        IkarSectionCard {
            IkarToggleRow(
                "Использовать прокси",
                "Профиль сохраняется локально и готов для подключения к OkHttp.",
                snapshot.proxyEnabled,
                onCheckedChange = { value -> onSnapshotChanged { it.copy(proxyEnabled = value) } }
            )
            IkarRowDivider(startIndent = 0.dp)
            IkarValueRow(
                "Тип",
                "SOCKS5, MTProto или HTTP.",
                snapshot.proxyType.proxyTypeTitle(),
                onClick = { onSnapshotChanged { it.copy(proxyType = nextProxyType(it.proxyType)) } }
            )
        }

        IkarSectionCard {
            IkarSectionTitle("Подключение", modifier = Modifier.padding(bottom = 10.dp))
            OutlinedTextField(
                value = snapshot.proxyHost,
                onValueChange = { value -> onSnapshotChanged { it.copy(proxyHost = value.take(120)) } },
                modifier = Modifier.fillMaxWidth(),
                singleLine = true,
                label = { Text("Хост") }
            )
            OutlinedTextField(
                value = snapshot.proxyPort.toString(),
                onValueChange = { value ->
                    value.filter { it.isDigit() }.toIntOrNull()?.let { port ->
                        onSnapshotChanged { it.copy(proxyPort = port) }
                    }
                },
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 10.dp),
                singleLine = true,
                label = { Text("Порт") }
            )
            OutlinedTextField(
                value = snapshot.proxySecret,
                onValueChange = { value -> onSnapshotChanged { it.copy(proxySecret = value.take(256)) } },
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 10.dp),
                singleLine = true,
                label = { Text("Секрет / пароль") }
            )
        }
    }
}

@Composable
private fun IkarSettingsScaffold(
    title: String,
    onBackClick: () -> Unit,
    content: @Composable ColumnScope.() -> Unit
) {
    IkarScreenSurface(modifier = Modifier.fillMaxSize()) {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical))
                .verticalScroll(rememberScrollState())
                .padding(horizontal = 18.dp, vertical = 16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {
            IkarSimpleHeader(title = title, onBackClick = onBackClick)
            content()
        }
    }
}

@Composable
private fun SelectableSettingsRow(
    title: String,
    subtitle: String,
    selected: Boolean,
    onClick: () -> Unit
) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .clickable(onClick = onClick)
            .padding(vertical = 12.dp),
        horizontalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        Surface(color = if (selected) TelegramBlue else Color(0xFFDDE7F0), shape = MaterialTheme.shapes.small) {
            Text(
                if (selected) "✓" else " ",
                modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
                color = Color.White,
                fontWeight = FontWeight.Bold
            )
        }
        Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) {
            Text(title, style = MaterialTheme.typography.titleMedium)
            Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted)
        }
    }
}

@Composable
private fun SimpleSettingsInfoScreen(
    title: String,
    body: String,
    onBackClick: () -> Unit
) {
    IkarSettingsScaffold(title = title, onBackClick = onBackClick) {
        IkarSectionCard {
            Text("Готова модель данных", style = MaterialTheme.typography.titleLarge, color = TelegramBlue)
            Text(
                body,
                modifier = Modifier.padding(top = 6.dp),
                style = MaterialTheme.typography.bodyMedium,
                color = TelegramInkMuted
            )
        }
    }
}

private fun AppThemeMode.themeTitle(): String = when (this) {
    AppThemeMode.System -> "Как в системе"
    AppThemeMode.Light -> "Дневная"
    AppThemeMode.Dark -> "Ночная"
    AppThemeMode.Auto -> "Авто-ночная"
}

private fun AppThemeMode.themeSubtitle(): String = when (this) {
    AppThemeMode.System -> "Следовать настройке Android."
    AppThemeMode.Light -> "Всегда светлая тема."
    AppThemeMode.Dark -> "Всегда темная тема."
    AppThemeMode.Auto -> "Переключать по времени суток."
}

private fun AppLanguageMode.languageTitle(): String = when (this) {
    AppLanguageMode.System -> "Как в системе"
    AppLanguageMode.Russian -> "Русский"
    AppLanguageMode.English -> "Английский"
}

private fun AppLanguageMode.languageSubtitle(): String = when (this) {
    AppLanguageMode.System -> "Использовать язык устройства."
    AppLanguageMode.Russian -> "Закрепить русский интерфейс."
    AppLanguageMode.English -> "Включить английский интерфейс."
}

private fun accentColorTitle(value: String): String = when (value) {
    "Telegram Blue" -> "Синий Telegram"
    "Mint" -> "Мятный"
    "Graphite" -> "Графит"
    "Amber" -> "Янтарный"
    else -> value
}

private fun nextAccent(current: String): String = when (current) {
    "Telegram Blue" -> "Mint"
    "Mint" -> "Graphite"
    "Graphite" -> "Amber"
    else -> "Telegram Blue"
}

private fun AppProxyType.proxyTypeTitle(): String = when (this) {
    AppProxyType.Socks5 -> "SOCKS5"
    AppProxyType.MtProto -> "MTProto"
    AppProxyType.Http -> "HTTP"
}

private fun nextProxyType(current: AppProxyType): AppProxyType = when (current) {
    AppProxyType.Socks5 -> AppProxyType.MtProto
    AppProxyType.MtProto -> AppProxyType.Http
    AppProxyType.Http -> AppProxyType.Socks5
}
