import SwiftUI

struct SmallButton: View {
    let title: String?
    let iconName: String?
    let variant: SmallButtonVariant
    let action: () -> Void
    
    init(title: String, variant: SmallButtonVariant = .tertiary, action: @escaping () -> Void) {
        self.title = title
        self.iconName = nil
        self.variant = variant
        self.action = action
    }
    
    init(iconName: String, variant: SmallButtonVariant = .tertiary, action: @escaping () -> Void) {
        self.title = nil
        self.iconName = iconName
        self.variant = variant
        self.action = action
    }
    
    var body: some View {
        Button(action: action) {
            Group {
                if let title = title {
                    // Text button
                    Text(title)
                        .font(Constants.Typography.xSmallTitle)
                        .foregroundColor(variant.textColor)
                        .tracking(0.24)
                        .lineLimit(1)
                } else if let iconName = iconName {
                    // Icon button
                    Image(iconName)
                        .resizable()
                        .renderingMode(.template)
                        .foregroundColor(variant.textColor)
                        .frame(width: 16, height: 16)
                }
            }
            .padding(.horizontal, iconName != nil ? 0 : 16)
            .padding(.vertical, 0)
            .frame(height: 32)
            .frame(width: iconName != nil ? 32 : nil)
            .frame(maxWidth: iconName != nil ? nil : .infinity)
            .background(
                RoundedRectangle(cornerRadius: 100)
                    .fill(variant.backgroundColor)
                    .overlay(
                        RoundedRectangle(cornerRadius: 100)
                            .stroke(variant.borderColor, lineWidth: 1)
                    )
            )
        }
        .buttonStyle(PlainButtonStyle())
    }
}

enum SmallButtonVariant {
    case primary
    case secondary
    case tertiary
    
    var backgroundColor: Color {
        switch self {
        case .primary:
            return Constants.Colors.Foreground.primary
        case .secondary:
            return Constants.Colors.Background.tertiary
        case .tertiary:
            return Color.clear
        }
    }
    
    var textColor: Color {
        switch self {
        case .primary:
            return Constants.Colors.Background.primary
        case .secondary:
            return Constants.Colors.Foreground.primary
        case .tertiary:
            return Constants.Colors.Foreground.primary
        }
    }
    
    var borderColor: Color {
        switch self {
        case .primary:
            return Color.clear
        case .secondary:
            return Color.clear
        case .tertiary:
            return Color.white.opacity(0.1)
        }
    }
}

// MARK: - Convenience Initializers
extension SmallButton {
    // Text button convenience initializers
    static func primary(_ title: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(title: title, variant: .primary, action: action)
    }
    
    static func secondary(_ title: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(title: title, variant: .secondary, action: action)
    }
    
    static func tertiary(_ title: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(title: title, variant: .tertiary, action: action)
    }
    
    // Icon button convenience initializers
    static func primaryIcon(_ iconName: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(iconName: iconName, variant: .primary, action: action)
    }
    
    static func secondaryIcon(_ iconName: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(iconName: iconName, variant: .secondary, action: action)
    }
    
    static func tertiaryIcon(_ iconName: String, action: @escaping () -> Void) -> SmallButton {
        SmallButton(iconName: iconName, variant: .tertiary, action: action)
    }
}

#Preview {
    VStack(spacing: 16) {
        // Text buttons
        HStack(spacing: 12) {
            SmallButton.primary("Button") {
                print("Primary button tapped")
            }
            .frame(width: 120)
            
            SmallButton.secondary("Button") {
                print("Secondary button tapped")
            }
            .frame(width: 120)
            
            SmallButton.tertiary("Button") {
                print("Tertiary button tapped")
            }
            .frame(width: 120)
        }
        
        // Icon buttons (32x32)
        HStack(spacing: 12) {
            SmallButton.primaryIcon("Icon/filter") {
                print("Primary icon button tapped")
            }
            
            SmallButton.secondaryIcon("Icon/filter") {
                print("Secondary icon button tapped")
            }
            
            SmallButton.tertiaryIcon("Icon/filter") {
                print("Tertiary icon button tapped")
            }
        }
        
        // Custom usage
        SmallButton(iconName: "Icon/close", variant: .primary) {
            print("Custom icon button tapped")
        }
    }
    .padding()
    .background(Constants.Colors.Background.primary)
}
