package com.airlock.iam.oauth2.domain.model.tokenexchange;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;
import org.apache.commons.lang3.Strings;

public final class OAuth2TokenExchangeTokenIssuerId {
   private static final ELogger LOG = ELoggerFactory.getLogger(OAuth2TokenExchangeTokenIssuerId.class);
   private static final String DISCOVERY_RESOURCE_PATH = ".well-known/openid-configuration";
   private final String issuerId;

   public static OAuth2TokenExchangeTokenIssuerId tokenIssuerId(String issuerId) {
      return new OAuth2TokenExchangeTokenIssuerId(issuerId);
   }

   public Optional<URI> deriveOpenIdConnectDiscoveryUri() {
      return this.toUri().map(OAuth2TokenExchangeTokenIssuerId::ensureTrailingSlash).map(uri -> uri.resolve(".well-known/openid-configuration"));
   }

   private Optional<URI> toUri() {
      try {
         return Optional.of(new URI(this.issuerId));
      } catch (URISyntaxException e) {
         LOG.info(String.format("Invalid issuerId %s. Should be a valid URI", LogUtil.logSafeQuote(this.issuerId)));
         return Optional.empty();
      }
   }

   private static URI ensureTrailingSlash(URI uri) {
      return URI.create(Strings.CS.removeEnd(uri.toASCIIString(), "/") + "/");
   }

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof OAuth2TokenExchangeTokenIssuerId other)) {
         return false;
      } else {
         Object this$issuerId = this.issuerId;
         Object other$issuerId = other.issuerId;
         return this$issuerId == null ? other$issuerId == null : this$issuerId.equals(other$issuerId);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      Object $issuerId = this.issuerId;
      return result * 59 + ($issuerId == null ? 43 : $issuerId.hashCode());
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "OAuth2TokenExchangeTokenIssuerId(issuerId=" + this.getIssuerId() + ")";
   }

   @SuppressFBWarnings(justification = "generated code")
   private OAuth2TokenExchangeTokenIssuerId(String issuerId) {
      this.issuerId = issuerId;
   }
}
