//
//  KMCompressView.swift
//  PDF Reader Pro
//
//  Created by lizhe on 2023/11/8.
//

import Cocoa

typealias KMCompressViewCancelAction = (_ view: KMCompressView ) -> Void
typealias KMCompressViewBatchAction = (_ view: KMCompressView ) -> Void
typealias KMCompressViewCompressAction = (_ view: KMCompressView, _ compressValue: Int) -> Void

class KMCompressView: KMBaseXibView {

    @IBOutlet weak var previewBox: KMBox!
    @IBOutlet weak var titleLabel: NSTextField!
    @IBOutlet weak var sizeLabel: NSTextField!
    @IBOutlet weak var finalSizeLabel: NSTextField!
    @IBOutlet weak var fileImageView: NSImageView!
    @IBOutlet weak var progressSizeLabel: NSTextField!
    @IBOutlet weak var progress: NSProgressIndicator!
    
    @IBOutlet weak var selectLabel: NSTextField!
    @IBOutlet weak var qulityMatrix: NSMatrix!
    
    @IBOutlet weak var lowLabel: NSTextField!
    @IBOutlet weak var hightLabel: NSTextField!
    @IBOutlet weak var qualitySlider: KMSlider!
    
    @IBOutlet weak var cancelButton: NSButton!
    @IBOutlet weak var compressButton: NSButton!
    @IBOutlet weak var batchButton: NSButton!
    
    var cancelAction: KMCompressViewCancelAction?
    var batchAction: KMCompressViewBatchAction?
    var compressAction: KMCompressViewCompressAction?
    
    var documentURL: URL? {
        didSet {
            self.reloadData()
        }
    }
    var password: String = ""
//    private var datas: [String] = []
//    var selectIndex = 2
//    
//    var limit = true
    var oriDocumentUrl: URL?
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // Drawing code here.
    }

    override func setup() {
        qulityMatrix.selectCell(atRow: 2, column: 0)
        
        lowLabel.textColor = KMAppearance.Layout.h0Color()
        hightLabel.textColor = KMAppearance.Layout.h0Color()
        
        previewBox.fillColor = NSColor.black.withAlphaComponent(0.04)
        previewBox.cornerRadius = 4.0
        
        progress.doubleValue = 0;
        progress.isHidden = true
        progressSizeLabel.isHidden = true
    }
    
    override func updateLanguage() {
        selectLabel.stringValue = NSLocalizedString("Optimization Options", comment: "")
        lowLabel.stringValue = NSLocalizedString("Low Quality", comment: "")
        hightLabel.stringValue = NSLocalizedString("High Quality", comment: "")
        cancelButton.title = NSLocalizedString("Cancel", comment: "")
        compressButton.title = NSLocalizedString("Compress", comment: "")
        batchButton.title = NSLocalizedString("Batch", comment: "")
        
        for cell in qulityMatrix.cells {
            var title = cell.title
            if title == "Other" {
                title = "Customize"
            }
            cell.title = NSLocalizedString(title, comment: "")
        }
    }
    
    override func reloadData() {
        let url = documentURL ?? URL(string: "")
        if url != nil {
            let filePath = url!.path
            let attrib = try? FileManager.default.attributesOfItem(atPath: filePath)
            if attrib != nil {
                let sizeFloat: Float = attrib![FileAttributeKey(rawValue: "NSFileSize")] as? Float ?? 0.0
                sizeLabel.stringValue = self.fileSizeString(sizeFloat)
                
                titleLabel.stringValue = filePath.lastPathComponent
                finalSizeLabel.isHidden = true
                
                let pdfDocument = CPDFDocument(url: url)
                pdfDocument?.unlock(withPassword: self.password)
                let page = pdfDocument?.page(at: 0) ?? CPDFPage()
                let image = page.thumbnail(of: page.size)
//                let image: NSImage = NSImage.previewForFile(path: url!, ofSize: fileImageView.bounds.size, asIcon: true) ?? NSImage()
                fileImageView.image = image;
            }
        }
    
        self.updateQulityMatrixState()
    }
    
    func updateQulityMatrixState() {
        if qulityMatrix.selectedRow == 4 {
            hightLabel.isEnabled = true
            lowLabel.isEnabled = true
            qualitySlider.isEnabled = true
            lowLabel.alphaValue = 1
            hightLabel.alphaValue = 1
            qualitySlider.tipEnabled = true
        } else {
            hightLabel.isEnabled = false
            lowLabel.isEnabled = false
            qualitySlider.isEnabled = false
            lowLabel.alphaValue = 0.4
            hightLabel.alphaValue = 0.4
            qualitySlider.tipEnabled = false
        }
    }
    
    func fileSizeString(_ fSize: Float) -> String {
        let fileSize = fSize / 1024
        let size = fileSize >= 1024 ? (fileSize < 1048576 ? fileSize/1024 : fileSize/1048576.0) : fileSize
        let unit = fileSize >= 1024 ? (fileSize < 1048576 ? "M" : "G") : "K"
        return String(format: "%0.1f %@", size, unit)
    }
}

//MARK: Action
extension KMCompressView {
    @IBAction func batchButtonAction(_ sender: Any) {
        guard let callBack = batchAction else { return }
        
        callBack(self)
    }
    
    @IBAction func cancelButtonAction(_ sender: Any) {
        guard let callBack = cancelAction else { return }
        
        callBack(self)
    }
    
    @IBAction func compressButtonAction(_ sender: Any) {
        guard let callBack = compressAction else { return }
        
        var compressVale = 60
        if (qulityMatrix.selectedRow == 0) {
            compressVale = 120
        } else if (qulityMatrix.selectedRow == 1) {
            compressVale = 90
        } else if (qulityMatrix.selectedRow == 2) {
            compressVale = 60
        } else if (qulityMatrix.selectedRow == 3) {
            compressVale = 30
        } else {
            compressVale = qualitySlider.integerValue
        }
        
        callBack(self, compressVale)
    }
    
    @IBAction func qulityMatrixAction(_ sender: Any) {
        self.updateQulityMatrixState()
    }
}