import SwiftUI

struct MediumButton: View {
    let title: String
    let leftIconAssetName: String?
    let rightIconAssetName: String?
    let variant: MediumButtonVariant
    let isIconOnly: Bool
    let action: () -> Void
    
    init(
        title: String,
        leftIconAssetName: String? = nil,
        rightIconAssetName: String? = nil,
        variant: MediumButtonVariant = .primary,
        isIconOnly: Bool = false,
        action: @escaping () -> Void
    ) {
        self.title = title
        self.leftIconAssetName = leftIconAssetName
        self.rightIconAssetName = rightIconAssetName
        self.variant = variant
        self.isIconOnly = isIconOnly
        self.action = action
    }
    
    // Legacy initializer for backward compatibility
    init(
        title: String,
        iconAssetName: String? = nil,
        variant: MediumButtonVariant = .primary,
        action: @escaping () -> Void
    ) {
        self.title = title
        self.leftIconAssetName = iconAssetName
        self.rightIconAssetName = nil
        self.variant = variant
        self.isIconOnly = false
        self.action = action
    }
    
    var body: some View {
        Button(action: action) {
            if isIconOnly {
                // Icon-only button (40x40pt square)
                if let leftIconAssetName = leftIconAssetName {
                    Image(leftIconAssetName)
                        .resizable()
                        .renderingMode(.template)
                        .foregroundColor(variant.textColor)
                        .frame(width: 16, height: 16)
                }
            } else {
                // Regular text button with optional icons
                HStack(spacing: 4) {
                    if let leftIconAssetName = leftIconAssetName {
                        Image(leftIconAssetName)
                            .resizable()
                            .renderingMode(.template)
                            .foregroundColor(variant.textColor)
                            .frame(width: 16, height: 16)
                    }
                    
                    Text(title)
                        .font(.custom("PP Neue Montreal", size: 12))
                        .fontWeight(.medium)
                        .foregroundColor(variant.textColor)
                        .tracking(0.24)
                        .lineLimit(1)
                    
                    if let rightIconAssetName = rightIconAssetName {
                        Image(rightIconAssetName)
                            .resizable()
                            .renderingMode(.template)
                            .foregroundColor(variant.textColor)
                            .frame(width: 16, height: 16)
                    }
                }
                .padding(.horizontal, 16)
            }
        }
        .buttonStyle(PlainButtonStyle())
        .frame(width: isIconOnly ? 40 : nil, height: 40)
        .background(backgroundView)
        .clipShape(RoundedRectangle(cornerRadius: 100))
        .contentShape(RoundedRectangle(cornerRadius: 100))
        .allowsHitTesting(true)
    }
    
    @ViewBuilder
    private var backgroundView: some View {
        switch variant {
        case .primary:
            RoundedRectangle(cornerRadius: 100)
                .fill(Color.white.opacity(0.04))
        case .secondary:
            RoundedRectangle(cornerRadius: 100)
                .fill(Constants.Colors.Background.Fog.thin)
        case .tertiary:
            RoundedRectangle(cornerRadius: 100)
                .fill(Color.clear)
                .overlay(
                    RoundedRectangle(cornerRadius: 100)
                        .stroke(Color.white.opacity(0.1), lineWidth: 1)
                )
        case .secondaryElevated:
            RoundedRectangle(cornerRadius: 100)
                .fill(Constants.Colors.Background.Fog.thin)
        case .aura:
            Image("aura")
                .resizable()
                .aspectRatio(contentMode: .fill)
        }
    }
}

enum MediumButtonVariant {
    case primary
    case secondary
    case tertiary
    case secondaryElevated
    case aura
    
    var backgroundColor: Color {
        switch self {
        case .primary:
            return Color.white.opacity(0.04)
        case .secondary:
            return Constants.Colors.Background.Fog.thin
        case .tertiary:
            return Color.clear
        case .secondaryElevated:
            return Constants.Colors.Background.Fog.thin
        case .aura:
            return Color.clear // Background will be handled by image
        }
    }
    
    var textColor: Color {
        switch self {
        case .primary, .secondary, .tertiary, .secondaryElevated, .aura:
            return Constants.Colors.Foreground.primary
        }
    }
    
