//
//  KMBatchProcessingView.swift
//  PDF Master
//
//  Created by lizhe on 2022/11/16.
//

import Cocoa

class KMBatchProcessingView: NSView {
    @IBOutlet var contentView: NSView!
    
    @IBOutlet weak var addBox: NSBox!
    @IBOutlet weak var tableView: KMBatchProcessingTableView!
    @IBOutlet weak var selectedFilesView: KMBatchSelectedFilesView!
    @IBOutlet weak var cleanButton: NSButton!
    
    var createFilePopover: NSPopover?
    var addVC: KMDesignSelect!
    
    weak var delegate: KMBatchProcessingViewDelegate?
    var inputType: DataNavigationViewButtonActionType? {
        didSet {
            self.selectedFilesView.inputType = inputType
            self.tableView.inputType = inputType
            if inputType == .ImageToPDF {
                addVC.removeAllItems()
                addVC.addItems(withObjectValues: ["Add Files", "Add Folder"])
            }
        }
    }
    
    /**
      @abstract 外部传入数据
      @param inputData 文件路劲
      */
    var inputData: [URL]! {
        didSet {
            self.tableView.inputData = inputData
            self.reloadData()
        }
    }
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // Drawing code here.
    }
    
    // MARK: 初始化
    public required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        initContentView()
        setup()
    }
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        initContentView()
        setup()
    }
    
    private func initContentView() {
        //绑定xib
        let resource = NSNib(nibNamed: String(describing: self.classForCoder.self),
                             bundle: Bundle(for: self.classForCoder.self))!
        resource.instantiate(withOwner: self, topLevelObjects: nil)
        addSubview(contentView)
        contentView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: topAnchor),
            contentView.leftAnchor.constraint(equalTo: leftAnchor),
            contentView.rightAnchor.constraint(equalTo: rightAnchor),
            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
        contentView.updateConstraintsForSubtreeIfNeeded()
    }
    
    func setup() {
        addVC = KMDesignSelect.init(withType: .PopButton)
        addBox.fillColor = .clear
        addBox.contentView = addVC.view
        addVC.removeAllItems()
        addVC.addItems(withObjectValues: ["Add Files", "Add Folder", "Add Open Files"])
        addVC.selectItem(at: 0)
        addVC.popoverBehavior = .transient
        addVC.delete = self
        
        self.cleanButton.wantsLayer = true
        self.cleanButton.border()
        
        self.selectedFilesView.dragEnd = {[unowned self] (data) in
            self.inputData = data
        }
        
        self.selectedFilesView.addAction = {[unowned self] (sender) in
            self.addFiles()
        }
        
        self.tableView.delegate = self
        self.reloadData()
    }
    
    func reloadData() {
        if (self.tableView.data != nil) && self.tableView.data!.count != 0 {
            self.selectedFilesView.isHidden = true
            self.tableView.isHidden = false
        } else {
            self.selectedFilesView.isHidden = false
            self.tableView.isHidden = true
        }
        
        if self.tableView.data?.count != 0 {
            self.cleanButton.isEnabled = true
        } else {
            self.cleanButton.isEnabled = false
        }
        
        self.tableView.reloadData()
    }
}


protocol KMBatchProcessingViewAction{}
extension KMBatchProcessingView: KMBatchProcessingViewAction {
    
    @IBAction func cleanAll(_ sender: Any) {
        if self.tableView.selectModels.count != 0 {
            self.tableView.presenter.deleteData(model: (self.tableView.selectModels.first)!)
            self.tableView.selectModels.removeObject(self.tableView.selectModels.first!)
            
        } else {
            self.tableView.presenter.cleanAll()
            self.tableView.selectModels.removeAll()
        }
        
        self.reloadData()
    }
    
    func addFiles() {
        KMBatchProcessingView.openfiles(window: window!) { [unowned self] openPanel in
            if self.inputType == .OCR {
                openPanel.allowedFileTypes = KMOCRModel.supportedTypes()
            } else if self.inputType == .ImageToPDF {
                openPanel.allowedFileTypes = KMBatchProcessingTableViewModel.supportedImageTypes()
            } else {
                openPanel.allowedFileTypes = KMOCRModel.supportedTypes()
            }
            
            openPanel.prompt = "Open"
            openPanel.canChooseDirectories = false //是否允许选择目录
            openPanel.canChooseFiles = true //是否可以选择文件
            openPanel.allowsMultipleSelection = true //是否允许多选
            
            if openPanel.allowsMultipleSelection == true {
                openPanel.message = NSLocalizedString("Press the keyboard ⌘/⇧ to select multiple files", comment: "")
            }
        } completion: { [unowned self] (panel ,data) in
            if data.count != 0 {
                self.tableView.presenter.addData(data: data)
                self.reloadData()
            }
        }
    }
    
