package com.airlock.iam.authentication.infrastructure.service;

import com.airlock.iam.authentication.infrastructure.transfer.request.OptionalForwardLocationAccessRequest;
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.login.api.domain.model.location.ForwardLocation;
import jakarta.annotation.Nullable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;

public final class ForwardLocationValidator {
   private static final ELogger LOG = ELoggerFactory.getLogger(ForwardLocationValidator.class);

   public static Optional<ForwardLocation> validateForwardLocationURI(String uriString) {
      try {
         URI uri = new URI(uriString);
         if (uri.getRawUserInfo() != null) {
            LOG.info("Ignoring forward location with user information: " + LogUtil.logSafeQuote(uriString));
            return Optional.empty();
         } else {
            return Optional.of(new ForwardLocation(uri));
         }
      } catch (URISyntaxException e) {
         LOG.info("Given forward location is not a valid URI: " + LogUtil.logSafeQuote(uriString));
         return Optional.empty();
      }
   }

   public static Optional<ForwardLocation> extractAndValidateForwardLocation(@Nullable OptionalForwardLocationAccessRequest request) {
      return Optional.ofNullable(request).map(OptionalForwardLocationAccessRequest::getLocation).flatMap(ForwardLocationValidator::validateForwardLocationURI);
   }

   private ForwardLocationValidator() {
   }
}
