package com.airlock.iam.login.domain.model.targetapp;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredential;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialIdleTimeout;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialLifetime;
import com.airlock.iam.common.domain.model.auth.idpropagation.WafCredentialTimeout;
import com.airlock.iam.login.application.configuration.targetapp.StaticWafCredentialProviderConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Optional;

@LogicForConfig(StaticWafCredentialProviderConfig.class)
public final class StaticWafCredentialProvider implements WafCredentialProvider {
   private final StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration config;

   @Inject
   public StaticWafCredentialProvider(StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration config) {
      this.config = config;
   }

   @Override
   public List<WafCredential> getCredentials() {
      return List.of(
         WafCredential.builder(this.config.getWafCredentialName())
            .credentialTimeout(WafCredentialTimeout.wafCredentialTimeout(this.config.getIdleTimeout(), this.config.getLifetime()))
            .build()
      );
   }

   public static final class StaticWafCredentialProviderConfiguration {
      private final String wafCredentialName;
      private final Optional<WafCredentialLifetime> lifetime;
      private final Optional<WafCredentialIdleTimeout> idleTimeout;

      private StaticWafCredentialProviderConfiguration(String wafCredentialName) {
         this.wafCredentialName = wafCredentialName;
         this.lifetime = Optional.empty();
         this.idleTimeout = Optional.empty();
      }

      public static StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder builder(
         String wafCredentialName
      ) {
         return new StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration(wafCredentialName).toBuilder();
      }

      @SuppressFBWarnings(justification = "generated code")
      public StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder toBuilder() {
         return new StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder()
            .wafCredentialName(this.wafCredentialName)
            .lifetime(this.lifetime)
            .idleTimeout(this.idleTimeout);
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Optional<WafCredentialLifetime> getLifetime() {
         return this.lifetime;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Optional<WafCredentialIdleTimeout> getIdleTimeout() {
         return this.idleTimeout;
      }

      @SuppressFBWarnings(justification = "generated code")
      public StaticWafCredentialProviderConfiguration(
         String wafCredentialName, Optional<WafCredentialLifetime> lifetime, Optional<WafCredentialIdleTimeout> idleTimeout
      ) {
         this.wafCredentialName = wafCredentialName;
         this.lifetime = lifetime;
         this.idleTimeout = idleTimeout;
      }

      @SuppressFBWarnings(justification = "generated code")
      public static class StaticWafCredentialProviderConfigurationBuilder {
         @SuppressFBWarnings(justification = "generated code")
         private String wafCredentialName;
         @SuppressFBWarnings(justification = "generated code")
         private Optional<WafCredentialLifetime> lifetime;
         @SuppressFBWarnings(justification = "generated code")
         private Optional<WafCredentialIdleTimeout> idleTimeout;

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

         @SuppressFBWarnings(justification = "generated code")
         public StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder wafCredentialName(
            String wafCredentialName
         ) {
            this.wafCredentialName = wafCredentialName;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder lifetime(
            Optional<WafCredentialLifetime> lifetime
         ) {
            this.lifetime = lifetime;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder idleTimeout(
            Optional<WafCredentialIdleTimeout> idleTimeout
         ) {
            this.idleTimeout = idleTimeout;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration build() {
            return new StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration(this.wafCredentialName, this.lifetime, this.idleTimeout);
         }

         @SuppressFBWarnings(justification = "generated code")
         @Override
         public String toString() {
            return "StaticWafCredentialProvider.StaticWafCredentialProviderConfiguration.StaticWafCredentialProviderConfigurationBuilder(wafCredentialName="
               + this.wafCredentialName
               + ", lifetime="
               + this.lifetime
               + ", idleTimeout="
               + this.idleTimeout
               + ")";
         }
      }
   }
}
