//
//  LocalizationWrapper.swift
//  Astro
//
//  Created by Jason Voll on 2016-06-28.
//  Copyright © 2016 Mobify Research & Development Inc. All rights reserved.
//

import Foundation

class LocalizationWrapper: BaseMessageReceiver, Addressable {
    @objc let address: MessageAddress = "AstroLocalization:0"
    @objc static let KEY_COUNTRY = "country"
    @objc static let KEY_LANGUAGE = "language"
    @objc static let KEY_LOCALE = "locale"

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

        self.addRpcMethodShim("getLanguage") { _, respond in
            ////////// This will be autogenerated at some point //////////
            self.getLanguage(respond)
            /////////////////////////////////////////////////////////////
        }

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

        self.addRpcMethodShim("getCountry") { _, respond in
            ////////// This will be autogenerated at some point //////////
            self.getCountry(respond)
            /////////////////////////////////////////////////////////////
        }

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

        self.addRpcMethodShim("setLocale") { params, respond in
            ////////// This will be autogenerated at some point //////////
            if let locale: JSONObject = MethodShimUtils.getArg(params, key: LocalizationWrapper.KEY_LOCALE, respond: respond) {
                self.setLocale(locale, respond: respond)
            }
            /////////////////////////////////////////////////////////////
        }

        self.addRpcMethodShim("getLocale") { _, respond in
            ////////// This will be autogenerated at some point //////////
            self.getLocale(respond)
            /////////////////////////////////////////////////////////////
        }

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

        messageBus.register(self)
    }

    // @RpcMethod
    func getLanguage(_ respond: RPCMethodCallback) {
        respond(.result(Localization.language))
    }

    // @RpcMethod
    func setLanguage(_ language: String, respond: RPCMethodCallback) {
        Localization.language = language
    }

    // @RpcMethod
    func getCountry(_ respond: RPCMethodCallback) {
        respond(.result(Localization.country))
    }

    // @RpcMethod
    func setCountry(_ country: String, respond: RPCMethodCallback) {
        Localization.country = country
    }

    // @RpcMethod
    func getLocale(_ respond: RPCMethodCallback) {
        let locale = [
            LocalizationWrapper.KEY_COUNTRY: Localization.country,
            LocalizationWrapper.KEY_LANGUAGE: Localization.language
        ]

        respond(.result(locale))
    }

    // @RpcMethod
    func setLocale(_ locale: JSONObject, respond: RPCMethodCallback) {
        guard let language = locale[LocalizationWrapper.KEY_LANGUAGE] as? String else {
            respond(.error("Could not get key \(LocalizationWrapper.KEY_LANGUAGE) from locale."))
            return
        }
        guard let country = locale[LocalizationWrapper.KEY_COUNTRY] as? String else {
            respond(.error("Could not get key \(LocalizationWrapper.KEY_COUNTRY) from locale."))
            return
        }
        Localization.locale = Locale(language: language, country: country)
    }

    // @RpcMethod
    func translate(_ key: String, respond: RPCMethodCallback) {
        respond(.result(Localization.translate(key)))
    }
}
