import Foundation

final class MutableTimestampBasedMessageAttributesView {
    let tag: UInt16
    var head: TimestampBasedMessageAttributesEntry?
    
    init(tag: UInt16, getHead: (UInt16) -> TimestampBasedMessageAttributesEntry?) {
        self.tag = tag
        self.head = getHead(tag)
    }
    
    func replay(operations: [TimestampBasedMessageAttributesOperation], getHead: (UInt16) -> TimestampBasedMessageAttributesEntry?) -> Bool {
        var updated = false
        var invalidatedHead = false
        for operation in operations {
            switch operation {
                case let .add(entry):
                    if entry.tag == self.tag {
                        if let head = self.head {
                            if entry.index < head.index {
                                self.head = entry
                                updated = true
                            }
                        } else {
                            self.head = entry
                            updated = true
                        }
                    }
                case let .remove(entry):
                    if entry.tag == self.tag {
                        if let head = self.head, head.index == entry.index {
                            self.head = nil
                            updated = true
                            invalidatedHead = true
                        }
                    }
            }
        }
        if invalidatedHead {
            self.head = getHead(self.tag)
        }
        return updated
    }
}

public final class TimestampBasedMessageAttributesView {
    public let head: TimestampBasedMessageAttributesEntry?
    
    init(_ view: MutableTimestampBasedMessageAttributesView) {
        self.head = view.head
    }
}