package com.sun.identity.shared.locale;

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

public class L10NMessageImpl extends Exception implements L10NMessage {
   private final AMResourceBundleCache amCache = AMResourceBundleCache.getInstance();
   private String message;
   private String bundleName;
   private String errorCode;
   private Object[] args;
   private ResourceBundle bundle;

   public L10NMessageImpl(String msg) {
      super(msg);
   }

   public L10NMessageImpl(String rbName, String errorCode, Object[] args) {
      this.bundleName = rbName;
      this.errorCode = errorCode;
      this.args = args;
      this.message = this.getL10NMessage(java.util.Locale.ENGLISH);
   }

   public L10NMessageImpl(Throwable ex) {
      this.message = ex.getMessage();
      if (ex instanceof L10NMessage lex) {
         this.bundleName = lex.getResourceBundleName();
         this.errorCode = lex.getErrorCode();
         this.args = lex.getMessageArgs();
      }
   }

   @Override
   public String getL10NMessage(java.util.Locale locale) {
      if (this.errorCode == null) {
         return this.getMessage();
      }

      String result = this.message;
      if (this.bundleName != null && locale != null) {
         this.bundle = this.amCache.getResBundle(this.bundleName, locale);
         String mid = this.bundle.getString(this.errorCode);
         if (this.args != null && this.args.length != 0) {
            result = MessageFormat.format(mid, this.args);
         } else {
            result = mid;
         }
      }

      return result;
   }

   @Override
   public String getResourceBundleName() {
      return this.bundleName;
   }

   @Override
   public String getErrorCode() {
      return this.errorCode;
   }

   @Override
   public Object[] getMessageArgs() {
      return this.args;
   }

   @Override
   public final String getMessage() {
      return this.message != null ? this.message : super.getMessage();
   }
}
