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

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("token.vasco.device.patch")
@JsonDeserialize(builder = VascoDevicePatchRequest.VascoDevicePatchDataJsonBuilder.class)
@JsonInclude(Include.NON_EMPTY)
public final class VascoDevicePatchRequest {
   public static final String VASCO_DEVICE_PATCH_TYPE = "token.vasco.device.patch";
   @Schema(nullable = true, type = "string", description = "The validity start date of this device.")
   private OptionalValue<Date> validFrom;
   @Schema(nullable = true, type = "string", description = "The validity end date of this device.")
   private OptionalValue<Date> validTo;

   private VascoDevicePatchRequest() {
      this.validFrom = OptionalValue.none();
      this.validTo = OptionalValue.none();
   }

   public static VascoDevicePatchRequest.VascoDevicePatchRequestBuilder builder() {
      return new VascoDevicePatchRequest().toBuilder();
   }

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

   @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 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 VascoDevicePatchRequest other)) {
         return false;
      } else {
         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;
         }
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      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 "VascoDevicePatchRequest(validFrom=" + this.getValidFrom() + ", validTo=" + this.getValidTo() + ")";
   }

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

   @JsonPOJOBuilder(withPrefix = "")
   public static class VascoDevicePatchDataJsonBuilder {
      private final VascoDevicePatchRequest.VascoDevicePatchRequestBuilder builder = VascoDevicePatchRequest.builder();

      public VascoDevicePatchRequest.VascoDevicePatchDataJsonBuilder validFrom(Date validFrom) {
         this.builder.validFrom(OptionalValue.of(validFrom));
         return this;
      }

      public VascoDevicePatchRequest.VascoDevicePatchDataJsonBuilder validTo(Date validTo) {
         this.builder.validTo(OptionalValue.of(validTo));
         return this;
      }

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

      public static VascoDevicePatchRequest.VascoDevicePatchDataJsonBuilder get() {
         return new VascoDevicePatchRequest.VascoDevicePatchDataJsonBuilder();
      }
   }

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

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

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

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

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

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