import Foundation

final class MutableSynchronizePeerReadStatesView {
    var operations: [PeerId: PeerReadStateSynchronizationOperation]
    
    init(operations: [PeerId: PeerReadStateSynchronizationOperation]) {
        self.operations = operations
    }
    
    func refreshDueToExternalTransaction(fetchSynchronizePeerReadStateOperations: () -> [PeerId: PeerReadStateSynchronizationOperation]) -> Bool {
        let operations = fetchSynchronizePeerReadStateOperations()
        if self.operations != operations {
            self.operations = operations
            return true
        } else {
            return false
        }
    }
    
    func replay(_ updatedOperations: [PeerId: PeerReadStateSynchronizationOperation?]) -> Bool {
        var updated = false
        for (peerId, operation) in updatedOperations {
            if let operation = operation {
                if self.operations[peerId] == nil || self.operations[peerId]! != operation {
                    self.operations[peerId] = operation
                    updated = true
                }
            } else {
                if let _ = self.operations[peerId] {
                    let _ = self.operations.removeValue(forKey: peerId)
                    updated = true
                }
            }
        }
        
        return updated
    }
}

public final class SynchronizePeerReadStatesView {
    public let operations: [PeerId: PeerReadStateSynchronizationOperation]
    
    init(_ mutableView: MutableSynchronizePeerReadStatesView) {
        self.operations = mutableView.operations
    }
}