package com.airlock.iam.admin.infrastructure.transfer.request.techclient;

import com.airlock.iam.base.infrastructure.validation.SizeOptionalString;
import com.airlock.iam.base.misc.data.OptionalString;
import com.airlock.iam.base.misc.data.OptionalValue;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Date;

@JsonTypeName("api-key")
@JsonDeserialize(builder = ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder.class)
@JsonInclude(Include.NON_EMPTY)
public final class ApiKeyUpdateRequest {
   @SizeOptionalString(min = 1, max = 100)
   @Schema(
      type = "string",
      nullable = true,
      minLength = 1,
      maxLength = 100,
      description = "Description of the API key. If present, must be between 1 and 100 characters."
   )
   private OptionalString description;
   @Schema(nullable = true, type = "string", description = "The validity start date.")
   private OptionalValue<Date> validFrom;
   @Schema(nullable = true, type = "string", description = "The validity end date.")
   private OptionalValue<Date> validTo;

   private ApiKeyUpdateRequest() {
      this.description = OptionalString.none();
      this.validFrom = OptionalValue.none();
      this.validTo = OptionalValue.none();
   }

   public static ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder builder() {
      return new ApiKeyUpdateRequest().toBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder toBuilder() {
      return new ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder().description(this.description).validFrom(this.validFrom).validTo(this.validTo);
   }

   @SuppressFBWarnings(justification = "generated code")
   public OptionalString getDescription() {
      return this.description;
   }

   @SuppressFBWarnings(justification = "generated code")
   public OptionalValue<Date> getValidFrom() {
      return this.validFrom;
   }

   @SuppressFBWarnings(justification = "generated code")
   public OptionalValue<Date> getValidTo() {
      return this.validTo;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setDescription(OptionalString description) {
      this.description = description;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setValidFrom(OptionalValue<Date> validFrom) {
      this.validFrom = validFrom;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setValidTo(OptionalValue<Date> validTo) {
      this.validTo = validTo;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "ApiKeyUpdateRequest(description=" + this.getDescription() + ", validFrom=" + this.getValidFrom() + ", validTo=" + this.getValidTo() + ")";
   }

   @SuppressFBWarnings(justification = "generated code")
   public ApiKeyUpdateRequest(OptionalString description, OptionalValue<Date> validFrom, OptionalValue<Date> validTo) {
      this.description = description;
      this.validFrom = validFrom;
      this.validTo = validTo;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ApiKeyUpdateRequestBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OptionalString description;
      @SuppressFBWarnings(justification = "generated code")
      private OptionalValue<Date> validFrom;
      @SuppressFBWarnings(justification = "generated code")
      private OptionalValue<Date> validTo;

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

      @SuppressFBWarnings(justification = "generated code")
      public ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder description(OptionalString description) {
         this.description = description;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder validFrom(OptionalValue<Date> validFrom) {
         this.validFrom = validFrom;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder validTo(OptionalValue<Date> validTo) {
         this.validTo = validTo;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ApiKeyUpdateRequest build() {
         return new ApiKeyUpdateRequest(this.description, this.validFrom, this.validTo);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder(description="
            + this.description
            + ", validFrom="
            + this.validFrom
            + ", validTo="
            + this.validTo
            + ")";
      }
   }

   @JsonPOJOBuilder(withPrefix = "")
   public static class ApiKeyUpdateRequestJsonBuilder {
      private final ApiKeyUpdateRequest.ApiKeyUpdateRequestBuilder builder = ApiKeyUpdateRequest.builder();

      public ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder description(String description) {
         this.builder.description(OptionalString.of(description));
         return this;
      }

      public ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder validFrom(Date validFrom) {
         this.builder.validFrom(OptionalValue.of(validFrom));
         return this;
      }

      public ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder validTo(Date validTo) {
         this.builder.validTo(OptionalValue.of(validTo));
         return this;
      }

      public ApiKeyUpdateRequest build() {
         return this.builder.build();
      }

      public static ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder get() {
         return new ApiKeyUpdateRequest.ApiKeyUpdateRequestJsonBuilder();
      }
   }
}
