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.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.material.icons.Icons
import androidx.compose.material.icons.outlined.Campaign
import androidx.compose.material.icons.outlined.ChatBubbleOutline
import androidx.compose.material.icons.outlined.Groups
import androidx.compose.material.icons.outlined.Notifications
import androidx.compose.material.icons.outlined.PersonOutline
import androidx.compose.material.icons.outlined.Phone
import androidx.compose.material.icons.outlined.Schedule
import androidx.compose.material.icons.outlined.VolumeUp
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.seven.ikar.kotlin.core.push.NotificationPreferenceCatalog
import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalChoice
import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalOption
import com.seven.ikar.kotlin.core.push.NotificationSettingsSnapshot
import com.seven.ikar.kotlin.core.push.NotificationSoundChoice
import com.seven.ikar.kotlin.core.push.NotificationSoundOption
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.TelegramDanger
import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted

@Composable
fun NotificationSettingsScreen(
    state: NotificationSettingsUiState,
    messageSoundOptions: List<NotificationSoundChoice>,
    callRingtoneOptions: List<NotificationSoundChoice>,
    repeatIntervalOptions: List<NotificationRepeatIntervalChoice>,
    onBackClick: () -> Unit,
    onSnapshotChanged: (NotificationSettingsSnapshot) -> Unit,
    onMessageSoundChanged: (NotificationSoundOption) -> Unit,
    onCallRingtoneChanged: (NotificationSoundOption) -> Unit,
    onRepeatIntervalChanged: (NotificationRepeatIntervalOption) -> Unit,
    onSaveClick: () -> Unit,
    onResetClick: () -> Unit
) {
    val snapshot = state.snapshot

    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)

            NotificationSection {
                IkarSectionTitle("Уведомления из чатов", modifier = Modifier.padding(bottom = 12.dp))
                IkarToggleRow("Личные чаты", "Нажмите для изменения", snapshot.privateChatsEnabled, { onSnapshotChanged(snapshot.copy(privateChatsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.PersonOutline, contentDescription = null, tint = TelegramInkMuted) })
                IkarRowDivider(startIndent = 32.dp)
                IkarToggleRow("Группы", "Нажмите для изменения", snapshot.groupsEnabled, { onSnapshotChanged(snapshot.copy(groupsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Groups, contentDescription = null, tint = TelegramInkMuted) })
                IkarRowDivider(startIndent = 32.dp)
                IkarToggleRow("Каналы", "Нажмите для изменения", snapshot.channelsEnabled, { onSnapshotChanged(snapshot.copy(channelsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Campaign, contentDescription = null, tint = TelegramInkMuted) })
                IkarRowDivider(startIndent = 32.dp)
                IkarToggleRow("Истории", "Отключены, 5 автоматических...", snapshot.storiesEnabled, { onSnapshotChanged(snapshot.copy(storiesEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Schedule, contentDescription = null, tint = TelegramInkMuted) })
                IkarRowDivider(startIndent = 32.dp)
                IkarToggleRow("Реакции", "Сообщения, Истории", snapshot.reactionsEnabled, { onSnapshotChanged(snapshot.copy(reactionsEnabled = it)) }, leading = { Text("♥", color = TelegramBlue, style = MaterialTheme.typography.titleMedium) })
            }

            NotificationSection {
                IkarSectionTitle("Звонки", modifier = Modifier.padding(bottom = 12.dp))
                IkarValueRow(
                    title = "Вибросигнал",
                    subtitle = "Переключить режим вибрации при звонке",
                    value = if (snapshot.callVibrationEnabled) "По умолчанию" else "Выключен",
                    onClick = { onSnapshotChanged(snapshot.copy(callVibrationEnabled = !snapshot.callVibrationEnabled)) },
                    leading = { androidx.compose.material3.Icon(Icons.Outlined.Phone, contentDescription = null, tint = TelegramInkMuted) }
                )
                IkarRowDivider(startIndent = 0.dp)
                IkarValueRow(
                    title = "Рингтон",
                    subtitle = "Системный звук входящего звонка в Икар",
                    value = callRingtoneOptions.firstOrNull { it.value == snapshot.callRingtone }?.title ?: "По умолчанию",
                    onClick = {
                        val currentIndex = callRingtoneOptions.indexOfFirst { it.value == snapshot.callRingtone }.coerceAtLeast(0)
                        val next = callRingtoneOptions[(currentIndex + 1) % callRingtoneOptions.size]
                        onCallRingtoneChanged(next.value)
                    },
                    leading = { androidx.compose.material3.Icon(Icons.Outlined.VolumeUp, contentDescription = null, tint = TelegramInkMuted) }
                )
            }

            NotificationSection {
                IkarSectionTitle("Счётчик сообщений", modifier = Modifier.padding(bottom = 12.dp))
                IkarToggleRow("Показывать счётчик", "Разрешать значок-счётчик на иконке приложения", snapshot.showBadge, { onSnapshotChanged(snapshot.copy(showBadge = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Чаты без уведомлений", "Показывать muted-чаты внутри общего счётчика", snapshot.includeMutedChatsInBadge, { onSnapshotChanged(snapshot.copy(includeMutedChatsInBadge = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Число сообщений", "Показывать количество непрочитанных сообщений", snapshot.countMessagesInBadge, { onSnapshotChanged(snapshot.copy(countMessagesInBadge = it)) })
            }

            NotificationSection {
                IkarSectionTitle("В приложении", modifier = Modifier.padding(bottom = 12.dp))
                IkarToggleRow("Звук", "Проигрывать звук для всплывающих уведомлений", snapshot.inAppSoundEnabled, { onSnapshotChanged(snapshot.copy(inAppSoundEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Вибросигнал", "Вибрировать для in-app уведомлений", snapshot.inAppVibrationEnabled, { onSnapshotChanged(snapshot.copy(inAppVibrationEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Показывать текст", "Показывать содержимое сообщения во всплывающем окне", snapshot.inAppShowTextEnabled, { onSnapshotChanged(snapshot.copy(inAppShowTextEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Звук в чате", "Короткий сигнал для уже открытого чата", snapshot.soundInActiveChatEnabled, { onSnapshotChanged(snapshot.copy(soundInActiveChatEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Всплывающие окна", "Показывать всплывающие окна, когда приложение открыто", snapshot.popupWindowsEnabled, { onSnapshotChanged(snapshot.copy(popupWindowsEnabled = it)) })
            }

            NotificationSection {
                IkarSectionTitle("События", modifier = Modifier.padding(bottom = 12.dp))
                IkarToggleRow("Контакт присоединился к Ikar", "Сообщать, когда контакт появился в Ikar", snapshot.contactJoinedEnabled, { onSnapshotChanged(snapshot.copy(contactJoinedEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Закреплённые сообщения", "Показывать уведомления о закреплённых сообщениях", snapshot.pinnedMessagesEnabled, { onSnapshotChanged(snapshot.copy(pinnedMessagesEnabled = it)) })
            }

            NotificationSection {
                IkarSectionTitle("Другое", modifier = Modifier.padding(bottom = 12.dp))
                IkarToggleRow("Перезапуск при закрытии", "Поднимать фоновый сервис доставки уведомлений", snapshot.restartOnCloseEnabled, { onSnapshotChanged(snapshot.copy(restartOnCloseEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarToggleRow("Фоновое соединение", "Держать минимальное фоновое соединение", snapshot.backgroundConnectionEnabled, { onSnapshotChanged(snapshot.copy(backgroundConnectionEnabled = it)) })
                IkarRowDivider(startIndent = 0.dp)
                IkarValueRow(
                    title = "Повтор уведомлений",
                    subtitle = "Повторять уведомление, пока в чате есть непрочитанные сообщения",
                    value = repeatIntervalOptions.firstOrNull { it.value == snapshot.repeatInterval }?.title ?: "1 час",
                    onClick = {
                        val currentIndex = repeatIntervalOptions.indexOfFirst { it.value == snapshot.repeatInterval }.coerceAtLeast(0)
                        val next = repeatIntervalOptions[(currentIndex + 1) % repeatIntervalOptions.size]
                        onRepeatIntervalChanged(next.value)
                    }
                )
            }

            NotificationSection {
                IkarSectionTitle("Сброс", modifier = Modifier.padding(bottom = 12.dp))
                Text(
                    "Сбросить настройки уведомлений",
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(vertical = 4.dp)
                        .clickable(onClick = onResetClick),
                    style = MaterialTheme.typography.titleLarge
                )
                Text(
                    "Сбросить все особые настройки уведомлений для отдельных контактов, групп и каналов.",
                    style = MaterialTheme.typography.bodySmall,
                    color = TelegramInkMuted
                )
            }

            androidx.compose.material3.Button(onClick = onSaveClick, modifier = Modifier.fillMaxWidth()) {
                Text(if (state.isSaving) "Сохранение..." else "Сохранить")
            }

            state.errorMessage?.let {
                Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium)
            }
            state.infoMessage?.let {
                Text(it, color = TelegramBlue, style = MaterialTheme.typography.bodyMedium)
            }
        }
    }
}

@Composable
private fun NotificationSection(
    content: @Composable ColumnScope.() -> Unit
) {
    IkarSectionCard {
        Column(content = content)
    }
}
