package com.rosetta.messenger.ui.utils

import android.content.Context
import android.graphics.Color
import android.os.Build
import android.view.View
import android.view.Window
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

/**
 * Утилита для определения типа системной навигации.
 *
 * Android поддерживает 3 режима:
 * - 0 = 3-button navigation (нативные кнопки: Back, Home, Recents)
 * - 1 = 2-button navigation (кнопка Home + жест назад)
 * - 2 = Gesture navigation (полностью жестовая навигация, без кнопок)
 *
 * Если у устройства gesture navigation (2), нижний navigation bar прячем.
 * Если у устройства кнопочная навигация (0 или 1), показываем navigation bar.
 */
object NavigationModeUtils {

    private const val NAV_MODE_THREE_BUTTON = 0
    private const val NAV_MODE_TWO_BUTTON = 1
    private const val NAV_MODE_GESTURE = 2

    /**
     * Возвращает текущий режим навигации.
     * 0 = 3-button, 1 = 2-button, 2 = gesture
     */
    fun getNavigationMode(context: Context): Int {
        return try {
            val resId = context.resources.getIdentifier(
                "config_navBarInteractionMode", "integer", "android"
            )
            if (resId > 0) context.resources.getInteger(resId) else NAV_MODE_THREE_BUTTON
        } catch (_: Exception) {
            NAV_MODE_THREE_BUTTON
        }
    }

    /**
     * true если устройство использует жестовую навигацию (без нативных кнопок внизу)
     */
    fun isGestureNavigation(context: Context): Boolean {
        return getNavigationMode(context) == NAV_MODE_GESTURE
    }

    /**
     * true если у устройства есть нативная панель навигации (3 или 2 кнопки)
     */
    fun hasNativeNavigationBar(context: Context): Boolean {
        return !isGestureNavigation(context)
    }

    /**
     * Показывает navigation bar на всех устройствах.
     */
    fun applyNavigationBarVisibility(
        window: Window,
        insetsController: WindowInsetsControllerCompat,
        context: Context,
        isDarkTheme: Boolean
    ) {
        val gestureNavigation = isGestureNavigation(context)
        val decorView = window.decorView

        insetsController.show(WindowInsetsCompat.Type.navigationBars())
        if (gestureNavigation) {
            // In gesture mode we keep a transparent nav bar and fixed white handle.
            // This avoids the "jump" effect during theme switching.
            window.navigationBarColor = Color.TRANSPARENT
            insetsController.isAppearanceLightNavigationBars = false
            val newFlags =
                decorView.systemUiVisibility or
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            if (newFlags != decorView.systemUiVisibility) {
                decorView.systemUiVisibility = newFlags
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                window.isNavigationBarContrastEnforced = false
            }
        } else {
            val targetColor = if (isDarkTheme) 0xFF1E1E1E.toInt() else 0xFFFFFFFF.toInt()
            val currentColor = window.navigationBarColor
            if (currentColor != targetColor) {
                val animator = android.animation.ValueAnimator.ofArgb(currentColor, targetColor)
                animator.duration = 350
                animator.addUpdateListener { window.navigationBarColor = it.animatedValue as Int }
                animator.start()
            }
            insetsController.isAppearanceLightNavigationBars = !isDarkTheme
            val newFlags =
                decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION.inv()
            if (newFlags != decorView.systemUiVisibility) {
                decorView.systemUiVisibility = newFlags
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                window.isNavigationBarContrastEnforced = true
            }
        }
    }
}

/**
 * Composable-хелпер: запоминает, использует ли устройство жестовую навигацию.
 */
@Composable
fun rememberIsGestureNavigation(): Boolean {
    val context = LocalContext.current
    return remember { NavigationModeUtils.isGestureNavigation(context) }
}

/**
 * Composable-хелпер: запоминает, есть ли нативная навигационная панель.
 */
@Composable
fun rememberHasNativeNavigationBar(): Boolean {
    val context = LocalContext.current
    return remember { NavigationModeUtils.hasNativeNavigationBar(context) }
}
