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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.otp.Otp;
import com.airlock.iam.core.misc.impl.email.HtmlEscapingUtil;
import com.airlock.iam.flow.shared.api.domain.model.message.EmailMessageProvider;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.application.configuration.message.GenericEmailMessageProviderConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@LogicForConfig(GenericEmailMessageProviderConfig.class)
public final class GenericEmailMessageProvider implements EmailMessageProvider {
   private final GenericEmailMessageProvider.GenericEmailMessageProviderSettings settings;
   private final ValueMapProvider valueProvider;
   private final MessageProviderHelper messageProvider;

   @Inject
   public GenericEmailMessageProvider(
      GenericEmailMessageProvider.GenericEmailMessageProviderSettings settings, ValueMapProvider valueProvider, MessageProviderHelper messageProvider
   ) {
      this.settings = settings;
      this.valueProvider = valueProvider;
      this.messageProvider = messageProvider;
   }

   @Override
   public String generateSubject() {
      return this.messageProvider.translateMessage(this.settings.getSubjectResourceKey(), this.valueProvider);
   }

   @Override
   public String generateBody(Optional<Otp> otp, boolean isHtml) {
      return this.messageProvider
         .translateMessage(
            this.settings.getBodyResourceKey(),
            () -> HtmlEscapingUtil.sanitize(this.valuesWithToken(otp), isHtml && this.settings.isEscapeValuesInHtmlContext())
         );
   }

   @Override
   public String generateBody(URI link, boolean isHtml) {
      return this.messageProvider
         .translateMessage(
            this.settings.getBodyResourceKey(),
            () -> HtmlEscapingUtil.sanitize(this.valuesWithLink(link), isHtml && this.settings.isEscapeValuesInHtmlContext())
         );
   }

   private Map<String, Object> valuesWithToken(Optional<Otp> otp) {
      Map<String, Object> values = new HashMap<>(this.valueProvider.provideValueMap());
      otp.ifPresent(token -> values.put("TOKEN", token.rawValue()));
      return values;
   }

   private Map<String, Object> valuesWithLink(URI link) {
      Map<String, Object> values = new HashMap<>(this.valueProvider.provideValueMap());
      values.put("LINK", link.toASCIIString());
      return values;
   }

   public static final class GenericEmailMessageProviderSettings {
      private final String subjectResourceKey;
      private final String bodyResourceKey;
      private final boolean escapeValuesInHtmlContext;

      @SuppressFBWarnings(justification = "generated code")
      public static GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder builder() {
         return new GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder();
      }

      @SuppressFBWarnings(justification = "generated code")
      public String getSubjectResourceKey() {
         return this.subjectResourceKey;
      }

      @SuppressFBWarnings(justification = "generated code")
      public String getBodyResourceKey() {
         return this.bodyResourceKey;
      }

      @SuppressFBWarnings(justification = "generated code")
      public boolean isEscapeValuesInHtmlContext() {
         return this.escapeValuesInHtmlContext;
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public boolean equals(Object o) {
         if (o == this) {
            return true;
         } else if (!(o instanceof GenericEmailMessageProvider.GenericEmailMessageProviderSettings other)) {
            return false;
         } else if (this.escapeValuesInHtmlContext != other.escapeValuesInHtmlContext) {
            return false;
         } else {
            Object this$subjectResourceKey = this.subjectResourceKey;
            Object other$subjectResourceKey = other.subjectResourceKey;
            if (this$subjectResourceKey == null ? other$subjectResourceKey == null : this$subjectResourceKey.equals(other$subjectResourceKey)) {
               Object this$bodyResourceKey = this.bodyResourceKey;
               Object other$bodyResourceKey = other.bodyResourceKey;
               return this$bodyResourceKey == null ? other$bodyResourceKey == null : this$bodyResourceKey.equals(other$bodyResourceKey);
            } else {
               return false;
            }
         }
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public int hashCode() {
         int PRIME = 59;
         int result = 1;
         result = result * 59 + (this.escapeValuesInHtmlContext ? 79 : 97);
         Object $subjectResourceKey = this.subjectResourceKey;
         result = result * 59 + ($subjectResourceKey == null ? 43 : $subjectResourceKey.hashCode());
         Object $bodyResourceKey = this.bodyResourceKey;
         return result * 59 + ($bodyResourceKey == null ? 43 : $bodyResourceKey.hashCode());
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "GenericEmailMessageProvider.GenericEmailMessageProviderSettings(subjectResourceKey="
            + this.getSubjectResourceKey()
            + ", bodyResourceKey="
            + this.getBodyResourceKey()
            + ", escapeValuesInHtmlContext="
            + this.isEscapeValuesInHtmlContext()
            + ")";
      }

      @SuppressFBWarnings(justification = "generated code")
      public GenericEmailMessageProviderSettings(String subjectResourceKey, String bodyResourceKey, boolean escapeValuesInHtmlContext) {
         this.subjectResourceKey = subjectResourceKey;
         this.bodyResourceKey = bodyResourceKey;
         this.escapeValuesInHtmlContext = escapeValuesInHtmlContext;
      }

      @SuppressFBWarnings(justification = "generated code")
      public static class GenericEmailMessageProviderSettingsBuilder {
         @SuppressFBWarnings(justification = "generated code")
         private String subjectResourceKey;
         @SuppressFBWarnings(justification = "generated code")
         private String bodyResourceKey;
         @SuppressFBWarnings(justification = "generated code")
         private boolean escapeValuesInHtmlContext;

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

         @SuppressFBWarnings(justification = "generated code")
         public GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder subjectResourceKey(
            String subjectResourceKey
         ) {
            this.subjectResourceKey = subjectResourceKey;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder bodyResourceKey(
            String bodyResourceKey
         ) {
            this.bodyResourceKey = bodyResourceKey;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder escapeValuesInHtmlContext(
            boolean escapeValuesInHtmlContext
         ) {
            this.escapeValuesInHtmlContext = escapeValuesInHtmlContext;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public GenericEmailMessageProvider.GenericEmailMessageProviderSettings build() {
            return new GenericEmailMessageProvider.GenericEmailMessageProviderSettings(
               this.subjectResourceKey, this.bodyResourceKey, this.escapeValuesInHtmlContext
            );
         }

         @SuppressFBWarnings(justification = "generated code")
         @Override
         public String toString() {
            return "GenericEmailMessageProvider.GenericEmailMessageProviderSettings.GenericEmailMessageProviderSettingsBuilder(subjectResourceKey="
               + this.subjectResourceKey
               + ", bodyResourceKey="
               + this.bodyResourceKey
               + ", escapeValuesInHtmlContext="
               + this.escapeValuesInHtmlContext
               + ")";
         }
      }
   }
}
