//
//  KMCompareFilesConfig.swift
//  PDF Reader Pro
//
//  Created by lizhe on 2023/11/16.
//

import Cocoa
let PDFCompareISCompareTextFilesKey =  "PDFCompareISCompareTextFiles1"
let PDFCompareISCompareImageFilesKey = "PDFCompareISCompareImageFiles1"
let PDFCompareInsertColorFilesKey =    "PDFCompareInsertColorFiles"
let PDFCompareInsertOpacityFilesKey =    "PDFCompareInsertOpacityFiles"
let PDFCompareDeleteColorFilesKey =    "PDFCompareDeleteColorFiles"
let PDFCompareDeleteOpacityFilesKey =    "PDFCompareDeleteOpacityFiles"
let PDFCompareReplaceColorFilesKey =   "PDFCompareReplaceColorFiles"
let PDFCompareReplaceOpacityFilesKey =   "PDFCompareReplaceOpacityFiles"
let PDFCompareOldStrokeColorFilesKey = "PDFCompareOldStrokeColorFiles"
let PDFCompareNewStrokeColorFilesKey = "PDFCompareNewStrokeColorFiles"
let PDFCompareNewStrokeOpacityFilesKey = "PDFCompareNewStrokeOpacityFiles"
let PDFCompareOldStrokeOpacityFilesKey = "PDFCompareOldStrokeOpacityFiles"
let PDFCompareNewFillOpacityFilesKey = "PDFCompareNewFillOpacityFiles"
let PDFCompareOldFillOpacityFilesKey = "PDFCompareOldFillOpacityFiles"
let PDFCompareIsNOFillFilesKey = "PDFCompareIsNOFillFiles"
let PDFComparePDFBlendModeFilesKey = "PDFComparePDFBlendModeFiles"

class KMCompareFilesConfig {

    static let defaultConfig: KMCompareFilesConfig = KMCompareFilesConfig()

    var fileNewAttribute: KMFileAttribute = KMFileAttribute()
    var fileOldAttribute: KMFileAttribute = KMFileAttribute()
    
    func setColor(_ color: NSColor?, forKey key: String) {
        let data = color != nil ? NSArchiver.archivedData(withRootObject: color!) : NSArchiver.archivedData(withRootObject: NSColor.red)
        UserDefaults.standard.set(data, forKey: key)
    }

    func colorForKey(_ key: String) -> NSColor? {
        var color: NSColor?
        if let data = UserDefaults.standard.data(forKey: key) {
            color = NSUnarchiver.unarchiveObject(with: data) as? NSColor
        } else if let array = UserDefaults.standard.array(forKey: key), array.count > 0 {
            var red, green, blue, alpha: CGFloat
            red =  CGFloat(array[0] as! Double)
            green = CGFloat(array[0] as! Double)
            blue = CGFloat(array[0] as! Double)
            
            if array.count > 2 {
                green = CGFloat(array[1] as! Double)
                blue = CGFloat(array[2] as! Double)
            }
            if array.count == 2 {
                alpha = CGFloat(array[1] as! Double)
            } else if array.count > 3 {
                alpha = CGFloat(array[3] as! Double)
            } else {
                alpha = 1.0
            }
            color = NSColor(calibratedRed: red, green: green, blue: blue, alpha: alpha)
        }
        return color
    }

    func setIsCompareText(_ isCompareText: Bool) {
        UserDefaults.standard.set(isCompareText, forKey: PDFCompareISCompareTextFilesKey)
    }

    func isCompareText() -> Bool {
        if UserDefaults.standard.object(forKey: PDFCompareISCompareTextFilesKey) != nil {
            return UserDefaults.standard.bool(forKey: PDFCompareISCompareTextFilesKey)
        } else {
            return true
        }
         
        
    }

    func setIsCompareImage(_ isCompareImage: Bool) {
        UserDefaults.standard.set(isCompareImage, forKey: PDFCompareISCompareImageFilesKey)
    }

    func isCompareImage() -> Bool {
        if UserDefaults.standard.object(forKey: PDFCompareISCompareImageFilesKey) != nil {
            return UserDefaults.standard.bool(forKey: PDFCompareISCompareImageFilesKey)
        } else {
            return true
        }
    }

    func setInsertColor(_ insertColor: NSColor?) {
        setColor(insertColor, forKey: PDFCompareInsertColorFilesKey)
    }

    func insertColor() -> NSColor {
        guard let color = colorForKey(PDFCompareInsertColorFilesKey) else {
            return NSColor.green
        }
        return color
    }

    func setInsertOpacity(_ insertOpacity: CGFloat) {
        UserDefaults.standard.set(insertOpacity, forKey: PDFCompareInsertOpacityFilesKey)
    }

