// Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.

import UIKit

public class BezierPathView: UIView {
    public var configureShapeLayer: ((CAShapeLayer, CGRect) -> ())? {
        didSet {
            updateLayers()
        }
    }
    
    public override var frame: CGRect {
        didSet {
            guard oldValue.size != frame.size else { return }
            
            updateLayers()
        }
    }
    
    public override var bounds: CGRect {
        didSet {
            guard oldValue.size != frame.size else { return }
            
            updateLayers()
        }
    }
    
    // MARK: - Initialization
    
    public override init(frame: CGRect) {
        super.init(frame: frame)
        
        self.isOpaque = false
        self.isUserInteractionEnabled = false
    }
    
    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        
        self.isOpaque = false
        self.isUserInteractionEnabled = false
    }
    
    // MARK: - Functions
    
    private func updateLayers() {
        guard bounds.size.width > 0 && bounds.size.height > 0 else { return }

        layer.sublayers?.forEach { $0.removeFromSuperlayer() }

        // Prevent the shape layer from animating changes
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        
        let shapeLayer: CAShapeLayer = CAShapeLayer()
        configureShapeLayer?(shapeLayer, bounds)
        layer.addSublayer(shapeLayer)
        
        CATransaction.commit()
        setNeedsDisplay()
    }
}