import SwiftUI
import Foundation

public struct Chip: View {
    public enum ChipSize { case small, large }

    public struct Dimensions {
        let horizontal: CGFloat
        let vertical: CGFloat
        let iconSize: CGFloat
        let iconSpacing: CGFloat
    }

    public static let Large = Dimensions(horizontal: 12, vertical: 8, iconSize: 20, iconSpacing: 8)
    public static let Small = Dimensions(horizontal: 10, vertical: 6, iconSize: 16, iconSpacing: 6)

    private let label: String?
    private let iconLeft: String?
    private let iconRight: String?
    private let selected: Bool
    private let onClick: () -> Void
    private let size: ChipSize
    private let iconLeftTint: Color?
    private let iconRightTint: Color?
    private let backgroundColor: Color?
    private let accessibilityLabel: String?

    public init(
        label: String? = "Label",
        iconLeft: String? = nil,
        iconRight: String? = nil,
        selected: Bool = false,
        onClick: @escaping () -> Void = {},
        size: ChipSize = .large,
        iconLeftTint: Color? = nil,
        iconRightTint: Color? = nil,
        backgroundColor: Color? = nil,
        accessibilityLabel: String? = nil
    ) {
        self.label = label
        self.iconLeft = iconLeft
        self.iconRight = iconRight
        self.selected = selected
        self.onClick = onClick
        self.size = size
        self.iconLeftTint = iconLeftTint
        self.iconRightTint = iconRightTint
        self.backgroundColor = backgroundColor
        self.accessibilityLabel = accessibilityLabel
    }

    public var body: some View {
        let dims = (size == .small) ? Self.Small : Self.Large

        let bg: Color = {
            if selected { return Colors.pink10 }
            if let explicit = backgroundColor { return explicit }
            return Colors.black03
        }()

        let textColor: Color = selected ? Colors.primary : Colors.text
        let leftTint: Color = selected ? Colors.primary : iconLeftTint ?? Colors.text
        let rightTint: Color = selected ? Colors.primary : iconRightTint ?? Colors.text

        HStack(spacing: dims.iconSpacing) {
            if let iconLeft {
                Icon(source: iconLeft, size: dims.iconSize, color: leftTint)
            }

            if let text = label, !text.isEmpty {
                MomoText(text, typography: (size == .large) ? .labelDefaultMedium : .labelSMedium, color: textColor)
                    .lineLimit(1)
            }

            if let iconRight {
                Icon(source: iconRight, size: dims.iconSize, color: rightTint)
            }
        }
        .padding(.horizontal, dims.horizontal)
        .padding(.vertical, dims.vertical)
        .background(
            RoundedRectangle(cornerRadius: Radius.L, style: .continuous)
                .fill(bg)
        )
        .overlay(
            Group {
                if selected {
                    RoundedRectangle(cornerRadius: Radius.L, style: .continuous)
                        .stroke(Colors.primary, lineWidth: 2)
                }
            }
        )
        .contentShape(RoundedRectangle(cornerRadius: Radius.L, style: .continuous))
        .onTapGesture(perform: onClick)
    }
}
