package com.airlock.iam.ssi.application.configuration;

import com.airlock.iam.core.misc.persistency.SqlDataSource;
import com.airlock.iam.plugin.api.annotation.config.Groups;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.BooleanProperty;
import com.airlock.iam.plugin.api.annotation.property.GroupProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;

@Plugin(description = "Persists Verifiable Credentials.", displayName = "VC Database Repository")
@Groups(groupSequence = {"Basic Settings", "Advanced Settings"}, openGroups = "Basic Settings")
public final class VerifiableCredentialsRepositoryConfig {
   @PluginProperty(
      displayName = "SQL Data Source",
      description = "The SQL Data Source, which is used to persist the Verifiable Credentials issued by this service.",
      optional = false
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private SqlDataSource sqlDataSource;
   @BooleanProperty(
      displayName = "Log Queries",
      description = "Enable to log SQL queries (only effective if the log level is at least INFO).\nAttention: query values (including potentially sensitive data) will be logged as well.\n",
      optional = true,
      defaultValue = "false"
   )
   @GroupProperty(groupIdentifier = "Advanced Settings")
   private boolean logQueries;
   @StringProperty(
      displayName = "Tenant ID",
      description = "The value which is added to database records to distinguish between different tenants.\nThe value is also used when retrieving data from the persistence. <br/>\nIf no value is configured, then 'no_tenant' is used as the value on the database.\n",
      optional = true,
      maxLength = 50,
      exampleValues = {"customerA", "customerB"},
      validationRegex = "(?!no_tenant$).*"
   )
   @GroupProperty(groupIdentifier = "Advanced Settings")
   private String tenantId;

   public SqlDataSource getSqlDataSource() {
      return this.sqlDataSource;
   }

   public boolean isLogQueries() {
      return this.logQueries;
   }

   @Nullable
   public String getTenantId() {
      return this.tenantId;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public VerifiableCredentialsRepositoryConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public VerifiableCredentialsRepositoryConfig(SqlDataSource sqlDataSource, boolean logQueries, String tenantId) {
      this.sqlDataSource = sqlDataSource;
      this.logQueries = logQueries;
      this.tenantId = tenantId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class VerifiableCredentialsRepositoryConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private SqlDataSource sqlDataSource;
      @SuppressFBWarnings(justification = "generated code")
      private boolean logQueries;
      @SuppressFBWarnings(justification = "generated code")
      private String tenantId;

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

      @SuppressFBWarnings(justification = "generated code")
      public VerifiableCredentialsRepositoryConfig.VerifiableCredentialsRepositoryConfigBuilder sqlDataSource(SqlDataSource sqlDataSource) {
         this.sqlDataSource = sqlDataSource;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VerifiableCredentialsRepositoryConfig.VerifiableCredentialsRepositoryConfigBuilder logQueries(boolean logQueries) {
         this.logQueries = logQueries;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VerifiableCredentialsRepositoryConfig.VerifiableCredentialsRepositoryConfigBuilder tenantId(String tenantId) {
         this.tenantId = tenantId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public VerifiableCredentialsRepositoryConfig build() {
         return new VerifiableCredentialsRepositoryConfig(this.sqlDataSource, this.logQueries, this.tenantId);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "VerifiableCredentialsRepositoryConfig.VerifiableCredentialsRepositoryConfigBuilder(sqlDataSource="
            + this.sqlDataSource
            + ", logQueries="
            + this.logQueries
            + ", tenantId="
            + this.tenantId
            + ")";
      }
   }
}
