package com.radiola.ui.theme

import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color

/**
 * Расширенные токены, которых нет в Material ColorScheme.
 * Доступ через MaterialTheme-стиль: `RadiolaTheme.colors`.
 */
data class RadiolaColors(
    val bgBase: Color,
    val surface: Color,
    val surface2: Color,
    val elevated: Color,
    val accent: Color,
    val accentDim: Color,
    val textPrimary: Color,
    val textSecondary: Color,
    val textMuted: Color,
    val border: Color,
    val live: Color,
    val gradientStart: Color,
    val gradientEnd: Color,
) {
    val brandGradient: Brush
        get() = Brush.linearGradient(listOf(gradientStart, gradientEnd))
}

// По умолчанию — фирменная палитра «Лес».
val LocalRadiolaColors = staticCompositionLocalOf { ThemePalette.FOREST.colors }
// Текущая палитра целиком — чтобы лого/иконка выбирали свой перекрашенный вариант.
val LocalThemePalette = staticCompositionLocalOf { ThemePalette.FOREST }

object RadiolaTheme {
    val colors: RadiolaColors
        @Composable get() = LocalRadiolaColors.current
    val palette: ThemePalette
        @Composable get() = LocalThemePalette.current
}

// Material ColorScheme из наших токенов — чтобы Material-компоненты тоже следовали палитре.
private fun schemeOf(c: RadiolaColors) = darkColorScheme(
    primary = c.accent,
    onPrimary = c.bgBase,
    secondary = c.accentDim,
    onSecondary = c.bgBase,
    background = c.bgBase,
    onBackground = c.textPrimary,
    surface = c.surface,
    onSurface = c.textPrimary,
    surfaceVariant = c.surface2,
    onSurfaceVariant = c.textSecondary,
    outline = c.border,
    outlineVariant = c.border,
    error = c.live,
    onError = c.bgBase,
)

@Composable
fun RadiolaTheme(
    palette: ThemePalette = ThemePalette.FOREST,
    content: @Composable () -> Unit
) {
    // Приложение всегда тёмное; палитра выбирается пользователем.
    val colors = palette.colors
    CompositionLocalProvider(
        LocalRadiolaColors provides colors,
        LocalThemePalette provides palette
    ) {
        MaterialTheme(
            colorScheme = schemeOf(colors),
            typography = Typography,
            shapes = RadiolaShapes,
            content = content
        )
    }
}
