//
//  KMBatchRemoveWatermarkOperation.swift
//  PDF Reader Pro
//
//  Created by liujiajie on 2023/11/6.
//

import Foundation

class KMBatchRemoveWatermarkOperation: KMBatchOperation{
    var pdfDocument: CPDFDocument?
    
    override init(file: KMBatchOperateFile) {
        super.init(file: file)
       
    }
    override func start() {
        self.pdfDocument = CPDFDocument(url: URL(fileURLWithPath: self.operateFile?.filePath ?? ""))
        if let data = self.pdfDocument?.isLocked, data {
            self.pdfDocument?.unlock(withPassword: self.operateFile?.password)
        }
        if !self.isCancelled {
            self.delegate?.fileBeginOperate?(self.operateFile!, info: self.operateFile!.removeWatermarkInfo)
            willChangeValue(forKey: "isExecuting")
            self.hasExcuting = true
            didChangeValue(forKey: "isExecuting")
            if !FileManager.default.fileExists(atPath: self.operateFile!.filePath) {
                self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("File Not Exist", nil)), info: self.operateFile!.removeWatermarkInfo)
                
                self.willChangeValue(forKey: "isFinished")
                self.hasFinished = true
                self.didChangeValue(forKey: "isFinished")
                return
            }

            if self.pdfDocument == nil {
                self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", nil)), info: self.operateFile!.removeWatermarkInfo)
                self.willChangeValue(forKey: "isFinished")
                self.hasFinished = true
                self.didChangeValue(forKey: "isFinished")
                return
            }

            if !self.pdfDocument!.allowsPrinting || !self.pdfDocument!.allowsCopying {
                self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("This is a secured document. Editing is not permitted.", nil)), info: self.operateFile!.removeWatermarkInfo)
                self.willChangeValue(forKey: "isFinished")
                self.hasFinished = true
                self.didChangeValue(forKey: "isFinished")
                return
            }
            KMBatchRemoveWatermarkOperation.saveAsPDFRemoveAllWatermark(self.pdfDocument!, password: self.operateFile?.password, toPath: self.operateFile!.removeWatermarkInfo.fetchDestinationFilepath()!) { result in
                if result == 1 {
                    self.delegate?.fileOperateSuccessed?(self.operateFile!, info: self.operateFile!.removeWatermarkInfo)
                } else {
                    self.delegate?.fileOperateFailed?(self.operateFile!, error: self.defaultError() as NSError, info: self.operateFile!.removeWatermarkInfo)
                }
                self.willChangeValue(forKey: "isFinished")
                self.hasFinished = true
                self.didChangeValue(forKey: "isFinished")
            }
        }else {
            willChangeValue(forKey: "isFinished")
            willChangeValue(forKey: "isExecuting")
            hasExcuting = false
            hasFinished = true
            didChangeValue(forKey: "isExecuting")
            didChangeValue(forKey: "isFinished")
        }
    }
    override func cancel() {
//        super.cancel()
        if isExecuting { 
            operateFile!.removeWatermarkInfo.status = .Waiting
            if FileManager.default.fileExists(atPath: operateFile!.removeWatermarkInfo.outPutPath!) { try? FileManager.default.removeItem(atPath: operateFile!.removeWatermarkInfo.outPutPath!)
            }
            self.delegate?.fileOperateCanceled?(self.operateFile!, info: self.operateFile!.removeWatermarkInfo)
           
           willChangeValue(forKey: "isFinished")
           hasFinished = true
           didChangeValue(forKey: "isFinished")
       } else {
           willChangeValue(forKey: "isCancelled")
           hasCanceled = true
           didChangeValue(forKey: "isCancelled")
       }
    }
    
    func defaultError() -> Error {
        let errorDict: [String: Any] = [NSLocalizedDescriptionKey: NSLocalizedString("Remove Watermark Failed", comment: "")]
        let error = NSError(domain: "PDFReaderBatchErrorDomain", code: -1, userInfo: errorDict)
        return error
    }
    class func saveAsPDFRemoveAllWatermark(_ pdfDocument: CPDFDocument, password: String?, toPath path: String, completionHandler handler: @escaping (Int) -> Void) {
        let document = CPDFDocument(url: pdfDocument.documentURL)
        if let password = password {
            document?.unlock(withPassword: password)
        }
        let watermarks = document?.watermarks()
        for watermark in watermarks ?? [] {
            document?.removeWatermark(watermark)
        }
        let result = document?.write(to: URL(fileURLWithPath: path))
        DispatchQueue.main.async {
            if let result = result {
                handler(result ? 1 : 0)
            }
        }
    }
}