package com.atlassian.stash.internal.i18n;

import com.atlassian.bitbucket.i18n.I18nKey;
import com.atlassian.bitbucket.i18n.I18nService;
import com.atlassian.bitbucket.i18n.KeyedMessage;
import org.springframework.context.MessageSource;

import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;

/**
 * An {@link I18nService} that uses a {@link MessageSource} for message generation.
 */
public class MessageSourceI18nService implements I18nService {
    private static final Object[] NO_ARGS = {};

    private final MessageSource messageSource;
    private final Locale defaultLocale;

    public MessageSourceI18nService(@Nonnull MessageSource messageSource, @Nonnull Locale defaultLocale) {
        this.messageSource = messageSource;
        this.defaultLocale = defaultLocale;
    }

    @Override
    @Nonnull
    public KeyedMessage createKeyedMessage(@Nonnull String key, @Nonnull Object... arguments) {
        return getKeyedText(key, key, arguments);
    }

    @Override
    @Nonnull
    public Map<String, String> getAllTranslationsForPrefix(@Nonnull String prefix) {
        return Collections.emptyMap();
    }

    @Override
    @Nonnull
    public Map<String, String> getAllTranslationsForPrefix(@Nonnull String prefix, @Nonnull Locale locale) {
        return Collections.emptyMap();
    }

    @Override
    @Nonnull
    public KeyedMessage getKeyedText(@Nonnull I18nKey i18nKey) {
        return getKeyedText(i18nKey.getKey(), null, i18nKey.getArguments());
    }

    @Override
    @Nonnull
    public KeyedMessage getKeyedText(@Nonnull String key, String fallbackMessage, @Nonnull Object... arguments) {
        String message = getText(key, fallbackElseKey(key, fallbackMessage), arguments);

        return new KeyedMessage(key, message, message);
    }

    @Override
    @Nonnull
    public String getMessage(@Nonnull String key, @Nonnull Object... arguments) {
        return getText(key, key, arguments);
    }

    @Override
    @Nonnull
    public String getMessage(@Nonnull I18nKey i18nKey) {
        return getText(i18nKey.getKey(), i18nKey.getKey(), i18nKey.getArguments());
    }

    @Override
    @Nonnull
    public String getMessagePattern(@Nonnull String key) {
        return getMessagePattern(key, key);
    }

    @Override
    @Nonnull
    public String getMessagePattern(@Nonnull Locale locale, @Nonnull String key) {
        return messageSource.getMessage(key, NO_ARGS, key, locale);
    }

    @Override
    @Nonnull
    public String getMessagePattern(@Nonnull String key, String fallbackMessage) {
        return messageSource.getMessage(key, NO_ARGS, fallbackElseKey(key, fallbackMessage), defaultLocale);
    }

    @Override
    @Nonnull
    public String getText(@Nonnull Locale locale, @Nonnull String key, String fallbackMessage, @Nonnull Object... arguments) {
        return messageSource.getMessage(key, arguments, fallbackElseKey(key, fallbackMessage), locale);
    }

    @Override
    @Nonnull
    public String getText(@Nonnull String key, String fallbackMessage, @Nonnull Object... arguments) {
        return messageSource.getMessage(key, arguments, fallbackElseKey(key, fallbackMessage), defaultLocale);
    }

    private String fallbackElseKey(String key, String fallbackMessage) {
        return fallbackMessage == null ? key : fallbackMessage;
    }
}
