package com.airlock.iam.flow.shared.domain.model.attributes;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.session.MultiFlowScopedFlowAttribute;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;

public final class AuthenticationAuditTokenFlowAttribute implements MultiFlowScopedFlowAttribute<AuthenticationAuditTokenFlowAttribute> {
   private static final ELogger LOG = ELoggerFactory.getLogger(AuthenticationAuditTokenFlowAttribute.class);
   private static final String AUDIT_TOKEN_KEY = "token";
   private final String auditToken;

   public static AuthenticationAuditTokenFlowAttribute authenticationAuditTokenMultiFlowSessionFlowAttribute(String rawAuditToken) {
      if (StringUtils.isBlank(rawAuditToken)) {
         throw new ViolationException("Audit token cannot be blank!");
      } else {
         return new AuthenticationAuditTokenFlowAttribute(rawAuditToken);
      }
   }

   private AuthenticationAuditTokenFlowAttribute(String rawAuditToken) {
      this.auditToken = rawAuditToken;
   }

   public AuthenticationAuditTokenFlowAttribute mergeWith(AuthenticationAuditTokenFlowAttribute newAuditToken) {
      LOG.info(String.format("Attribute value %s overwritten with %s", LogUtil.logSafeQuote(this.auditToken), LogUtil.logSafeQuote(newAuditToken)));
      return newAuditToken;
   }

   @Override
   public MapifiedValues mapify() {
      return new MapifiedValues(Map.of("token", this.auditToken));
   }

   public static AuthenticationAuditTokenFlowAttribute demapify(MapifiedValues values) {
      return new AuthenticationAuditTokenFlowAttribute(values.get("token"));
   }

   @SuppressFBWarnings(justification = "generated code")
   public String getAuditToken() {
      return this.auditToken;
   }
}
