package app.rosette.android.ui.keyboard

import android.os.Handler
import android.os.Looper
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.unit.Dp
import androidx.compose.ui.unit.dp

/**
 * Координатор переходов между системной клавиатурой и emoji панелью. Реализует Telegram-style
 * плавные анимации.
 *
 * Ключевые принципы:
 * - 250ms duration (как в Telegram AdjustPanLayoutHelper)
 * - Немедленное резервирование места
 * - TranslationY анимации вместо show/hide
 * - Синхронизация всех переходов
 */
class KeyboardTransitionCoordinator {

    companion object {
        const val TRANSITION_DURATION = 250L
        const val SHORT_DELAY = 50L
        private const val TAG = "KeyboardTransition"
    }

    // ============ Состояния переходов ============

    enum class TransitionState {
        IDLE, // Ничего не происходит
        KEYBOARD_TO_EMOJI, // Keyboard → Emoji
        EMOJI_TO_KEYBOARD, // Emoji → Keyboard
        KEYBOARD_OPENING, // Только keyboard открывается
        EMOJI_OPENING, // Только emoji открывается
        KEYBOARD_CLOSING, // Только keyboard закрывается
        EMOJI_CLOSING // Только emoji закрывается
    }

    // ============ Основное состояние ============

    var currentState by mutableStateOf(TransitionState.IDLE)
        private set

    // ============ Высоты ============

    var keyboardHeight by mutableStateOf(0.dp)
    var emojiHeight by mutableStateOf(0.dp)

    // Максимальная высота клавиатуры (защищает от промежуточных значений при анимации закрытия)
    private var maxKeyboardHeight by mutableStateOf(0.dp)

    // ============ Флаги видимости ============

    var isKeyboardVisible by mutableStateOf(false)
    var isEmojiVisible by mutableStateOf(false)
    var isTransitioning by mutableStateOf(false)
        private set

    // 🔥 Показывается ли сейчас Box с эмодзи (включая анимацию fade-out)
    // Используется для отключения imePadding пока Box виден
    var isEmojiBoxVisible by mutableStateOf(false)

    // 📊 Для умного логирования (не каждый фрейм)
    private var lastLogTime = 0L
    private var lastLoggedHeight = -1f
    /**
     * Переход от системной клавиатуры к emoji панели.
     *
     * 🔥 КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: Показываем emoji СРАЗУ! Не ждем закрытия клавиатуры - emoji начинает
     * выезжать синхронно.
     */
    fun requestShowEmoji(hideKeyboard: () -> Unit, showEmoji: () -> Unit) {
        currentState = TransitionState.KEYBOARD_TO_EMOJI
        isTransitioning = true

        // Устанавливаем emojiHeight = текущая высота клавиатуры (клавиатура ещё открыта)
        if (keyboardHeight > 0.dp) {
            emojiHeight = keyboardHeight
        } else if (maxKeyboardHeight > 0.dp) {
            emojiHeight = maxKeyboardHeight
        }

        // 🔥 КРИТИЧНО: Устанавливаем isEmojiBoxVisible СРАЗУ, ДО showEmoji()!
        // Это отключает imePadding на ПЕРВОМ же рендере, предотвращая "прыжок"
        isEmojiBoxVisible = true

        // 🔥 ПОКАЗЫВАЕМ EMOJI СРАЗУ! Не ждем закрытия клавиатуры
        showEmoji()
        isEmojiVisible = true // 🔥 ВАЖНО: Устанавливаем флаг видимости emoji!

        // Теперь скрываем клавиатуру (она будет закрываться синхронно с появлением emoji)
        try {
            hideKeyboard()
        } catch (e: Exception) {}

        isKeyboardVisible = false
        currentState = TransitionState.IDLE
        isTransitioning = false

    }

    // ============ Главный метод: Emoji → Keyboard ============

    /**
     * Переход от emoji панели к системной клавиатуре. Telegram паттерн: показать клавиатуру и
     * плавно скрыть emoji.
     */
    fun requestShowKeyboard(showKeyboard: () -> Unit, hideEmoji: () -> Unit) {
        currentState = TransitionState.EMOJI_TO_KEYBOARD
        isTransitioning = true

        // Шаг 1: Показать системную клавиатуру
        try {
            showKeyboard()
        } catch (e: Exception) {}

        // Шаг 2: Через небольшую задержку скрыть emoji
        Handler(Looper.getMainLooper())
                .postDelayed(
                        {
                            try {
                                hideEmoji()
                                isEmojiVisible = false
                                isKeyboardVisible = true

                                // Через время анимации завершаем переход
                                Handler(Looper.getMainLooper())
                                        .postDelayed(
                                                {
                                                    currentState = TransitionState.IDLE
                                                    isTransitioning = false
                                                },
                                                TRANSITION_DURATION
                                        )
                            } catch (e: Exception) {
                                currentState = TransitionState.IDLE
                                isTransitioning = false
                            }
                        },
                        SHORT_DELAY
                )
    }

