package com.airlock.iam.factor.domain.model.fido;

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.fido.api.domain.model.FidoCredentialId;
import jakarta.annotation.Nonnull;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public record FidoAuthTokenId(@Nonnull FidoCredentialId fidoCredentialId) {
   private static final ELogger LOG = ELoggerFactory.getLogger(FidoAuthTokenId.class);

   public String formatAsString() {
      return String.format("{\"fidoCredentialId\":\"%s\"}", this.fidoCredentialId);
   }

   public static FidoAuthTokenId fidoAuthTokenId(FidoCredentialId fidoCredentialId) {
      return new FidoAuthTokenId(fidoCredentialId);
   }

   public static Optional<FidoAuthTokenId> parse(String authTokenIdString) {
      if (StringUtils.isBlank(authTokenIdString)) {
         LOG.debug("Invalid FIDO authTokenId (blank string)");
         return Optional.empty();
      } else if (!authTokenIdString.startsWith("{\"fidoCredentialId\":")) {
         LOG.debug("Invalid FIDO authTokenId (blank string). Expected format {\"fidoCredentialId\":\"<uuid>}");
         return Optional.empty();
      } else {
         String rawId = authTokenIdString.split("\"")[3];
         if (!FidoCredentialId.isValid(rawId)) {
            LOG.debug("Invalid FIDO internal id (uuid):" + LogUtil.logSafeString(rawId));
            return Optional.empty();
         } else {
            return Optional.of(new FidoAuthTokenId(FidoCredentialId.credentialId(rawId)));
         }
      }
   }
}
