import Foundation
import UIKit
import Display

public final class ManagedAnimations {
    private var displayLinkSubscription: SharedDisplayLinkDriver.Link?
    
    private var properties: [AnyAnimatedProperty] = []
    
    public var updated: (() -> Void)?
    
    public init() {
    }
    
    public func add(property: AnyAnimatedProperty) {
        self.properties.append(property)
        property.didStartAnimation = { [weak self] in
            guard let self else {
                return
            }
            self.updateNeedAnimations()
        }
    }
    
    private func updateNeedAnimations() {
        if self.displayLinkSubscription == nil {
            self.displayLinkSubscription = SharedDisplayLinkDriver.shared.add { [weak self] _ in
                guard let self else {
                    return
                }
                self.update()
            }
        }
    }
    
    private func update() {
        var hasRunningAnimations = false
        for property in self.properties {
            property.update()
            if property.hasRunningAnimation {
                hasRunningAnimations = true
            }
        }
        
        if !hasRunningAnimations {
            self.displayLinkSubscription = nil
        }
        
        self.updated?()
    }
}