    // ============ Простые переходы ============

    /** Открыть только emoji панель (без клавиатуры). */
    fun openEmojiOnly(showEmoji: () -> Unit) {
        currentState = TransitionState.EMOJI_OPENING
        isTransitioning = true

        // Установить высоту emoji равной сохраненной высоте клавиатуры
        if (emojiHeight == 0.dp && keyboardHeight > 0.dp) {
            emojiHeight = keyboardHeight
        }

        showEmoji()
        isEmojiVisible = true

        Handler(Looper.getMainLooper())
                .postDelayed(
                        {
                            currentState = TransitionState.IDLE
                            isTransitioning = false
                        },
                        TRANSITION_DURATION
                )
    }

    /** Закрыть emoji панель. */
    fun closeEmoji(hideEmoji: () -> Unit) {
        currentState = TransitionState.EMOJI_CLOSING
        isTransitioning = true

        hideEmoji()
        isEmojiVisible = false

        Handler(Looper.getMainLooper())
                .postDelayed(
                        {
                            currentState = TransitionState.IDLE
                            isTransitioning = false
                        },
                        TRANSITION_DURATION
                )
    }

    /** Закрыть системную клавиатуру. */
    fun closeKeyboard(hideKeyboard: () -> Unit) {
        currentState = TransitionState.KEYBOARD_CLOSING
        isTransitioning = true

        hideKeyboard()
        isKeyboardVisible = false

        Handler(Looper.getMainLooper())
                .postDelayed(
                        {
                            currentState = TransitionState.IDLE
                            isTransitioning = false
                        },
                        TRANSITION_DURATION
                )
    }

    // ============ Вспомогательные методы ============

    /** Обновить высоту клавиатуры из IME. */
    fun updateKeyboardHeight(height: Dp) {
        val now = System.currentTimeMillis()
        val heightChanged = kotlin.math.abs(height.value - lastLoggedHeight) > 5f

        // Логируем раз в 50ms ИЛИ при значительном изменении высоты (>5dp)
        if (heightChanged && (now - lastLogTime > 50 || lastLoggedHeight < 0)) {
            lastLogTime = now
            lastLoggedHeight = height.value
        }

        if (height > 100.dp && height != keyboardHeight) {
            keyboardHeight = height

            // Обновляем maxKeyboardHeight только вверх (защита от промежуточных значений анимации)
            if (height > maxKeyboardHeight) {
                maxKeyboardHeight = height
            }

            // Если emoji высота не установлена, синхронизировать
            if (emojiHeight == 0.dp) {
                emojiHeight = height
            }
        } else if (height == 0.dp && keyboardHeight != 0.dp) {
            // Клавиатура закрывается.
            // Если emoji уже показан (keyboard→emoji переход), НЕ трогаем emojiHeight —
            // requestShowEmoji() уже установил правильное значение = текущая высота клавиатуры.
            // Восстанавливаем из maxKeyboardHeight только если emoji НЕ виден (обычное закрытие).
            if (!isEmojiVisible && !isEmojiBoxVisible && maxKeyboardHeight > 0.dp) {
                emojiHeight = maxKeyboardHeight
            }

            keyboardHeight = 0.dp
        }

        // 🔥 УБРАН pending callback - теперь emoji показывается сразу в requestShowEmoji()
    }

    /**
     * Синхронизировать высоты (emoji = keyboard).
     *
     * 🔥 ВАЖНО: Синхронизируем ТОЛЬКО когда клавиатура ОТКРЫВАЕТСЯ! При закрытии клавиатуры
     * emojiHeight должна оставаться фиксированной!
     */
    fun syncHeights() {
        // Синхронизируем только вверх — при закрытии клавиатуры промежуточные значения
        // не должны уменьшать emojiHeight. Точная высота ставится в requestShowEmoji().
        if (keyboardHeight > 100.dp && keyboardHeight > emojiHeight) {
            emojiHeight = keyboardHeight
        }
    }

    /**
     * Инициализация высоты emoji панели (для pre-rendered подхода). Должна быть вызвана при старте
     * для избежания 0dp высоты.
     */
    fun initializeEmojiHeight(height: Dp) {
        if (emojiHeight == 0.dp && height > 0.dp) {
            emojiHeight = height
            maxKeyboardHeight = height
        }
    }

}

/** Composable для создания и запоминания coordinator'а. */
@Composable
fun rememberKeyboardTransitionCoordinator(): KeyboardTransitionCoordinator {
    return remember { KeyboardTransitionCoordinator() }
}
