import Foundation
import Postbox

func addSynchronizeChatInputStateOperation(transaction: Transaction, peerId: PeerId, threadId: Int64?) {
    var removeLocalIndices: [Int32] = []
    let tag: PeerOperationLogTag = OperationLogTags.SynchronizeChatInputStates
    
    var previousOperation: SynchronizeChatInputStateOperation?
    transaction.operationLogEnumerateEntries(peerId: peerId, tag: tag, { entry in
        if let operation = entry.contents as? SynchronizeChatInputStateOperation {
            if operation.threadId == threadId {
                previousOperation = operation
                removeLocalIndices.append(entry.tagLocalIndex)
                return false
            }
        } else {
            removeLocalIndices.append(entry.tagLocalIndex)
        }
        return true
    })
    var previousState: SynchronizeableChatInputState?
    if let previousOperation = previousOperation {
        previousState = previousOperation.previousState
    } else {
        let peerChatInterfaceState: StoredPeerChatInterfaceState?
        if let threadId = threadId {
            peerChatInterfaceState = transaction.getPeerChatThreadInterfaceState(peerId, threadId: threadId)
        } else {
            peerChatInterfaceState = transaction.getPeerChatInterfaceState(peerId)
        }
        
        if let peerChatInterfaceState = peerChatInterfaceState, let data = peerChatInterfaceState.data {
            previousState = (try? AdaptedPostboxDecoder().decode(InternalChatInterfaceState.self, from: data))?.synchronizeableInputState
        }
    }
    let operationContents = SynchronizeChatInputStateOperation(previousState: previousState, threadId: threadId)
    for index in removeLocalIndices {
        let _ = transaction.operationLogRemoveEntry(peerId: peerId, tag: tag, tagLocalIndex: index)
    }
    transaction.operationLogAddEntry(peerId: peerId, tag: tag, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: operationContents)
}