package sgc.portal.base.error;

import sgc.portal.base.i18n.I18nMessage;
import sgc.portal.base.exception.BusinessException;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import java.util.Locale;

/**
 * BaseException은 예외에 대한 다국어 서비스를 지원한다.
 * 본 클래스는 throw된 Exception이 BaseException인 경우 다국어 메시지로
 * 에러 메시지를 생성하고 다국어 메시지가 없는 경우 일반적인 예외 메시지를
 * 에러 메시지로 생성한다.
 *
 * @author YongSang
 */
@Component
public class I18nErrorMessageResolver implements ErrorMessageResolver {
    private final MessageSource messageSource;

    /**
     * Instantiates a new 18 n error message resolver.
     *
     * @param messageSource the message source
     */
    public I18nErrorMessageResolver(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
    
    @Override
    public String resolveErrorMessage(Throwable error) {
        BusinessException baseException = (BusinessException) error;
        I18nMessage i18nMessage = baseException.getI18nMessage();
        String message = baseException.getMessage();
        if (i18nMessage != null) {
            Locale locale = (i18nMessage.getLocale() == null) ? LocaleContextHolder.getLocale() : i18nMessage.getLocale();
            try {
                message = messageSource.getMessage(i18nMessage.getCode(), i18nMessage.getParameters(), locale);
                baseException.setBuisMessage(message);
            } catch (NoSuchMessageException e) {
                message = error.getMessage();
            }
        }
        return message;
    }

    @Override
    public boolean supports(Throwable error) {
        return error instanceof BusinessException;
    }
    
    @Override
    public int getOrder() {
        return 10;
    }
}