//
//  DSignatureManager.swift
//  PDF Reader Pro Edition
//
//  Created by Niehaoyu on 2023/9/28.
//

import Cocoa

class DSignatureManager: NSObject {
    
    public static let manager = DSignatureManager.init()
    
    lazy var signatures: NSArray = []
    
    override init() {
        super.init()
        
        self.loadAllKeyChainCertificates()
//        self.getAllKeychainItems()
         
    }
    
    func loadAllKeyChainCertificates () {

        let keychainQuery: [String: Any] = [
          kSecClass as String : kSecClassIdentity,
          kSecReturnData as String  : true,
          kSecReturnAttributes as String : true,
          kSecReturnRef as String : true,
          kSecMatchLimit as String: kSecMatchLimitAll,
          kSecReturnPersistentRef as String: true
        ]
        
        
        var results: AnyObject?
//        let status = SecItemCopyMatching(keychainQuery as CFDictionary, &results)
        
        let status = withUnsafeMutablePointer(to: &results) {
          SecItemCopyMatching(keychainQuery as CFDictionary, UnsafeMutablePointer($0))
        }
        
        var resultArr = results as! NSArray;

        for result in resultArr {

            let tResult = result as![String:Any]

            let identify = tResult[kSecValueRef as String] as! AnyObject
 

            var certificate: SecCertificate?
//            let status = SecIdentityCopyCertificate(identify, &certificate)
//            if (status == errSecSuccess) {
                
                let label = tResult[kSecAttrLabel as String] as? String
                
                let account = tResult[kSecAttrAccount as String] as? String
                
                guard let Issuer = tResult[kSecAttrIssuer as String] as? Data else { return  }
                let IssuerKey = String(data: Issuer, encoding: .utf8)
                
                let valueReflabel = tResult[kSecValueRef as String] as? String
                
                guard let data = tResult[kSecValueData as String] as? Data else {
                    return
                }
                let dataKey = String(data: data, encoding: .utf8)
                
                if let key = tResult[kSecAttrLabel as String] as? String,
                   let value = tResult[kSecValueData as String] as? Data {
                    print(value)
                }
                else if let key = tResult[kSecAttrLabel as String] as? String,
                        let value = tResult[kSecValueRef as String] {
                    print(value)
                    
                }
                
                print("adsf")
//                {
//                    values[key] = String(data: value, encoding:.utf8) as AnyObject?
//                }
//            }

//            SecIdentityCopyCertificate(identify, &certificate)




        }
 
    }
    
    func getAllKeychainItems() {
        
        let classes = [kSecClassGenericPassword as String,  // Generic password items
                       kSecClassInternetPassword as String, // Internet password items
                       kSecClassCertificate as String,      // Certificate items
                       kSecClassKey as String,              // Cryptographic key items
                       kSecClassIdentity as String]         // Identity items
        
        
//        classes.forEach { secClass in
          let items = getAllKeyChainItemsOfClass( kSecClassIdentity as String )
          NSLog(items.description)
//        }
      }
    
    func getAllKeyChainItemsOfClass(_ secClass: String) -> [String: AnyObject] {
        
        let query: [String: Any] = [
          kSecClass as String : secClass,
          kSecReturnData as String  : true,
          kSecReturnAttributes as String : true,
          kSecReturnRef as String : true,
          kSecMatchLimit as String: kSecMatchLimitAll,
        ]
        
        var result: AnyObject?
        
        let lastResultCode = withUnsafeMutablePointer(to: &result) {
          SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
        }
        
        var values = [String: AnyObject]()
        if lastResultCode == noErr {
            let array = result as? Array<Dictionary<String, Any>>
            
            for item in array! {
                
                let value = item[kSecAttrLabel as String] as? String
                
                if let key = item[kSecAttrAccount as String] as? String,
                   let value = item[kSecValueData as String] as? Data {
                    values[key] = String(data: value, encoding:.utf8) as AnyObject?
                }
                else if let key = item[kSecAttrLabel as String] as? String,
                        let value = item[kSecValueRef as String] {
                    print(value)
                    values[key] = value as AnyObject
                }
        
            }
        }
        return values
      }
    

}