import Foundation
import UIKit
import AsyncDisplayKit

import LegacyComponents

public enum CheckNodeStyle {
    case plain
    case overlay
    case navigation
    case compact
}

public final class CheckNode: ASDisplayNode {
    private var strokeColor: UIColor
    private var fillColor: UIColor
    private var foregroundColor: UIColor
    private let checkStyle: CheckNodeStyle
    
    private var checkView: TGCheckButtonView?
    
    public private(set) var isChecked: Bool = false
    
    private weak var target: AnyObject?
    private var action: Selector?
    
    public init(strokeColor: UIColor, fillColor: UIColor, foregroundColor: UIColor, style: CheckNodeStyle) {
        self.strokeColor = strokeColor
        self.fillColor = fillColor
        self.foregroundColor = foregroundColor
        self.checkStyle = style
        
        super.init()
    }
    
    override public func didLoad() {
        super.didLoad()
        
        let style: TGCheckButtonStyle
        let checkSize: CGSize
        switch self.checkStyle {
        case .plain:
            style = TGCheckButtonStyleDefault
            checkSize = CGSize(width: 32.0, height: 32.0)
        case .overlay:
            style = TGCheckButtonStyleMedia
            checkSize = CGSize(width: 32.0, height: 32.0)
        case .navigation:
            style = TGCheckButtonStyleGallery
            checkSize = CGSize(width: 39.0, height: 39.0)
        case .compact:
            style = TGCheckButtonStyleCompact
            checkSize = CGSize(width: 30.0, height: 30.0)
        }
        let checkView = TGCheckButtonView(style: style, pallete: TGCheckButtonPallete(defaultBackgroundColor: self.fillColor, accentBackgroundColor: self.fillColor, defaultBorderColor: self.strokeColor, mediaBorderColor: self.strokeColor, chatBorderColor: self.strokeColor, check: self.foregroundColor, blueColor: self.fillColor, barBackgroundColor: self.fillColor))!
        checkView.setSelected(true, animated: false)
        checkView.layoutSubviews()
        checkView.setSelected(self.isChecked, animated: false)
        if let target = self.target, let action = self.action {
            checkView.addTarget(target, action: action, for: .touchUpInside)
        }
        self.checkView = checkView
        self.view.addSubview(checkView)
        
        checkView.frame = CGRect(origin: CGPoint(), size: checkSize)
    }
    
    public func setIsChecked(_ isChecked: Bool, animated: Bool) {
        if isChecked != self.isChecked {
            self.isChecked = isChecked
            self.checkView?.setSelected(isChecked, animated: animated)
        }
    }
    
    public func addTarget(target: AnyObject?, action: Selector) {
        self.target = target
        self.action = action
        if self.isNodeLoaded {
            self.checkView?.addTarget(target, action: action, for: .touchUpInside)
        }
    }
}