    func addFolder() {
        KMPrint("addFolder")
        KMBatchProcessingView.openfiles(window: window!) { [unowned self] openPanel in
            if self.inputType == .OCR {
                openPanel.allowedFileTypes = KMOCRModel.supportedTypes()
            } else if self.inputType == .ImageToPDF {
                openPanel.allowedFileTypes = KMBatchProcessingTableViewModel.supportedImageTypes()
            } else {
                openPanel.allowedFileTypes = KMOCRModel.supportedTypes()
            }
            
            openPanel.prompt = "Open"
            openPanel.canChooseDirectories = true //是否允许选择目录
            openPanel.canChooseFiles = false //是否可以选择文件
            openPanel.allowsMultipleSelection = false //是否允许多选
        } completion: { [unowned self] (panel ,data) in
            if data.count != 0 {
                var filePaths: [URL] = []
                
                var types: [String] = []
                if self.inputType == .OCR {
                    types = KMOCRModel.supportedTypes()
                } else if self.inputType == .ImageToPDF {
                    types = KMBatchProcessingTableViewModel.supportedImageTypes()
                } else {
                    types = KMOCRModel.supportedTypes()
                }
                
                KMMergeTools.findAllFiles(folder: data.first!, result: &filePaths, types: types)
                self.tableView.presenter.addData(data: filePaths)
                self.reloadData()
            }
        }
    }
    
    func addOpenFiles() {
        let array = ImageToPDFTools.fetchOpenDocumentFiles()
        self.tableView.presenter.addData(data: array)
        self.reloadData()
    }
    
    func canAddOpenFile() -> Bool {
        var result: Bool = false
        let array = ImageToPDFTools.fetchOpenDocumentFiles()
        if array.count != 0 {
            result = true
        }
        return result
    }
}

protocol KMBatchProcessingViewOpenPanel {}
extension KMBatchProcessingView: KMBatchProcessingViewOpenPanel {
    /**
      @abstract 打开文件
      @param window 显示window
      @param title 标题
      */
    static func openfiles(window:NSWindow, openPanel:((_ openPanel: NSOpenPanel) -> Void)?, completion:@escaping/**逃逸闭包*/ (_ panel: NSOpenPanel ,_ data:[URL]) -> Void) {
        let panel = NSOpenPanel()
        if openPanel != nil {
            openPanel!(panel)
        } else {
            panel.prompt = ""
            panel.canChooseDirectories = false //是否允许选择目录
            panel.canChooseFiles = true //是否可以选择文件
            panel.allowsMultipleSelection = true //是否允许多选
            panel.allowedFileTypes = KMBatchProcessingTableViewModel.supportedImageTypes() //支持类型
            
//            let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
//            button.state = .off
//            panel.accessoryView = button
        }
        
        panel.beginSheetModal(for: window, completionHandler: { result in
            if result != .OK {
                KMPrint("取消")
                completion(panel, [])
            } else {
                completion(panel, panel.urls)
            }
        })
    }
}

extension KMBatchProcessingView: KMBatchProcessingTableViewDelegate {
    func reloadData(data: [KMBatchProcessingTableViewModel]) {
        self.reloadData()
        if (self.delegate != nil) {
            self.delegate?.reloadData(data: data)
        }
    }
}

protocol KMBatchProcessingViewDelegate: NSObject {
    /**
     数据刷新
     */
    func reloadData(data: [KMBatchProcessingTableViewModel])
}

extension KMBatchProcessingView: KMSelectPopButtonDelegate {
    func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
        if (self.addVC == obj) {
            let index = self.addVC.indexOfSelectedItem
            if index < 0 {
                return
            }
            let familyString = self.addVC.stringValue
            
            if familyString == NSLocalizedString("Add Files", comment: "") {
                self.addFiles()
            } else if familyString == NSLocalizedString("Add Folder", comment: "") {
                self.addFolder()
            } else if familyString == NSLocalizedString("Add Open Files", comment: "") {
                self.addOpenFiles()
            }
        }
    }
    
    func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
        
    }
}