    func insertOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareInsertOpacityFilesKey) as? CGFloat {
            return value
        }
        return 0.2
    }

    func setDeleteColor(_ deleteColor: NSColor?) {
        setColor(deleteColor, forKey: PDFCompareDeleteColorFilesKey)
    }

    func deleteColor() -> NSColor {
        guard let color = colorForKey(PDFCompareDeleteColorFilesKey) else {
            return NSColor.red
        }
        return color
    }

    func setDeleteOpacity(_ deleteOpacity: CGFloat) {
        UserDefaults.standard.set(deleteOpacity, forKey: PDFCompareDeleteOpacityFilesKey)
    }

    func deleteOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareDeleteOpacityFilesKey) as? CGFloat {
            return value
        }
        return 0.2
    }

    func setReplaceColor(_ replaceColor: NSColor?) {
        setColor(replaceColor, forKey: PDFCompareReplaceColorFilesKey)
    }

    func replaceColor() -> NSColor {
        guard let color = colorForKey(PDFCompareReplaceColorFilesKey) else {
            return NSColor.blue
        }
        return color
    }

    func setReplaceOpacity(_ replaceOpacity: CGFloat) {
        UserDefaults.standard.set(replaceOpacity, forKey: PDFCompareReplaceOpacityFilesKey)
    }

    func replaceOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareReplaceOpacityFilesKey) as? CGFloat {
            return value
        }
        return 0.2
    }

    func setOldStrokeColor(_ oldStrokeColor: NSColor?) {
        setColor(oldStrokeColor, forKey: PDFCompareOldStrokeColorFilesKey)
    }

    func oldStrokeColor() -> NSColor {
        guard let color = colorForKey(PDFCompareOldStrokeColorFilesKey) else {
            return NSColor(calibratedRed: 245.0/255.0, green: 40.0/255.0, blue: 27.0/255.0, alpha: 1.0)
        }
        return color
    }

    func setNewStrokeColor(_ newStrokeColor: NSColor?) {
        setColor(newStrokeColor, forKey: PDFCompareNewStrokeColorFilesKey)
    }

    func newStrokeColor() -> NSColor {
        guard let color = colorForKey(PDFCompareNewStrokeColorFilesKey) else {
            return NSColor(calibratedRed: 49.0/255.0, green: 193.0/255.0, blue: 255.0/255.0, alpha: 1.0)
        }
        return color
    }

    func setNewStrokeOpacity(_ newStrokeOpacity: CGFloat) {
        UserDefaults.standard.set(newStrokeOpacity, forKey: PDFCompareNewStrokeOpacityFilesKey)
    }

    func newStrokeOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareNewStrokeOpacityFilesKey) as? CGFloat {
            return value
        }
        return 1.0
    }

    func setOldStrokeOpacity(_ oldStrokeOpacity: CGFloat) {
        UserDefaults.standard.set(oldStrokeOpacity, forKey: PDFCompareOldStrokeOpacityFilesKey)
    }

    func oldStrokeOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareOldStrokeOpacityFilesKey) as? CGFloat {
            return value
        }
        return 1.0
    }

    func setNewFillOpacity(_ newFillOpacity: CGFloat) {
        UserDefaults.standard.set(newFillOpacity, forKey: PDFCompareNewFillOpacityFilesKey)
    }

    func newFillOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareNewFillOpacityFilesKey) as? CGFloat {
            return value
        }
        return 1.0
    }

    func setOldFillOpacity(_ oldFillOpacity: CGFloat) {
        UserDefaults.standard.set(oldFillOpacity, forKey: PDFCompareOldFillOpacityFilesKey)
    }

    func oldFillOpacity() -> CGFloat {
        if let value = UserDefaults.standard.value(forKey: PDFCompareOldFillOpacityFilesKey) as? CGFloat {
            return value
        }
        return 1.0
    }

    func setIsNOFill(_ isNOFill: Bool) {
        UserDefaults.standard.set(isNOFill, forKey: PDFCompareIsNOFillFilesKey)
    }

    func isNOFill() -> Bool {
        return UserDefaults.standard.bool(forKey: PDFCompareIsNOFillFilesKey)
    }

    func setBlendMod(_ blendMod: CPDFBlendMode) {
        UserDefaults.standard.set(blendMod.rawValue, forKey: PDFComparePDFBlendModeFilesKey)
    }

    func blendMod() -> CPDFBlendMode {
        if let value = UserDefaults.standard.value(forKey: PDFComparePDFBlendModeFilesKey) as? Int,
           let blendMode = CPDFBlendMode(rawValue: value) {
            return blendMode
        }
        return CPDFBlendMode.darken
    }
}