import Foundation
import UIKit

public protocol OverlayMaskContainerViewProtocol: UIView {
    var maskContents: UIView { get }
}

public class OverlayMaskContainerView: UIView, OverlayMaskContainerViewProtocol {
    override public static var layerClass: AnyClass {
        return MirroringLayer.self
    }
    
    public let maskContents: UIView
    
    override init(frame: CGRect) {
        self.maskContents = UIView()
        
        super.init(frame: frame)
        
        (self.layer as? MirroringLayer)?.targetLayer = self.maskContents.layer
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override public func addSubview(_ view: UIView) {
        super.addSubview(view)
        
        if let view = view as? OverlayMaskContainerViewProtocol {
            self.maskContents.addSubview(view.maskContents)
        }
    }
    
    override public func insertSubview(_ view: UIView, at index: Int) {
        super.insertSubview(view, at: index)
        
        if let view = view as? OverlayMaskContainerViewProtocol {
            self.maskContents.addSubview(view.maskContents)
        }
    }
    
    override public func insertSubview(_ view: UIView, aboveSubview siblingSubview: UIView) {
        super.insertSubview(view, aboveSubview: siblingSubview)
        
        if let view = view as? OverlayMaskContainerViewProtocol {
            self.maskContents.addSubview(view.maskContents)
        }
    }
    
    override public func insertSubview(_ view: UIView, belowSubview siblingSubview: UIView) {
        super.insertSubview(view, belowSubview: siblingSubview)
        
        if let view = view as? OverlayMaskContainerViewProtocol {
            self.maskContents.addSubview(view.maskContents)
        }
    }
    
    override public func willRemoveSubview(_ subview: UIView) {
        super.willRemoveSubview(subview)
        
        if let view = subview as? OverlayMaskContainerViewProtocol {
            if view.maskContents.superview === self.maskContents {
                view.maskContents.removeFromSuperview()
            }
        }
    }
}