package com.airlock.iam.saml2.infrastructure.plugin.configuration;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.saml2.application.configuration.SamlFederationConfig;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.function.Function;
import org.w3c.dom.Document;

public class ExtendedIdpMetadataTransformer implements Function<String, String> {
   private final SamlFederationConfig samlFederationConfig;

   public ExtendedIdpMetadataTransformer(SamlFederationConfig samlFederationConfig) {
      this.samlFederationConfig = samlFederationConfig;
   }

   public String apply(String xml) {
      try (InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))) {
         Document doc = MetadataUtils.loadDocument(is);
         MetadataUtils.setExtendedAttributeValue(doc, "idpAuthncontextMapper", this.samlFederationConfig.getIdpAuthnContextMapper());
         MetadataUtils.setExtendedAttributeValue(doc, "idpAccountMapper", this.samlFederationConfig.getIdpAccountMapper());
         MetadataUtils.setExtendedAttributeValue(doc, "idpAttributeMapper", this.samlFederationConfig.getIdpAttributeMapper());
         return new String(MetadataUtils.getDocumentBytes(doc), StandardCharsets.UTF_8);
      } catch (IOException e) {
         throw new FailureException("Error closing ByteArrayInputStream: " + e.getMessage());
      }
   }
}
