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

import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.fido.api.domain.model.FidoCredentialId;
import com.airlock.iam.flow.shared.api.domain.model.session.ChangeDescriptionFlowAttribute;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public final class FidoCredentialDisplayNameChangeFlowAttribute implements ChangeDescriptionFlowAttribute<FidoCredentialDisplayNameChangeFlowAttribute> {
   private static final String CREDENTIAL_ID_KEY = "credentialId";
   public static final String NEW_NAME_KEY = "newName";
   private final FidoCredentialId credentialId;
   private final String newName;

   public FidoCredentialDisplayNameChangeFlowAttribute mergeWith(FidoCredentialDisplayNameChangeFlowAttribute newAttribute) {
      return newAttribute;
   }

   @Override
   public String description() {
      return "FIDO Credential Display Name Change";
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("credentialId", this.credentialId.asString())
         .putIfPresent("newName", Optional.ofNullable(this.newName))
         .build();
   }

   public static FidoCredentialDisplayNameChangeFlowAttribute demapify(MapifiedValues values) {
      return new FidoCredentialDisplayNameChangeFlowAttribute(
         FidoCredentialId.credentialId(values.get("credentialId")), values.<String>getOptional("newName").orElse(null)
      );
   }

   @SuppressFBWarnings(justification = "generated code")
   public FidoCredentialId getCredentialId() {
      return this.credentialId;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public FidoCredentialDisplayNameChangeFlowAttribute(FidoCredentialId credentialId, String newName) {
      this.credentialId = credentialId;
      this.newName = newName;
   }
}
