//
//  NSScriptCommand+NetNewsWire.swift
//  NetNewsWire
//
//  Created by Olof Hellman on 3/4/18.
//  Copyright © 2018 Olof Hellman. All rights reserved.
//

import Foundation
import Account

extension NSScriptCommand {
    func property(forKey key: String) -> Any? {
        if let evaluatedArguments = self.evaluatedArguments {
            if let props = evaluatedArguments["KeyDictionary"] as? [String: Any] {
                return props[key]
            }
        }
        return nil
    }

    func isCreateCommand(forClass whatClass: String) -> Bool {
        guard let arguments = self.arguments else {return false}
        guard let newObjectClass = arguments["ObjectClass"] as? Int else {return false}
        guard newObjectClass.fourCharCode == whatClass.fourCharCode else {return false}
        return true
    }

    func accountAndFolderForNewChild() -> (Account, Folder?) {
        let appleEvent = self.appleEvent
        var account = AccountManager.shared.defaultAccount
        var folder: Folder?
        if let appleEvent = appleEvent {
            var descriptorToConsider: NSAppleEventDescriptor?
            if let insertionLocationDescriptor = appleEvent.paramDescriptor(forKeyword: keyAEInsertHere) {
                 print("insertionLocation : \(insertionLocationDescriptor)")
                 // insertion location can be a typeObjectSpecifier, e.g.  'in account "Acct"'
                 // or a typeInsertionLocation, e.g.   'at end of folder "
                 if insertionLocationDescriptor.descriptorType == "insl".fourCharCode {
                     descriptorToConsider = insertionLocationDescriptor.forKeyword("kobj".fourCharCode)
                 } else if insertionLocationDescriptor.descriptorType == "obj ".fourCharCode {
                     descriptorToConsider = insertionLocationDescriptor
                 }
            } else if let subjectDescriptor = appleEvent.attributeDescriptor(forKeyword: "subj".fourCharCode) {
                descriptorToConsider = subjectDescriptor
            }

            if let descriptorToConsider = descriptorToConsider {
                guard let newContainerSpecifier = NSScriptObjectSpecifier(descriptor: descriptorToConsider) else {return (account, folder)}
                let newContainer = newContainerSpecifier.objectsByEvaluatingSpecifier
                if let scriptableAccount = newContainer as? ScriptableAccount {
                    account = scriptableAccount.account
                } else if let scriptableFolder = newContainer as? ScriptableFolder {
                    if let folderAccount = scriptableFolder.folder.account {
                        folder = scriptableFolder.folder
                        account = folderAccount
                    }
                }
            }
        }
        return (account, folder)
    }
}