package com.airlock.iam.flow.shared.domain.model.message;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.misc.message.MessageTemplate;
import com.airlock.iam.common.api.domain.model.user.CurrentLocale;
import com.airlock.iam.core.misc.impl.authen.StringResourceProvider;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.util.Map;

public final class MessageProviderHelper {
   private static final ELogger LOG = ELoggerFactory.getLogger(MessageProviderHelper.class);
   private final StringResourceProvider stringResourceProvider;
   private final CurrentLocale locale;

   @Inject
   public MessageProviderHelper(StringResourceProvider stringResourceProvider, CurrentLocale locale) {
      this.stringResourceProvider = stringResourceProvider;
      this.locale = locale;
   }

   String translateGrowableMessage(String resourceKeyTemplate, int maxTextLength, ValueMapProvider valueProvider) {
      Map<String, Object> values = valueProvider.provideValueMap();
      String resolvedResourceKey = MessageTemplate.fromNamedParameters(resourceKeyTemplate, values)
         .formatNonGrowableMessage()
         .orElseThrow(() -> new FailureException("Unable to resolve resource key: " + resourceKeyTemplate));
      String template = this.stringResourceProvider
         .translateResourceKey(this.locale.get(), resolvedResourceKey)
         .orElseThrow(() -> new FailureException("Cannot find translation for key: " + resolvedResourceKey));
      return MessageTemplate.fromNamedParameters(template, values)
         .formatGrowableMessage(maxTextLength)
         .orElseThrow(
            () -> new FailureException(
               String.format(
                  "Cannot create small enough message for template: \"%s\" with resource key: \"%s\" and maximum message length of: %d",
                  template,
                  resolvedResourceKey,
                  maxTextLength
               )
            )
         );
   }

   String translateMessage(String resourceKeyTemplate, ValueMapProvider valueProvider) {
      return this.translateGrowableMessage(resourceKeyTemplate, Integer.MAX_VALUE, valueProvider);
   }

   @SuppressFBWarnings(justification = "generated code")
   public static MessageProviderHelper.MessageProviderHelperBuilder builder() {
      return new MessageProviderHelper.MessageProviderHelperBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class MessageProviderHelperBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private StringResourceProvider stringResourceProvider;
      @SuppressFBWarnings(justification = "generated code")
      private CurrentLocale locale;

      @SuppressFBWarnings(justification = "generated code")
      MessageProviderHelperBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public MessageProviderHelper.MessageProviderHelperBuilder stringResourceProvider(StringResourceProvider stringResourceProvider) {
         this.stringResourceProvider = stringResourceProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MessageProviderHelper.MessageProviderHelperBuilder locale(CurrentLocale locale) {
         this.locale = locale;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MessageProviderHelper build() {
         return new MessageProviderHelper(this.stringResourceProvider, this.locale);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "MessageProviderHelper.MessageProviderHelperBuilder(stringResourceProvider=" + this.stringResourceProvider + ", locale=" + this.locale + ")";
      }
   }
}
