import Foundation
import UIKit
import AsyncDisplayKit
import Display
import TelegramPresentationData
import Stripe

struct BotPaymentCardInputData {
    let number: String
    let code: String
    let year: UInt
    let month: UInt
}

final class BotPaymentCardInputItemNode: BotPaymentItemNode, STPPaymentCardTextFieldDelegate {
    private let cardField: STPPaymentCardTextField
    
    private var theme: PresentationTheme?
    
    var updated: ((BotPaymentCardInputData?) -> Void)?
    var completed: (() -> Void)?
    
    init() {
        self.cardField = STPPaymentCardTextField()
        self.cardField.borderColor = .clear
        self.cardField.borderWidth = 0.0
        
        super.init(needsBackground: true)
        
        self.cardField.delegate = self
        self.view.addSubview(self.cardField)
    }
    
    override func measureInset(theme: PresentationTheme, width: CGFloat) -> CGFloat {
        return 0.0
    }
    
    override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
        if self.theme !== theme {
            self.theme = theme
            
            self.cardField.textColor = theme.list.itemPrimaryTextColor
            self.cardField.textErrorColor = theme.list.itemDestructiveColor
            self.cardField.placeholderColor = theme.list.itemPlaceholderTextColor
            self.cardField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance
        }
        
        self.cardField.frame = CGRect(origin: CGPoint(x: 5.0 + sideInset, y: 0.0), size: CGSize(width: width - 10.0 - sideInset * 2.0, height: 44.0))
        
        return 44.0
    }
    
    func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) {
        if textField.isValid, let number = textField.cardParams.number, let code = textField.cardParams.cvc {
            self.updated?(BotPaymentCardInputData(number: number, code: code, year: textField.cardParams.expYear, month: textField.cardParams.expMonth))
            
            if code.count == 3 {
                self.completed?()
            }
        } else {
            self.updated?(nil)
        }
    }
    
    func activateInput() {
        self.cardField.becomeFirstResponder()
    }
}