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

import com.airlock.iam.core.misc.util.locale.LocaleUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.saml2.application.configuration.Saml2FlowIdpConfig;
import com.airlock.iam.saml2.application.configuration.SamlConfig;
import com.airlock.iam.saml2.domain.model.logging.Saml2LogTypes;
import com.sun.identity.shared.configuration.SystemPropertiesManager;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

public final class FlowPlatformConfiguration extends InitializableConfiguration {
   private static final ELogger LOG = ELoggerFactory.getLogger(FlowPlatformConfiguration.class);

   public FlowPlatformConfiguration() {
      super("PLATFORM");
   }

   @Override
   protected void initializeConfiguration() {
      LOG.debug("Initializing PLATFORM Configuration...");
      Set<String> hs = new HashSet<>();
      Optional<Saml2FlowIdpConfig> idpConfig = SamlConfig.getFlowIdpConfig(ConfigurationContext.defaultContext());
      if (idpConfig.isPresent()) {
         List<String> serverList = idpConfig.get().getServerList();
         if (!serverList.isEmpty()) {
            int index = 1;

            for (String server : serverList) {
               hs.add(server.toLowerCase(LocaleUtil.getForSystemStrings()) + "|" + StringUtils.leftPad(Integer.toString(index++), 2, '0'));
            }

            if (hs.size() == 1) {
               LOG.error(
                  Saml2LogTypes.FEDERATION_LIBRARY_MESSAGE,
                  "Invalid serverlist: Must either be empty for single server mode or contain at least two servers for load balanced mode. Using single server mode."
               );
               hs = new HashSet<>();
            }
         }
      }

      if (hs.isEmpty()) {
         LOG.debug("Enabling single server mode");
         String proto = SystemPropertiesManager.get("com.iplanet.am.server.protocol");
         String host = SystemPropertiesManager.get("com.iplanet.am.server.host");
         String port = SystemPropertiesManager.get("com.iplanet.am.server.port");
         String contextPath = StringUtils.trimToEmpty(SystemPropertiesManager.get("com.iplanet.am.services.deploymentDescriptor"));
         Validate.notEmpty(proto, "Invalid protocol in SAML2 IdP Configuration", new Object[0]);
         Validate.notEmpty(host, "Invalid host in SAML2 IdP Configuration", new Object[0]);
         Validate.notEmpty(port, "Invalid port in SAML2 IdP Configuration", new Object[0]);
         String localURL = proto + "://" + host + ":" + port + contextPath;
         hs.add(localURL.toLowerCase(LocaleUtil.getForSystemStrings()) + "|01");
      } else if (LOG.isDebugEnabled()) {
         LOG.debug("Enabling load balancing IDP server mode with " + hs.size() + " servers: " + hs);
      }

      this.getConfigMap().put("iplanet-am-platform-server-list", hs);
      this.getConfigMap().put("iplanet-am-platform-site-list", new HashSet());
   }
}
