package com.airlock.iam.common.domain.model.event;

import com.airlock.iam.base.domain.service.uri.UrlUtils;
import com.airlock.iam.common.domain.model.encoder.JsonValueMapEncoder;
import com.airlock.iam.common.domain.model.encoder.ValueMapEncoder;
import com.airlock.iam.common.domain.model.encoder.ValueMapStringEncoder;
import com.airlock.iam.plugin.framework.domain.model.property.EnumPropertyTranslator;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import java.util.function.Function;
import org.apache.commons.text.StringEscapeUtils;

public record RemoteEventSubscriberSettings(
   RemoteEventSubscriberSettings.HttpMethod httpMethod,
   String urlTemplate,
   Optional<String> bodyTemplate,
   String contentType,
   RemoteEventSubscriberSettings.ValueEncoding valueEncoding
) {
   public enum HttpMethod {
      GET,
      POST,
      PUT,
      DELETE;
   }

   public enum ValueEncoding implements EnumPropertyTranslator {
      NONE("No encoding (see security warning)", new ValueMapStringEncoder(Function.identity())),
      JSON("JSON escaping", new JsonValueMapEncoder()),
      XML10("XML 1.0 escaping", new ValueMapStringEncoder(StringEscapeUtils::escapeXml10)),
      XML11("XML 1.1 escaping", new ValueMapStringEncoder(StringEscapeUtils::escapeXml11)),
      POST("Form POST encoding", new ValueMapStringEncoder(UrlUtils::urlEncodeFormPost));

      private final String displayValue;
      private final ValueMapEncoder encoder;

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

      @SuppressFBWarnings(justification = "generated code")
      public ValueMapEncoder getEncoder() {
         return this.encoder;
      }

      @SuppressFBWarnings(justification = "generated code")
      ValueEncoding(final String displayValue, final ValueMapEncoder encoder) {
         this.displayValue = displayValue;
         this.encoder = encoder;
      }
   }
}
