package com.sun.identity.saml2.common;

import com.sun.identity.plugin.configuration.ConfigurationActionEvent;
import com.sun.identity.plugin.configuration.ConfigurationException;
import com.sun.identity.plugin.configuration.ConfigurationInstance;
import com.sun.identity.plugin.configuration.ConfigurationListener;
import com.sun.identity.plugin.configuration.ConfigurationManager;
import com.sun.identity.shared.debug.Debug;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class SAML2ConfigService implements ConfigurationListener {
   private static final String CONFIG_NAME = "SAML2_CONFIG";
   private static final Debug DEBUG = Debug.getInstance("libSAML2");
   private static Map<String, String> attributes = new HashMap<>();
   private static ConfigurationInstance ci;
   static final String SAML2_FAILOVER_ATTR = "failOverEnabled";
   static final String SAML2_BUFFER_LENGTH = "bufferLength";

   private SAML2ConfigService() {
   }

   @Override
   public void configChanged(ConfigurationActionEvent e) {
      if (DEBUG.messageEnabled()) {
         DEBUG.message("SAML2ConfigService: configChanged");
      }

      setValues();
   }

   private static synchronized void setValues() {
      String classMethod = "SAML2ConfigService.setValues:";
      if (ci == null) {
         attributes.put("failOverEnabled", "false");
         attributes.put("bufferLength", "2048");
      } else {
         Map<String, Set<String>> attrMap;
         try {
            attrMap = ci.getConfiguration(null, null);
         } catch (ConfigurationException ce) {
            DEBUG.error(classMethod, ce);
            return;
         }

         Map<String, String> newAttributes = new HashMap<>();
         if (attrMap != null) {
            Set<String> values = attrMap.get("failOverEnabled");
            String value = "false";
            if (values != null && values.size() == 1) {
               value = values.iterator().next();
            }

            newAttributes.put("failOverEnabled", value);
            values = attrMap.get("bufferLength");
            value = "2048";
            if (values != null && values.size() == 1) {
               value = values.iterator().next();
            }

            newAttributes.put("bufferLength", value);
         }

         attributes = newAttributes;
      }

      if (DEBUG.messageEnabled()) {
         DEBUG.message(
            "SAML2ConfigService.setValues : Failover attr = " + attributes.get("failOverEnabled") + "buffer length = " + attributes.get("bufferLength")
         );
      }
   }

   public static Object getAttribute(String attributeName) {
      return attributes.get(attributeName);
   }

   static {
      try {
         ci = ConfigurationManager.getConfigurationInstance("SAML2_CONFIG");
         ci.addListener(new SAML2ConfigService());
         setValues();
      } catch (ConfigurationException ce) {
         DEBUG.error("SAML2ConfigService.static:", ce);
      }
   }
}
