/*
 * dnssecjava - a DNSSEC validating stub resolver for Java
 * Copyright (c) 2013-2015 Ingo Bauersachs
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */

package org.jitsi.dnssec;

import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * Utility class to retrieve messages from {@link ResourceBundle}s.
 */
public final class R {
    private static ResourceBundle rb;
    private static boolean useNeutral;

    private R() {
    }

    /**
     * Programmatically set the ResourceBundle to be used.
     *
     * @param resourceBundle the bundle to be used.
     */
    public static void setBundle(ResourceBundle resourceBundle) {
        R.rb = resourceBundle;
    }

    /**
     * If set to {@code true}, messages will not be obtained from resource bundles but formatted as
     * {@code key:param1:...:paramN}.
     *
     * @param useNeutral {@code true} to use neutral messages, {@code false} otherwise
     */
    public static void setUseNeutralMessages(boolean useNeutral) {
        R.useNeutral = useNeutral;
    }

    /**
     * Gets a translated message.
     *
     * @param key    The message key to retrieve.
     * @param values The values that fill placeholders in the message.
     * @return The formatted message.
     */
    public static String get(String key, Object... values) {
        if (useNeutral) {
            return getNeutral(key, values);
        }

        try {
            if (R.rb == null) {
                rb = ResourceBundle.getBundle("messages");
            }

            return MessageFormat.format(rb.getString(key), values);
        }
        catch (MissingResourceException e) {
            return getNeutral(key, values);
        }
    }

    private static String getNeutral(String key, Object[] values) {
        StringBuilder sb = new StringBuilder(key);
        for (Object val : values) {
            sb.append(":");
            sb.append(val);
        }

        return sb.toString();
    }
}
