//
// Copyright 2025 Element Creations Ltd.
// Copyright 2023-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//

import SwiftUI

public extension View {
    /// Adds an equal padding amount to all edges of this view, scaled relative to the user's selected font size.
    func scaledPadding(_ length: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> some View {
        scaledPadding(.all, length, relativeTo: textStyle)
    }
    
    /// Adds an equal padding amount to specific edges of this view, scaled relative to the user's selected font size.
    func scaledPadding(_ edges: Edge.Set, _ length: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> some View {
        modifier(ScaledPaddingModifier(edges: edges, length: length, textStyle: textStyle))
    }
}

private struct ScaledPaddingModifier: ViewModifier {
    let edges: Edge.Set
    @ScaledMetric var length: CGFloat
    
    init(edges: Edge.Set, length: CGFloat, textStyle: Font.TextStyle) {
        self.edges = edges
        _length = ScaledMetric(wrappedValue: length, relativeTo: textStyle)
    }
    
    func body(content: Content) -> some View {
        content.padding(edges, length)
    }
}

// MARK: - Previews

struct ScaledPaddingModifier_Previews: PreviewProvider, TestablePreview {
    static var previews: some View {
        VStack(spacing: 8) {
            ForEach(DynamicTypeSize.allCases, id: \.self) { size in
                userProfileButtonLabel
                    .dynamicTypeSize(size)
            }
        }
    }
    
    static var userProfileButtonLabel: some View {
        CompoundIcon(\.userProfile, size: .medium, relativeTo: .title)
            .foregroundStyle(.compound.iconOnSolidPrimary)
            .scaledPadding(6, relativeTo: .title)
            .background(.compound.bgAccentRest, in: Circle())
    }
}
