package com.sun.identity.saml2.common;

import com.sun.identity.shared.encode.URLEncDec;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public enum SignatureAlgorithm {
   RSA_SHA1("SHA1withRSA", "http://www.w3.org/2000/09/xmldsig#rsa-sha1"),
   RSA_SHA256("SHA256withRSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"),
   RSA_SHA384("SHA384withRSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"),
   RSA_SHA512("SHA512withRSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"),
   RSA_MD5("MD5withRSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-md5"),
   DSA_SHA1("SHA1withDSA", "http://www.w3.org/2000/09/xmldsig#dsa-sha1");

   public static final String ALLOWED_XML_ALGORITHMS_KEY = "allowedXmlAlgorithms";
   private final String algorithm;
   private final String uri;

   SignatureAlgorithm(String algorithm, String uri) {
      this.algorithm = algorithm;
      this.uri = uri;
   }

   @Override
   public String toString() {
      return "SignatureAlgorithm[algorithm=" + this.algorithm + ", uri=" + this.uri + "]";
   }

   public static SignatureAlgorithm forUri(String uri) throws IllegalArgumentException {
      for (SignatureAlgorithm alg : values()) {
         if (alg.getUri().equals(uri)) {
            return alg;
         }
      }

      throw new IllegalArgumentException("Unsupported URI: " + uri);
   }

   public String getUri() {
      return this.uri;
   }

   public String getAlgorithm() {
      return this.algorithm;
   }

   public static List<SignatureAlgorithm> convertAllowedAlgosStringToList(String algorithms) {
      return algorithms != null && !algorithms.isEmpty()
         ? Pattern.compile(",").splitAsStream(algorithms).map(algo -> URLEncDec.decode(algo)).map(algo -> forUri(algo)).collect(Collectors.toList())
         : new ArrayList<>();
   }

   public static String convertAllowedAlgosListToString(List<String> algorithms) {
      return algorithms.stream().map(algo -> URLEncDec.encode(algo)).collect(Collectors.joining(","));
   }
}
