package com.sun.identity.saml2.meta;

import com.airlock.iam.opensso.jaxb.entityconfig.AttributeType;
import com.airlock.iam.opensso.jaxb.entityconfig.BaseConfigType;
import com.airlock.iam.opensso.jaxb.metadata.EntityDescriptorElement;
import com.airlock.iam.opensso.jaxb.metadata.EntityDescriptorType;
import com.airlock.iam.opensso.jaxb.metadata.IDPSSODescriptorElement;
import com.airlock.iam.opensso.jaxb.metadata.IDPSSODescriptorType;
import com.airlock.iam.opensso.jaxb.metadata.RoleDescriptorType;
import com.airlock.iam.opensso.jaxb.metadata.SPSSODescriptorElement;
import com.airlock.iam.opensso.jaxb.metadata.SPSSODescriptorType;
import com.sun.identity.shared.debug.Debug;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.transform.stream.StreamSource;

public final class SAML2MetaUtils {
   static final String RESOURCE_BUNDLE_NAME = "libSAML2Meta";
   public static final Debug DEBUG = Debug.getInstance("libSAML2");
   private static final String JAXB_PACKAGES = "com.airlock.iam.opensso.jaxb.xmlenc:com.airlock.iam.opensso.jaxb.xmlsig:com.airlock.iam.opensso.jaxb.assertion:com.airlock.iam.opensso.jaxb.metadata:com.airlock.iam.opensso.jaxb.entityconfig";
   private static JAXBContext jaxbContext;

   private SAML2MetaUtils() {
   }

   public static JAXBContext getMetaJAXBContext() {
      return jaxbContext;
   }

   public static Object convertStringToJAXB(String str) throws JAXBException {
      Unmarshaller u = jaxbContext.createUnmarshaller();
      return u.unmarshal(new StreamSource(new StringReader(str)));
   }

   public static Map<String, List<String>> getAttributes(BaseConfigType config) {
      Map<String, List<String>> attrMap = new HashMap<>();

      for (AttributeType avp : config.getAttribute()) {
         attrMap.put(avp.getName() != null ? avp.getName().trim() : null, avp.getValue().stream().map(s -> s != null ? s.trim() : null).toList());
      }

      return attrMap;
   }

   public static String getRealmByMetaAlias(String metaAlias) {
      if (metaAlias == null) {
         return null;
      }

      int index = metaAlias.lastIndexOf("/");
      return index != -1 && index != 0 ? metaAlias.substring(0, index) : "/";
   }

   public static String getMetaAliasByUri(String uri) {
      if (uri == null) {
         return null;
      }

      int index = uri.indexOf("metaAlias");
      return index != -1 && index + 9 != uri.length() ? uri.substring(index + 9) : null;
   }

   public static SPSSODescriptorType getSPSSODescriptor(EntityDescriptorElement eDescriptor) {
      if (eDescriptor == null) {
         return null;
      }

      for (JAXBElement<? extends RoleDescriptorType> obj : ((EntityDescriptorType)eDescriptor.getValue())
         .getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor()) {
         if (obj instanceof SPSSODescriptorElement spsso) {
            return (SPSSODescriptorType)spsso.getValue();
         }
      }

      return null;
   }

   public static IDPSSODescriptorType getIDPSSODescriptor(EntityDescriptorElement eDescriptor) {
      if (eDescriptor == null) {
         return null;
      }

      for (JAXBElement<? extends RoleDescriptorType> obj : ((EntityDescriptorType)eDescriptor.getValue())
         .getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor()) {
         if (obj instanceof IDPSSODescriptorElement idpsso) {
            return (IDPSSODescriptorType)idpsso.getValue();
         }
      }

      return null;
   }

   static {
      try {
         jaxbContext = JAXBContext.newInstance(
            "com.airlock.iam.opensso.jaxb.xmlenc:com.airlock.iam.opensso.jaxb.xmlsig:com.airlock.iam.opensso.jaxb.assertion:com.airlock.iam.opensso.jaxb.metadata:com.airlock.iam.opensso.jaxb.entityconfig"
         );
      } catch (JAXBException jaxbe) {
         DEBUG.error("SAML2MetaUtils.static:", jaxbe);
      }
   }
}
