import Foundation
import UIKit
import Display
import AsyncDisplayKit
import TelegramPresentationData
import AppBundle

final class BrowserToolbarSearchContentNode: ASDisplayNode, BrowserToolbarContentNode {
    private var theme: BrowserToolbarTheme
    private let strings: PresentationStrings
    private var state: BrowserState
    private var interaction: BrowserInteraction?
    
    private let upButton: HighlightableButtonNode
    private let downButton: HighlightableButtonNode
    private let resultsNode: ImmediateTextNode
    
    private var validLayout: CGSize?
        
    init(theme: BrowserToolbarTheme, strings: PresentationStrings, state: BrowserState, interaction: BrowserInteraction?) {
        self.theme = theme
        self.strings = strings
        self.state = state
        self.interaction = interaction
        
        self.upButton = HighlightableButtonNode()
        self.upButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/UpButton"), color: theme.buttonColor), for: .normal)
        self.upButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/UpButton"), color: theme.disabledButtonColor), for: .disabled)
        self.downButton = HighlightableButtonNode()
        self.downButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/DownButton"), color: theme.buttonColor), for: .normal)
        self.downButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/DownButton"), color: theme.disabledButtonColor), for: .disabled)
        self.resultsNode = ImmediateTextNode()
        
        super.init()
        
        self.addSubnode(self.upButton)
        self.addSubnode(self.downButton)
        self.addSubnode(self.resultsNode)
        
        self.upButton.addTarget(self, action: #selector(self.upPressed), forControlEvents: .touchUpInside)
        self.downButton.addTarget(self, action: #selector(self.downPressed), forControlEvents: .touchUpInside)
    }
    
    func updateState(_ state: BrowserState) {
        self.state = state
        
        if let size = self.validLayout {
            self.updateLayout(size: size, transition: .immediate)
        }
    }
    
    func updateTheme(_ theme: BrowserToolbarTheme) {
        guard self.theme !== theme else {
            return
        }
        self.theme = theme
        
        self.upButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/UpButton"), color: theme.buttonColor), for: .normal)
        self.upButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/UpButton"), color: theme.disabledButtonColor), for: .disabled)
        self.downButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/DownButton"), color: theme.buttonColor), for: .normal)
        self.downButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Search/DownButton"), color: theme.disabledButtonColor), for: .disabled)
    }
    
    func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
        self.validLayout = size
        
        let buttonSize = CGSize(width: 40.0, height: size.height)
        
        let resultsText: String
        if let results = self.state.search?.results {
            if results.1 > 0 {
                resultsText = self.strings.Items_NOfM("\(results.0 + 1)", "\(results.1)").string
            } else {
                resultsText = self.strings.Conversation_SearchNoResults
            }
        } else {
            resultsText = ""
        }
        
        self.resultsNode.attributedText = NSAttributedString(string: resultsText, font: Font.regular(15.0), textColor: self.theme.buttonColor, paragraphAlignment: .natural)
        let resultsSize = self.resultsNode.updateLayout(size)
        self.resultsNode.frame = CGRect(origin: CGPoint(x: size.width - 48.0 - 43.0 - resultsSize.width - 12.0, y: floor((size.height - resultsSize.height) / 2.0)), size: resultsSize)
        
        self.downButton.frame = CGRect(origin: CGPoint(x: size.width - 48.0, y: 0.0), size: buttonSize)
        self.upButton.frame = CGRect(origin: CGPoint(x: size.width - 48.0 - 43.0, y: 0.0), size: buttonSize)
    }
    
    @objc private func upPressed() {
        self.interaction?.scrollToPreviousSearchResult()
    }
    
    @objc private func downPressed() {
        self.interaction?.scrollToNextSearchResult()
    }
}