import Foundation
import UIKit
import Display
import TelegramCore

final class MediaAreaMaskLayer: CALayer {
    private var params: (referenceSize: CGSize, mediaAreas: [MediaArea])?
    
    func update(referenceSize: CGSize, mediaAreas: [MediaArea], borderMaskLayer: CALayer?) {
        guard referenceSize != self.params?.referenceSize && mediaAreas != self.params?.mediaAreas else {
            return
        }
        
        for mediaArea in mediaAreas {
            let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height)
            let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height)
            let cornerRadius: CGFloat
            if let radius = mediaArea.coordinates.cornerRadius {
                cornerRadius = radius / 100.0 * size.width
            } else {
                cornerRadius = size.height * 0.18
            }
            
            let layer = CALayer()
            layer.backgroundColor = UIColor.white.cgColor
            layer.bounds = CGRect(origin: .zero, size: size)
            layer.position = position
            layer.cornerRadius = cornerRadius
            layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0)
            self.addSublayer(layer)
            
            if let borderMaskLayer {
                let borderLayer = CAShapeLayer()
                borderLayer.strokeColor = UIColor.white.cgColor
                borderLayer.fillColor = UIColor.clear.cgColor
                borderLayer.lineWidth = 2.0
                borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil)
                borderLayer.bounds = CGRect(origin: .zero, size: size)
                borderLayer.position = position
                borderLayer.transform = layer.transform
                borderMaskLayer.addSublayer(borderLayer)
            }
        }
    }
}