    var borderColor: Color {
        switch self {
        case .primary, .secondary, .secondaryElevated, .aura:
            return Color.clear
        case .tertiary:
            return Color.white.opacity(0.1)
        }
    }
}

// MARK: - Button Style Modifier (Legacy - now unused)

struct MediumButtonStyleModifier: ViewModifier {
    let variant: MediumButtonVariant
    
    func body(content: Content) -> some View {
        // Style is now applied directly in the main body
        content
    }
}

// MARK: - Convenience Initializers
extension MediumButton {
    static func secondary(_ title: String, leftIconAssetName: String? = nil, rightIconAssetName: String? = nil, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: title, leftIconAssetName: leftIconAssetName, rightIconAssetName: rightIconAssetName, variant: .secondary, action: action)
    }
    
    static func tertiary(_ title: String, leftIconAssetName: String? = nil, rightIconAssetName: String? = nil, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: title, leftIconAssetName: leftIconAssetName, rightIconAssetName: rightIconAssetName, variant: .tertiary, action: action)
    }
    
    static func secondaryElevated(_ title: String, leftIconAssetName: String? = nil, rightIconAssetName: String? = nil, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: title, leftIconAssetName: leftIconAssetName, rightIconAssetName: rightIconAssetName, variant: .secondaryElevated, action: action)
    }
    
    static func secondaryIcon(_ iconAssetName: String, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: "", leftIconAssetName: iconAssetName, variant: .secondary, isIconOnly: true, action: action)
    }
    
    static func secondaryElevatedIcon(_ iconAssetName: String, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: "", leftIconAssetName: iconAssetName, variant: .secondaryElevated, isIconOnly: true, action: action)
    }
    
    static func aura(_ title: String, leftIconAssetName: String? = nil, rightIconAssetName: String? = nil, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: title, leftIconAssetName: leftIconAssetName, rightIconAssetName: rightIconAssetName, variant: .aura, action: action)
    }
    
    static func auraIcon(_ iconAssetName: String, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: "", leftIconAssetName: iconAssetName, variant: .aura, isIconOnly: true, action: action)
    }
    
    // Legacy convenience method for backward compatibility
    static func tertiary(_ title: String, iconAssetName: String? = nil, action: @escaping () -> Void) -> MediumButton {
        MediumButton(title: title, iconAssetName: iconAssetName, variant: .tertiary, action: action)
    }
}

// MARK: - Preview
#Preview {
    VStack(spacing: 20) {
        // Primary variant with left icon
        MediumButton(
            title: "Lyrics",
            iconAssetName: "Icon/plus",
            action: { print("Lyrics button tapped") }
        )
        
        // Secondary with left icon
        MediumButton.secondary("Secondary", leftIconAssetName: "Icon/music-note") {
            print("Secondary button tapped")
        }
        
        // Tertiary with left icon
        MediumButton.tertiary("5,000", leftIconAssetName: "Icon/music-note") {
            print("Credits button tapped")
        }
        
        // Tertiary with right icon
        MediumButton.tertiary("4.5", rightIconAssetName: "Icon/chevron-down") {
            print("Model button tapped")
        }
        
        // Tertiary with both icons
        MediumButton.tertiary("Both", leftIconAssetName: "Icon/music-note", rightIconAssetName: "Icon/chevron-down") {
            print("Both icons button tapped")
        }
        
        // Secondary Elevated
        MediumButton.secondaryElevated("Elevated", leftIconAssetName: "Icon/plus") {
            print("Secondary elevated button tapped")
        }
        
        // Secondary Icon (40x40pt) 
        MediumButton.secondaryIcon("Icon/pause") {
            print("Secondary icon button tapped")
        }
        
        // Secondary Elevated Icon (40x40pt)
        MediumButton.secondaryElevatedIcon("Icon/library") {
            print("Secondary elevated icon button tapped")
        }
        
        // Aura variant
        MediumButton.aura("Generate", leftIconAssetName: "Icon/plus") {
            print("Aura button tapped")
        }
        
        // Aura Icon (40x40pt)
        MediumButton.auraIcon("Icon/create") {
            print("Aura icon button tapped")
        }
    }
    .padding()
    .background(Constants.Colors.Background.primary)
}
