package com.airlock.iam.admin.domain.model.user;

import com.airlock.iam.admin.api.domain.model.user.AuthenticationMethods;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Date;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

public final class AuthenticationMethodsImpl implements AuthenticationMethods {
   private final PersistentUser user;

   @Override
   public Optional<AuthenticationMethods.AuthenticationMethodId> getActiveAuthMethod() {
      return Optional.ofNullable(this.user.getAuthMethod()).map(AuthenticationMethods.AuthenticationMethodId::new);
   }

   @Override
   public void setActiveAuthMehod(AuthenticationMethods.AuthenticationMethodId authMehod) {
      this.user.setAuthMethod(authMehod.getId());
   }

   @Override
   public void clearActiveAuthMethod() {
      this.user.setAuthMethod(null);
   }

   @Override
   public boolean hasActiveAuthMethod(AuthenticationMethods.AuthenticationMethodId authMethod) {
      return authMethod.getId().equals(this.user.getAuthMethod());
   }

   @Override
   public void setAdditionalAuthMethod(String authMethodKey, AuthenticationMethods.AuthenticationMethodId authMethod) {
      this.user.putContextDataValue(authMethodKey, authMethod.getId());
   }

   @Override
   public void clearAdditionalAuthMethod(String authMethodKey) {
      this.user.removeContextDataEntry(authMethodKey);
   }

   @Override
   public void setMigration(Set<AuthenticationMethods.AuthenticationMethodId> nextAuthMethods, Optional<Date> migrationDate) {
      this.user.setMultipleNextAuthMethods(nextAuthMethods.stream().map(AuthenticationMethods.AuthenticationMethodId::getId).collect(Collectors.toSet()));
      this.user.setAuthMigrationDate(migrationDate.orElse(null));
   }

   @Override
   public void clearMigration() {
      this.user.setNextAuthMethod(null);
      this.user.setAuthMigrationDate(null);
   }

   @Override
   public boolean hasMigration() {
      return this.user.getNextAuthMethod() != null || this.user.getAuthMigrationDate() != null;
   }

   @SuppressFBWarnings(justification = "generated code")
   AuthenticationMethodsImpl(PersistentUser user) {
      this.user = user;
   }
}
