//
//  KMBackgroundController.swift
//  PDF Master
//
//  Created by tangchao on 2022/12/23.
//

import Cocoa
/// 背景 预览控制器
class KMBackgroundController: KMWatermarkAdjectivePreViewBaseController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let itemTitles = [[NSLocalizedString("Add Background", comment: ""), NSLocalizedString("Delete Background", comment: "")], [NSLocalizedString("Batch", comment: "")]]
        var itemModels: Array<Array<KMWatermarkAdjectiveTopBarItemModel>> = []
        for items in itemTitles {
            var array: Array<KMWatermarkAdjectiveTopBarItemModel> = []
            for title in items {
                let model = KMWatermarkAdjectiveTopBarItemModel()
                model.iconName = ""
                model.itemTitle = title
                array.append(model)
            }
            itemModels.append(array)
        }
        
        self.topBarView.initItemData(itemArrays: itemModels)
        self.topBarView.selectTopItem(index: 0)
        
        let preView: KMWatermarkPDFView_OC = KMWatermarkPDFView_OC()
        self.preView = preView
        self.preView.frame = self.preViewBox.contentView!.bounds
        self.preView.autoresizingMask = [.width, .height]
        self.preViewBox.contentView?.addSubview(self.preView)
        self.preView.setDisplay(.singlePage)
        
        let controller = KMBackgroundPropertyHomeController()
        controller.preView = self.preView
        controller.view.frame = self.rightBox.contentView!.bounds
        controller.view.autoresizingMask = [.width, .height]
        self.right_gotoViewController(viewController: controller)
        controller.modelDidChange = { [weak self] model in
            if (model == nil) {
                self!.topBarView.isCanApply(can: false)
            } else {
                self!.topBarView.isCanApply(can: true)
            }
            
            self!.model = model 
            self!.model?.pageCount = Int((self?.preView.document.pageCount)!)
            (self?.preView as! KMWatermarkPDFView_OC).model = model
        }
    }
    
    override func viewDidAppear() {
        super.viewDidAppear()
        
        (self.rightViewController as! KMBackgroundPropertyHomeController).pageCount = Int(self.preView.document.pageCount)
    }
    
    override func applyAction() {
        if (self.model == nil) {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("Failure", comment: "")
            alert.runModal()
            return
        }
        self.beginLoading()
        self.addBackground(model: self.model! as! KMBackgroundModel, toPath: self.preView.document.documentURL.path) {
            result in
            DispatchQueue.main.async {
                self.preView.layoutDocumentView()
                self.preView.setNeedsDisplayForVisiblePages()
            }
            self.endLoading()
            if (result) {
                guard let callback = self.itemClick else {
                    return
                }
                callback(1, nil)
            } else {
                let alert = NSAlert()
                alert.alertStyle = .critical
                alert.messageText =  NSLocalizedString("Failure", comment: "")
                alert.runModal()
            }
        }
    }
    
    override func topItemClick(index: Int) {
        if (index == 0) { /// 添加
            return
        }
        if (index == 2) { /// 批量
            KMBatchWindowController.openFile(nil, .Background)
            return
        }
 
        /// 移除
        self.beginLoading()
        self.deleteBackground(toPath: self.preView.document.documentURL.path) {
            result in
            self.endLoading()
            if (result) {
                DispatchQueue.main.async {
                    self.preView.document = CPDFDocument(url: self.preView.document.documentURL)
                }
            } else {
                let alert = NSAlert()
                alert.alertStyle = .critical
                alert.messageText =  NSLocalizedString("Failure", comment: "")
                alert.runModal()
            }
        }
    }
    
    func gotoPropertyListController() {
        let propertyController = KMBackgroundPropertyController()
        propertyController.preView = self.preView
        propertyController.view.frame = self.rightBox.contentView!.bounds
        propertyController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        
        self.right_gotoViewController(viewController: propertyController)
        
        propertyController.rightButtonClick = {
            (index: Int) -> () in
            
            /// 创建背景
            self.gotoCreateController()
        }
        
        propertyController.menuItemClick = {
            (itemIndex: Int, model: KMBackgroundModel) in
            self.gotoEditController(model: model)
            
        }
        
        propertyController.templateDidSelected = {
            (model: KMBackgroundModel, isSelected: Bool) in
            if (isSelected) {
                self.model = model
                self.topBarView.isCanApply(can: true)
            } else {
                self.model = nil
                self.topBarView.isCanApply(can: false)
            }
        }
    }
    
    func gotoCreateController() {
        let createController = KMCreateBackgroundController()
        createController.view.frame = self.rightBox.contentView!.bounds
        createController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        createController.preView = self.preView
        
        self.topBarView.isCanApply(can: true)
        
        self.right_gotoViewController(viewController: createController)
        
        createController.backClick = {
            self.gotoPropertyListController()
        }
        
        createController.rightButtonClick = {
            (index: Int) -> () in
            /// 保存到模板
            let templateModel = (self.rightViewController as! KMCreateBackgroundController).fetchTemplate()
            
            let result = KMBackgroundManager.defaultManager.addTemplate(model: templateModel as! KMBackgroundModel)
            if (result) {
                /// 返回模板列表
                self.gotoPropertyListController()
                let propertyConroller: KMBackgroundPropertyController = self.rightViewController as! KMBackgroundPropertyController
                if (index == 0) { /// 颜色
                    propertyConroller.selectTabIndex(index: 0)
                } else if (index == 1) { /// 文件
                    propertyConroller.selectTabIndex(index: 1)
                }
            }
        }
//        createController.modelDidChange = {
//            (model: KMBackgroundModel) in
            
            /// 模型已经修改,可以再这里刷新预览视图
//            self.model = model
//        }
    }
    
    func gotoEditController(model: KMBackgroundModel) {
        let editController = KMEditBackgroundController()
        editController.view.frame = self.rightBox.contentView!.bounds
        editController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
        editController.editModel = model
        
        self.right_gotoViewController(viewController: editController)
        
        editController.backClick = {
            let editController: KMEditBackgroundController = self.rightViewController as! KMEditBackgroundController
            if (editController.isEdited) {
                KMBackgroundManager.defaultManager.updateTemplate(model: editController.editModel)
            }
            
            self.gotoPropertyListController()
        }
    }
    
    func addBackground(model: KMBackgroundModel, toPath: String, completion: @escaping (_ result: Bool) -> ()) {
        DispatchQueue.global().async {
            let document: CPDFDocument = self.applyDocument!
            var property = document.background()
            
            property!.scale = model.scale
            property!.rotation = CGFloat(-model.rotation)
            property!.opacity = model.opacity
            property?.xOffset = model.horizontalSpace
            property?.yOffset = model.verticalSpace
            property?.horizontalAlignment = UInt(model.horizontalMode)
            property?.verticalAlignment = UInt(model.verticalMode)
            
            if (model.type == .color) {
                property?.color = model.color
                property?.type = .color
            } else if (model.type == .file) {
                property?.setImage(NSImage(contentsOfFile: model.imagePath))
//                property?.setImage(model.image)
                property?.type = .image
            }

            let pagesString = self.findPagesString(model)
            if (pagesString.isEmpty) {
                property?.pageString = "0-\(document.pageCount-1)"
            } else {
                property?.pageString = pagesString
            }
            property?.update()
            
            /// 保存到临时路径
            let documentPath = NSTemporaryDirectory()
            let tempPath: String = "\(documentPath)/\(toPath.lastPathComponent)"
            if (FileManager.default.fileExists(atPath: tempPath)) {
                try?FileManager.default.removeItem(atPath: tempPath)
            }
            
            let result = document.write(to: URL(fileURLWithPath: tempPath))
            if (result) {
                if (FileManager.default.fileExists(atPath: toPath)) {
                    try?FileManager.default.removeItem(atPath: toPath)
                }
                
                try?FileManager.default.moveItem(atPath: tempPath, toPath: toPath)
            } else {
                try?FileManager.default.removeItem(atPath: tempPath)
            }
            
            DispatchQueue.main.async {
                completion(result)
            }
        }
    }
    
    func deleteBackground(toPath: String, completion: @escaping (_ result: Bool) -> ()) {
        if (self.preView.document.allowsPrinting == false || self.preView.document.allowsCopying == false) {
            let alert = NSAlert()
            alert.alertStyle = .critical
            alert.messageText = NSLocalizedString("This PDF document's user permissions does not allow modifying, content copying and printing.", comment: "")
            alert.runModal()
            
            completion(false)
            return
        }
        
        DispatchQueue.global().async {
            let document: CPDFDocument = self.preView.document
            var property = document.background()
            property?.clear()
            
            /// 保存到临时路径
            let documentPath = NSTemporaryDirectory()
            let tempPath: String = "\(documentPath)/\(toPath.lastPathComponent)"
            if (FileManager.default.fileExists(atPath: tempPath)) {
                try?FileManager.default.removeItem(atPath: tempPath)
            }
            
            let result = document.write(to: URL(fileURLWithPath: tempPath))
            if (result) {
                if (FileManager.default.fileExists(atPath: toPath)) {
                    try?FileManager.default.removeItem(atPath: toPath)
                }
                
                try?FileManager.default.moveItem(atPath: tempPath, toPath: toPath)
            } else {
                try?FileManager.default.removeItem(atPath: tempPath)
            }
            
            DispatchQueue.main.async {
                completion(result)
            }
        }
    }
    
}