//
//  Clamp.swift
//  Adwaita
//
//  Created by david-swift on 12.10.23.
//

import Libadwaita

/// A horizontal AdwClamp equivalent.
struct Clamp: Widget {

    /// The content.
    var content: View
    /// The maximum size.
    var maxSize: Int

    /// Update a view storage.
    /// - Parameters:
    ///     - storage: The view storage.
    ///     - modifiers: Modify views before being updated.
    func update(_ storage: ViewStorage, modifiers: [(View) -> View]) {
        if let clamp = storage.view as? Libadwaita.Clamp {
            _ = clamp.maximumSize(maxSize)
        }
        if let storage = storage.content[.mainContent]?[safe: 0] {
            content.widget(modifiers: modifiers).update(storage, modifiers: modifiers)
        }
    }

    /// Get a view storage.
    /// - Parameter modifiers: Modify views before being updated.
    /// - Returns: The view storage.
    func container(modifiers: [(View) -> View]) -> ViewStorage {
        let container = content.storage(modifiers: modifiers)
        let clamp: Libadwaita.Clamp = .init(container.view)
        _ = clamp.maximumSize(maxSize)
        return .init(clamp, content: [.mainContent: [container]])
    }

}

extension View {

    /// Set the view's maximal size.
    /// - Parameter maxSize: The maximal size.
    /// - Returns: A view.
    public func frame(maxSize: Int? = nil) -> View {
        Clamp(content: self, maxSize: maxSize ?? -1)
    }

}
