package app.rosette.android.ui.keyboard

import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp


/**
 * 🚀 Telegram-style: Fixed Height Box + Fade In/Out
 * 
 * Принцип как в Telegram:
 * 1. Box ВСЕГДА существует когда нужен (showEmojiPicker или анимация идёт)
 * 2. Box сразу занимает место = emojiHeight
 * 3. Контент появляется через fade (alpha animation)
 * 4. Клавиатура уезжает, а эмодзи уже на месте
 * 
 * Ключевое: Box показан когда showEmojiPicker ИЛИ alpha > 0 (анимация ещё идёт)
 */
@Composable
fun AnimatedKeyboardTransition(
    coordinator: KeyboardTransitionCoordinator,
    showEmojiPicker: Boolean,
    content: @Composable () -> Unit
) {
    val tag = "AnimatedTransition"
    
    // 🔥 Отслеживаем был ли emoji открыт (для определения перехода emoji→keyboard)
    var wasEmojiShown by remember { mutableStateOf(false) }
    var isTransitioningToKeyboard by remember { mutableStateOf(false) }
    
    // 📊 Последнее залогированное значение alpha (для фильтрации)
    val lastLoggedAlpha = remember { mutableStateOf(-1f) }
    
    // 🔥 Клавиатура достигла высоты почти равной emoji (разница < 2dp)
    // Это гарантирует плавный переход без прыжков и ререндеров
    val isKeyboardNearFullHeight = coordinator.emojiHeight > 0.dp &&
        coordinator.keyboardHeight >= coordinator.emojiHeight - 2.dp

    // Логика перехода
    if (showEmojiPicker && !wasEmojiShown) {
        wasEmojiShown = true
    }
    if (!showEmojiPicker && wasEmojiShown && !isTransitioningToKeyboard) {
        // Keep reserved space only if keyboard is actually opening.
        // For back-swipe/back-press close there is no keyboard open request,
        // so we must drop the emoji box immediately to avoid an empty gap.
        val keyboardIsComing =
            coordinator.currentState == KeyboardTransitionCoordinator.TransitionState.EMOJI_TO_KEYBOARD ||
                coordinator.isKeyboardVisible ||
                coordinator.keyboardHeight > 0.dp
        isTransitioningToKeyboard = keyboardIsComing
        if (!keyboardIsComing) {
            wasEmojiShown = false
        }
    }

    // 🔥 КЛЮЧЕВОЕ: Сбрасываем флаг когда клавиатура достигла высоты близкой к emoji
    // Это предотвращает прыжок инпута при переходе
    if (isKeyboardNearFullHeight && isTransitioningToKeyboard && !showEmojiPicker) {
        isTransitioningToKeyboard = false
        wasEmojiShown = false
    }

    // Failsafe for interrupted gesture/back navigation: if keyboard never started opening,
    // don't keep an invisible fixed-height box.
    if (
        isTransitioningToKeyboard &&
            !showEmojiPicker &&
            coordinator.currentState != KeyboardTransitionCoordinator.TransitionState.EMOJI_TO_KEYBOARD &&
            !coordinator.isKeyboardVisible &&
            coordinator.keyboardHeight == 0.dp
    ) {
        isTransitioningToKeyboard = false
        wasEmojiShown = false
    }
    
    // 🎯 Целевая прозрачность
    val targetAlpha = if (showEmojiPicker) 1f else 0f
    
    // 🎬 Анимация прозрачности
    val animatedAlpha by animateFloatAsState(
        targetValue = targetAlpha,
        animationSpec = tween(
            durationMillis = KeyboardTransitionCoordinator.TRANSITION_DURATION.toInt(),
            easing = FastOutSlowInEasing
        ),
        label = "emojiPanelAlpha"
    )
    
    // 🔥 Box показан когда:
    // 1. showEmojiPicker=true (emoji открыт), ИЛИ
    // 2. переход emoji→keyboard активен (ждём пока клавиатура полностью откроется)
    val shouldShowBox = showEmojiPicker || isTransitioningToKeyboard
    
    // 🔥 ВАЖНО: Обновляем состояние в координаторе для отключения imePadding
    coordinator.isEmojiBoxVisible = shouldShowBox
    
    // 📊 Умное логирование: только ключевые моменты (0%, 25%, 50%, 75%, 100%)
    val alphaPercent = (animatedAlpha * 100).toInt()
    val lastPercent = (lastLoggedAlpha.value * 100).toInt()
    val shouldLog = alphaPercent == 0 || alphaPercent == 25 || alphaPercent == 50 || 
                    alphaPercent == 75 || alphaPercent == 100 || 
                    (lastPercent != alphaPercent && (alphaPercent % 10 == 0))
    
    if (shouldLog && lastLoggedAlpha.value != animatedAlpha) {
        lastLoggedAlpha.value = animatedAlpha
    }
    
    if (shouldShowBox) {
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .height(coordinator.emojiHeight)
                .graphicsLayer {
                    // 🔥 GPU-ускоренная анимация прозрачности
                    alpha = animatedAlpha
                }
        ) {
            content()
        }
    }
}
