package org.jboss.resteasy.test.i18n;

import java.io.InputStream;
import java.util.Locale;
import java.util.Properties;

import org.jboss.logging.Logger;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;

/**
 *
 * @author <a href="ron.sigal@jboss.com">Ron Sigal</a>
 * @version $Revision: 1.1 $
 *
 *          Copyright Oct 8, 2014
 */
public abstract class TestMessagesParent {
    private static final Logger LOG = Logger.getLogger(TestMessagesParent.class);
    protected static Locale savedLocale;
    protected Properties properties = new Properties();

    @BeforeAll
    public static void beforeClass() {
        savedLocale = Locale.getDefault();
    }

    @AfterAll
    public static void afterClass() {
        Locale.setDefault(savedLocale);
        LOG.info("Reset default locale to: " + savedLocale);
    }

    public boolean before(Locale locale, String filename) throws Exception {
        LOG.info("default locale: " + Locale.getDefault());
        Locale.setDefault(locale);
        LOG.info("Set default locale to: " + locale);
        LOG.info("Messages file: " + filename);
        InputStream is = getClass().getClassLoader().getResourceAsStream(filename);
        if (is == null) {
            return false;
        }
        properties.load(is);
        return getExpectedNumberOfMethods() == properties.size();
    }

    protected String getExpected(String id, String message, Object... args) {
        String expected = "RESTEASY" + id + ": "
                + String.format(replacePositionalSpecifiers(String.class.cast(properties.get(message))), args);
        LOG.info("expected: " + expected);
        return expected;
    }

    protected String replacePositionalSpecifiers(String s) {
        //      LOG.info("before: " + s);
        int pos0 = s.indexOf("{0}");
        if (pos0 > -1) {
            s = s.substring(0, pos0) + "%1$s" + (pos0 + 3 >= s.length() ? "" : s.substring(pos0 + 3));
        }
        int pos1 = s.indexOf("{1}");
        if (pos1 > -1) {
            s = s.substring(0, pos1) + "%2$s" + (pos1 + 3 >= s.length() ? "" : s.substring(pos1 + 3));
        }
        int pos2 = s.indexOf("{2}");
        if (pos2 > -1) {
            s = s.substring(0, pos2) + "%3$s" + (pos2 + 3 >= s.length() ? "" : s.substring(pos2 + 3));
        }
        //      LOG.info("after: " + s);
        return s;
    }

    protected abstract int getExpectedNumberOfMethods();

    protected abstract Locale getLocale();
}
