//
//  UIButtonExt.swift

//
//  Created by Leon on 2025/7/18.
//

extension UIButton {
    // 使用 associated object 存储点击范围的内边距
    private struct AssociatedKeys {
        static var touchAreaInsets = "touchAreaInsets"
    }
    
    // 可动态设置的点击范围内边距
    @objc var touchAreaInsets: UIEdgeInsets {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.touchAreaInsets) as? UIEdgeInsets ?? .zero
        }
        set {
            objc_setAssociatedObject(self, &AssociatedKeys.touchAreaInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    // 重写 point(inside:with:) 方法，扩展点击范围
    override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        let insets = touchAreaInsets
        // 扩展后的点击区域
        let extendedBounds = bounds.inset(by: UIEdgeInsets(
            top: -insets.top,
            left: -insets.left,
            bottom: -insets.bottom,
            right: -insets.right
        ))
        return extendedBounds.contains(point)
    }
}

// 全局防抖影响一些基本的barButton的点击事件，和一些三方库冲突
//import ObjectiveC.runtime
//
//extension UIControl {
//    private struct AssociatedKeys {
//        static var ignoreEvent = 0
//        static var clickInterval = 0
//    }
//
//    /// 是否正在忽略点击事件
//    private var isIgnoringEvent: Bool {
//        get { (objc_getAssociatedObject(self, &AssociatedKeys.ignoreEvent) as? Bool) ?? false }
//        set { objc_setAssociatedObject(self, &AssociatedKeys.ignoreEvent, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
//    }
//
//    /// 点击间隔，默认 0.8 秒
//    var clickInterval: TimeInterval {
//        get { (objc_getAssociatedObject(self, &AssociatedKeys.clickInterval) as? TimeInterval) ?? 0.8 }
//        set { objc_setAssociatedObject(self, &AssociatedKeys.clickInterval, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
//    }
//
//    // MARK: - 启用防抖（全局一次即可）
//    public static func enableClickDebounce() {
//        let originalSelector = #selector(UIControl.sendAction(_:to:for:))
//        let swizzledSelector = #selector(UIControl.swizzled_sendAction(_:to:for:))
//
//        guard let originalMethod = class_getInstanceMethod(UIControl.self, originalSelector),
//              let swizzledMethod = class_getInstanceMethod(UIControl.self, swizzledSelector) else {
//            return
//        }
//        method_exchangeImplementations(originalMethod, swizzledMethod)
//    }
//
//    @objc private func swizzled_sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
//        if isIgnoringEvent {
//            return
//        }
//
//        if clickInterval > 0 {
//            isIgnoringEvent = true
//            DispatchQueue.main.asyncAfter(deadline: .now() + clickInterval) { [weak self] in
//                self?.isIgnoringEvent = false
//            }
//        }
//
//        // 调用原始实现
//        swizzled_sendAction(action, to: target, for: event)
//    }
//}
