package com.airlock.iam.login.rest.infrastructure.service;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.location.transform.TransformationResult;
import com.airlock.iam.common.domain.model.transform.TransformationProcessor;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.flow.FlowId;
import com.airlock.iam.flow.ui.infrastructure.service.FlowRedirectTarget;
import com.airlock.iam.flow.ui.infrastructure.service.LinkTarget;
import com.airlock.iam.flow.ui.infrastructure.service.RedirectTarget;
import com.airlock.iam.login.rest.application.configuration.ExternalTargetUriConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.net.URI;

@LogicForConfig(ExternalTargetUriConfig.class)
public class ExternalTargetUri implements FlowRedirectTarget, RedirectTarget, LinkTarget {
   private static final ELogger LOG = ELoggerFactory.getLogger(ExternalTargetUri.class);
   private final Provider<URI> targetUri;
   private final Provider<TransformationProcessor<URI>> processor;

   @Inject
   public ExternalTargetUri(Provider<URI> targetUri, Provider<TransformationProcessor<URI>> processor) {
      this.targetUri = targetUri;
      this.processor = processor;
   }

   public String getRedirectTargetUrl(FlowId flowId) {
      return this.getExternalTargetUri();
   }

   public String getLinkUrl() {
      return this.getExternalTargetUri();
   }

   public String getTarget() {
      return this.getRedirectTargetUrl(null);
   }

   private String getExternalTargetUri() {
      return this.transform((URI)this.targetUri.get()).toString();
   }

   private URI transform(URI uri) {
      TransformationResult<URI> result = ((TransformationProcessor)this.processor.get()).transformToResult(uri);
      return result.isVeto() ? (URI)this.targetUri.get() : result.getValue();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static ExternalTargetUri.ExternalTargetUriBuilder builder() {
      return new ExternalTargetUri.ExternalTargetUriBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ExternalTargetUriBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Provider<URI> targetUri;
      @SuppressFBWarnings(justification = "generated code")
      private Provider<TransformationProcessor<URI>> processor;

      @SuppressFBWarnings(justification = "generated code")
      ExternalTargetUriBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExternalTargetUri.ExternalTargetUriBuilder targetUri(Provider<URI> targetUri) {
         this.targetUri = targetUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExternalTargetUri.ExternalTargetUriBuilder processor(Provider<TransformationProcessor<URI>> processor) {
         this.processor = processor;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExternalTargetUri build() {
         return new ExternalTargetUri(this.targetUri, this.processor);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ExternalTargetUri.ExternalTargetUriBuilder(targetUri=" + this.targetUri + ", processor=" + this.processor + ")";
      }
   }
}
