import SwiftUI

public struct SignInButton: View {
    @Environment(\.isEnabled) private var isEnabled

    private var isLoading: Bool
    private var icon: Image
    private var action: () -> Void

    public init(isLoading: Bool, icon: Image, action: @escaping () -> Void) {
        self.isLoading = isLoading
        self.icon = icon
        self.action = action
    }

    public var body: some View {
        Button(
            action: action,
            label: {
                icon
                    .foregroundStyle(Color.SemanticV1.iconPrimary)
            }
        )
        .buttonStyle(PillButtonStyleV1(
            isLoading: isLoading,
            isEnabled: isEnabled,
            isIconOnly: true,
            size: .signInButtonSize,
            colorCombination: .signInButtonColorCombination
        ))
    }
}

extension PillButtonStyleV1.ColorCombination {
    static let signInButtonColorCombination = PillButtonStyleV1.ColorCombination(
        enabled: PillButtonStyleV1.ColorSet(
            foreground: .SemanticV1.textPrimary,
            background: .SemanticV1.backgroundSecondary,
            loading: .SemanticV1.iconPrimary,
            border: .clear
        ),
        pressed: PillButtonStyleV1.ColorSet(
            foreground: .SemanticV1.textPrimary,
            background: .SemanticV1.backgroundTertiary,
            loading: .SemanticV1.iconPrimary,
            border: .clear
        ),
        disabled: PillButtonStyleV1.ColorSet(
            foreground: .SemanticV1.textPrimary.opacity(0.5),
            background: .SemanticV1.backgroundSecondary,
            loading: .SemanticV1.iconPrimary.opacity(0.5),
            border: .clear
        )
    )
}

extension PillButtonSizeV1 {
    static let signInButtonSize = PillButtonSizeV1(
        typography: .button1,
        maxWidth: .infinity,
        minHeight: 56,
        iconWidth: 24,
        borderRadius: 8,
        padding: .init(top: 0, leading: 24, bottom: 0, trailing: 24),
        alignment: .center,
        loadingAlignment: .center
    )
}

struct SignInButton_Previews: PreviewProvider {
    static var previews: some View {
        VStack(spacing: 10) {
            SignInButton(isLoading: false, icon: .Icon.apple) {
                //
            }
            SignInButton(isLoading: false, icon: .Icon.microsoft) {
                //
            }
            SignInButton(isLoading: false, icon: .Icon.google) {
                //
            }
            SignInButton(isLoading: false, icon: .Icon.discord) {
                //
            }
            .disabled(true)
        }
        .padding()
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.SemanticV1.backgroundPrimary)
    }
}
