package com.airlock.iam.flow.shared.application.configuration.cronto;

import com.airlock.iam.core.misc.impl.cronto.crontoengine.CrontoEngineHandler;
import com.airlock.iam.core.misc.impl.cronto.pushnotification.CrontoSignSwissVascoPushAppHandler;
import com.airlock.iam.core.misc.impl.cronto.vascocronto.VascoCrontoHandler;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import com.airlock.iam.plugin.api.valuereader.BooleanPropertyValueReader;
import com.airlock.iam.plugin.api.valuereader.PluginPropertyValueReader;
import java.util.function.Function;

public final class CrontoPushConfigValidation {
   public static void validateCrontoHandlerHasPushEnabled(
      PluginConfiguration crontoHandlerConfig, ConfigurationEnvironment env, ConfigurationContext context, Function<String, ConfigurationException> toException
   ) throws ConfigurationException {
      if (crontoHandlerConfig != null && CrontoEngineHandler.class.getName().equals(crontoHandlerConfig.getPluginClassName())) {
         validateCrontoEngineHandlerHasPushEnabled(crontoHandlerConfig, env, context, toException);
      }

      if (crontoHandlerConfig != null && VascoCrontoHandler.class.getName().equals(crontoHandlerConfig.getPluginClassName())) {
         validateVascoCrontoHandlerHasPushEnabled(crontoHandlerConfig, env, context, toException);
      }
   }

   public static void validateCrontoEngineHandlerHasPushEnabled(
      PluginConfiguration crontoHandlerConfig, ConfigurationEnvironment env, ConfigurationContext context, Function<String, ConfigurationException> toException
   ) throws ConfigurationException {
      boolean pushEnabled = BooleanPropertyValueReader.effectiveBooleanPropertyValue(crontoHandlerConfig, "enablePushNotifications", env, context);
      if (!pushEnabled) {
         throw (ConfigurationException)toException.apply("This step can only be used if push notifications are enabled in the Cronto Handler.");
      }
   }

   private static void validateVascoCrontoHandlerHasPushEnabled(
      PluginConfiguration crontoHandlerConfig, ConfigurationEnvironment env, ConfigurationContext context, Function<String, ConfigurationException> toException
   ) throws ConfigurationException {
      boolean pushEnabled = BooleanPropertyValueReader.effectiveBooleanPropertyValue(crontoHandlerConfig, "enablePushNotifications", env, context);
      if (!pushEnabled) {
         throw (ConfigurationException)toException.apply("This step can only be used if push notifications are enabled in the Cronto Handler.");
      }

      PluginConfiguration pushHandlerConfig = PluginPropertyValueReader.effectivePluginPropertyValue(crontoHandlerConfig, "pushAppHandler", env, context);
      if (pushHandlerConfig != null && !CrontoSignSwissVascoPushAppHandler.class.getName().equals(pushHandlerConfig.getPluginClassName())) {
         throw (ConfigurationException)toException.apply("This step can only be used, if the CrontoSign Swiss app is used for push messages.");
      }
   }

   private CrontoPushConfigValidation() {
   }
}
