package com.rosetta.messenger.utils

import java.util.concurrent.ConcurrentHashMap

/**
 * Глобальный менеджер throttle для отправки сообщений
 * Предотвращает дублирование при быстром нажатии на кнопку отправки
 *
 * 🔥 КРИТИЧНО: Singleton обеспечивает app-wide throttle,
 * в отличие от per-ViewModel throttle который обходится при навигации между чатами
 */
object MessageThrottleManager {

    // Время последней отправки для каждого диалога
    private val sendTimes = ConcurrentHashMap<String, Long>()

    // Минимальный интервал между отправками в одном диалоге (мс)
    private const val THROTTLE_MS = 100L

    // Дополнительный throttle для повторной отправки одинакового контента
    private val lastContentHashes = ConcurrentHashMap<String, Int>()
    private const val CONTENT_THROTTLE_MS = 500L

    /**
     * Проверяет, можно ли отправить сообщение в указанный диалог
     * @param dialogKey уникальный ключ диалога
     * @return true если отправка разрешена, false если нужно подождать
     */
    fun canSend(dialogKey: String): Boolean {
        val now = System.currentTimeMillis()
        val lastTime = sendTimes[dialogKey] ?: 0L

        if (now - lastTime < THROTTLE_MS) {
            MessageLogger.debug("⏱️ THROTTLE: Message blocked for $dialogKey (${now - lastTime}ms < ${THROTTLE_MS}ms)")
            return false
        }

        sendTimes[dialogKey] = now
        return true
    }

    /**
     * Проверяет throttle с учётом содержимого сообщения
     * Предотвращает отправку идентичных сообщений подряд
     *
     * @param dialogKey уникальный ключ диалога
     * @param contentHash хэш содержимого сообщения (text.hashCode())
     * @return true если отправка разрешена
     */
    fun canSendWithContent(dialogKey: String, contentHash: Int): Boolean {
        if (!canSend(dialogKey)) return false

        val now = System.currentTimeMillis()
        val key = "$dialogKey:$contentHash"
        val lastTime = sendTimes[key] ?: 0L

        // Блокируем отправку идентичного контента в течение CONTENT_THROTTLE_MS
        if (now - lastTime < CONTENT_THROTTLE_MS) {
            MessageLogger.debug("⏱️ CONTENT THROTTLE: Duplicate content blocked for $dialogKey")
            return false
        }

        sendTimes[key] = now
        return true
    }

    /**
     * Очистка всех throttle данных (вызывается при logout)
     */
    fun clear() {
        sendTimes.clear()
        lastContentHashes.clear()
    }
}
