package com.airlock.iam.common.domain.service.sms;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.validation.ValidationResult;
import com.airlock.iam.common.domain.model.sms.Sms;
import com.airlock.iam.common.domain.model.sms.SmsValidator;
import com.airlock.iam.core.domain.model.sms.validation.DefaultPhoneNumberValidator;
import com.airlock.iam.core.domain.model.sms.validation.OriginatorValidator;
import com.airlock.iam.core.domain.model.sms.validation.SmsMessageValidator;
import com.airlock.iam.core.misc.sms.SmsGateway;
import com.airlock.iam.core.misc.sms.SmsGatewayException;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.elog.api.LogTypes;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

public final class DefaultSmsValidator implements SmsValidator {
   private static final ELogger LOG = ELoggerFactory.getLogger(DefaultSmsValidator.class);
   private final SmsGateway gateway;

   @Override
   public boolean isValid(Sms sms) {
      ValidationResult originatorValidatorResult = OriginatorValidator.defaultValidator().validate(sms.getOriginator());
      if (!originatorValidatorResult.isValid()) {
         LOG.info("The originator name is not valid: " + originatorValidatorResult.getFailure());
         return false;
      }

      ValidationResult phoneNumberValidatorResult = DefaultPhoneNumberValidator.defaultValidator().validate(sms.getPhoneNumber());
      if (!phoneNumberValidatorResult.isValid()) {
         LOG.info("Phone number is not valid: " + phoneNumberValidatorResult.getFailure());
         return false;
      }

      try {
         ValidationResult smsMessageValidatorResult = SmsMessageValidator.defaultValidator(this.gateway.multiSmsMessageSupported()).validate(sms.getMessage());
         if (!smsMessageValidatorResult.isValid()) {
            LOG.info("SMS message is not valid: " + smsMessageValidatorResult.getFailure());
            return false;
         } else if (sms.isFlashMessage() && !this.gateway.flashSmsMessageSupported()) {
            LOG.info("SMS is not allowed to use flash messages since it is not supported by the gateway.");
            return false;
         } else {
            return true;
         }
      } catch (SmsGatewayException e) {
         String msg = "Failed to invoke the SMS gateway.";
         LOG.error(LogTypes.SERVER_INFO_SYS, msg, e);
         throw new FailureException(msg, e);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public DefaultSmsValidator(SmsGateway gateway) {
      this.gateway = gateway;
   }
}
