package com.mobify.astro;

import android.support.annotation.NonNull;

import com.mobify.astro.messaging.EventRegistrar;
import com.mobify.astro.messaging.MessageSender;
import com.mobify.astro.messaging.RpcMessageListener;
import com.mobify.astro.messaging.annotations.RpcMethod;
import com.mobify.astro.utilities.LocalizationUtilities;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Locale;

public class LocalizationWrapper extends RpcMessageListener {

    private static final String ADDRESS = "AstroLocalization:0";
    private static final String KEY_COUNTRY = "country";
    private static final String KEY_LANGUAGE = "language";
    private static final String KEY_LOCALE = "locale";
    private LocalizationUtilities localizationUtilities;

    public LocalizationWrapper(LocalizationUtilities localizationUtilities, @NonNull EventRegistrar eventRegistrar, @NonNull MessageSender messageSender) {
        super(eventRegistrar, messageSender);
        this.localizationUtilities = localizationUtilities;
    }

    @Override
    public String getInstanceAddress() {
        return ADDRESS;
    }

    @RpcMethod(methodName = "getLanguage")
    public String getLanguage() {
        return localizationUtilities.getLanguage();
    }

    @RpcMethod(methodName = "setLanguage", parameterNames = {KEY_LANGUAGE})
    public void setLanguage(String language) {
        localizationUtilities.setLanguage(language);
    }

    @RpcMethod(methodName = "getCountry")
    public String getCountry() {
        return localizationUtilities.getCountry();
    }

    @RpcMethod(methodName = "setCountry", parameterNames = {KEY_COUNTRY})
    public void setCountry(String country) {
        localizationUtilities.setCountry(country);
    }

    @RpcMethod(methodName = "getLocale")
    public JSONObject getLocale() throws JSONException {
        JSONObject locale = new JSONObject();
        locale.put(KEY_COUNTRY, localizationUtilities.getCountry());
        locale.put(KEY_LANGUAGE, localizationUtilities.getLanguage());
        return locale;
    }

    @RpcMethod(methodName = "setLocale", parameterNames = {KEY_LOCALE})
    public void setLocale(JSONObject locale) throws JSONException {
        String country = locale.getString(KEY_COUNTRY);
        String language = locale.getString(KEY_LANGUAGE);
        if (country == null || language == null) {
            throw new JSONException("Country or language was null in JsonObject");
        }
        localizationUtilities.setLocale(new Locale(language, country));
    }

    @RpcMethod(methodName = "translate", parameterNames = {"key"})
    public String translate(String key) {
        return localizationUtilities.translate(key);
    }
}
