//
//  View.swift
//  MVMCoreUI
//
//  Created by Scott Pfeil on 10/23/19.
//  Copyright © 2019 Verizon Wireless. All rights reserved.
//

import UIKit


@objcMembers open class View: UIView, MoleculeViewProtocol {
    //--------------------------------------------------
    // MARK: - Properties
    //--------------------------------------------------
    
    open var model: MoleculeModelProtocol?
    
    private var initialSetupPerformed = false
    
    //--------------------------------------------------
    // MARK: - Initialization
    //--------------------------------------------------
    
    public override init(frame: CGRect) {
        super.init(frame: .zero)
        initialSetup()
    }
    
    public convenience init() {
        self.init(frame: .zero)
    }
    
    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        initialSetup()
    }
    
    open func initialSetup() {
        if !initialSetupPerformed {
            initialSetupPerformed = true
            setupView()
        }
    }
    
    public required init(model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
        super.init(frame: .zero)
        initialSetup()
        set(with: model, delegateObject, additionalData)
    }
    
    //--------------------------------------------------
    // MARK: - MoleculeViewProtocol
    //--------------------------------------------------
    
    open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
        self.model = model
        if let backgroundColor = model.backgroundColor {
            self.backgroundColor = backgroundColor.uiColor
        }
        
        if let accessibilityIdentifier = model.accessibilityIdentifier {
            self.accessibilityIdentifier = accessibilityIdentifier
        }
    }
    
    open func reset() {
        backgroundColor = .clear
    }
    
    // MARK: Overridables
    // Base classes need to implement these functions otherwise swift won't respect the subclass functions and use the ones in the protocol extension instead.
    open class func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String? {
        model.moleculeName
    }
    
    open class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject:  MVMCoreUIDelegateObject?) -> CGFloat? { nil }
    
    open class func requiredModules(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? { nil }
}

// MARK:- MVMCoreViewProtocol
extension View: MVMCoreViewProtocol {
    
    open func updateView(_ size: CGFloat) { }
    
    /// Will be called only once.
    open func setupView() {
        translatesAutoresizingMaskIntoConstraints = false
        insetsLayoutMarginsFromSafeArea = false
        MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0)
    }
}
