//
//  SettingsStorePlugin.swift
//  Astro
//
//  Created by Liz Cross on 2016-12-20.
//  Copyright © 2016 Mobify Research & Development Inc. All rights reserved.
//

import Foundation

class SettingsStore: BaseMessageReceiver, Addressable {
    @objc let address: MessageAddress = "AstroSettingsStore:0"

    init(messageBus: MessageBus) {
        super.init()

        self.addRpcMethodShim("set") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let key: String = MethodShimUtils.getArg(params, key: "key", respond: respond),
                let value: String = MethodShimUtils.getArg(params, key: "value", respond: respond) {
                self.set(key, value: value, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }

        self.addRpcMethodShim("get") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let key: String = MethodShimUtils.getArg(params, key: "key", respond: respond) {
                self.get(key, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }

        self.addRpcMethodShim("delete") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let key: String = MethodShimUtils.getArg(params, key: "key", respond: respond) {
                self.delete(key, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }

        messageBus.register(self)
    }

    // @RpcMethod
    func set(_ key: String, value: String, respond: RPCMethodCallback) {
        if key.isEmpty {
            respond(.error("Cannot store an empty key"))
            return
        }

        UserDefaults.standard.set(value, forKey: key)
    }

    // @RpcMethod
    func get(_ key: String, respond: RPCMethodCallback) {
        if key.isEmpty {
            respond(.error("Empty keys are not valid"))
            return
        }

        guard let value = UserDefaults.standard.string(forKey: key) else {
            respond(.result(NSNull()))
            return
        }

        respond(.result(value))
        return
    }

    // @RpcMethod
    func delete(_ key: String, respond: RPCMethodCallback) {
        if key.isEmpty {
            respond(.error("Empty keys are not valid"))
            return
        }
        UserDefaults.standard.removeObject(forKey: key)
    }
}
