//
//  KMMergeCollectionPageViewItem.swift
//  PDF Master
//
//  Created by tangchao on 2022/11/25.
//

import Cocoa
import PDFKit

typealias KMMergeCollectionPageViewItemFoldClick = (_ viewItem: AnyObject)->()
typealias KMMergeCollectionPageViewItemSelectedClick = (_ viewItem: AnyObject)->()
class KMMergeCollectionPageViewItem: NSCollectionViewItem {

    lazy var iconImageView = NSImageView()
    lazy var backgroundView = NSView()
    lazy var pageView = KMPDFThumbnialPageView()
    
    lazy var nameLabel = NSTextField(labelWithString: "")
    
    var flodClick: KMMergeCollectionPageViewItemFoldClick!
    var selectedClick: KMMergeCollectionPageViewItemSelectedClick!
    
    private var flodButton = NSButton()
    private var selectCheckBox = NSButton(checkboxWithTitle: "", target: nil, action: nil)
    
    private var myModel: KMMergePageModel!
    var model: KMMergePageModel {
        get {
            myModel
        }
        set {
            myModel = newValue
            pageView.page = newValue.page;
            if newValue.pageID == 0 {
                flodButton.isHidden = false
            } else {
                flodButton.isHidden = true
            }
            
            
            if model.pageID == 0 {
                nameLabel.stringValue = fileModel.documentURL.lastPathComponent.components(separatedBy: ".").first!
            } else {
                nameLabel.stringValue = String(model.pageID+1)
            }
            
            if model.selected {
                selectCheckBox.state = NSControl.StateValue.on
            } else {
                selectCheckBox.state = NSControl.StateValue.off
            }
        }
    }
    
    private var myFileModel: KMMergeFileModel!
    var fileModel: KMMergeFileModel {
        get {
            myFileModel
        }
        set {
            myFileModel = newValue
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(backgroundView)
        view.addSubview(pageView)
        view.addSubview(flodButton)
        view.addSubview(selectCheckBox)
        view.addSubview(nameLabel)
        
        nameLabel.alignment = .center
        nameLabel.lineBreakMode = .byTruncatingTail
        
        flodButton.wantsLayer = true
        flodButton.isBordered = false;
        flodButton.title = NSLocalizedString("折叠", comment: "")
        flodButton.layer?.backgroundColor = NSColor.white.cgColor;
        flodButton.target = self
        flodButton.action = #selector(flodButtonAction)
        
//        let clickGestureRecongnizer = NSClickGestureRecognizer()
//        clickGestureRecongnizer.numberOfClicksRequired = 2
//        view.addGestureRecognizer(clickGestureRecongnizer)
//        clickGestureRecongnizer.target = self
//        clickGestureRecongnizer.action = #selector(clickGestureRecongnizerAction)
    }
    
    override func viewDidLayout() {
        super.viewDidLayout()
        
        let width = NSWidth(view.bounds)
        let height = NSHeight(view.bounds)
        
        iconImageView.frame = view.bounds
        backgroundView.frame = view.bounds
        
        let selectCheckBoxSize: CGFloat = 18
        selectCheckBox.frame = NSMakeRect(width-selectCheckBoxSize-5, height-selectCheckBoxSize-5, selectCheckBoxSize, selectCheckBoxSize)
        
        let flodSize: CGFloat = 28
        flodButton.frame = NSMakeRect(width-flodSize-10, height-flodSize-30, flodSize, flodSize)
        
        nameLabel.frame = NSMakeRect(0, 0, width, 20)
        
        let border: CGFloat = 10
        var bounds: NSRect = NSZeroRect
        if (myModel != nil) {
            bounds = myModel.page.bounds
        }
        
        if (bounds.size.width == 0) {
            return
        }
        
        if (bounds.size.height == 0) {
            return
        }
        
        let pageSelectionSize = CGSize(width: self.view.frame.size.width-30, height: self.view.frame.size.height-40)
        var size = NSMakeSize(pageSelectionSize.width - 2 * border, pageSelectionSize.height - 2 * border)
        let minScale = min(size.width/bounds.size.width, size.height/bounds.size.height)
        size.width = bounds.size.width * minScale
        size.height = bounds.size.height * minScale
        
        let pageViewX = (pageSelectionSize.width-size.width) * 0.5 + 15
        let pageViewY = (pageSelectionSize.height-size.height) * 0.5 + 10
        pageView.frame = NSMakeRect(pageViewX, pageViewY, size.width, size.height)
    }
    
    override var isSelected: Bool {
        get {
            super.isSelected
        }
        set {
            super.isSelected = newValue
            
            backgroundView.wantsLayer = true
            if newValue {
                backgroundView.layer?.backgroundColor = NSColor.blue.cgColor
            } else {
                backgroundView.layer?.backgroundColor = NSColor.clear.cgColor
            }
        }
    }
    
    override func mouseUp(with event: NSEvent) {
        guard let callback = selectedClick else {
            return
        }
        callback(self)
    }
    
    @objc func flodButtonAction() {
        guard let callback = flodClick else {
            return
        }
        callback(self)
    }
}