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

import com.fasterxml.jackson.annotation.JsonTypeName;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.annotation.Nullable;
import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

@JsonTypeName("license.validation")
@SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
public class LicenseValidationWarningData {
   public static final String LICENSE_VALIDATION_TYPE = "license.validation";
   private List<LicenseValidationWarningData.WarningData> warnings = new ArrayList<>();

   @SuppressFBWarnings(justification = "generated code")
   public List<LicenseValidationWarningData.WarningData> getWarnings() {
      return this.warnings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setWarnings(List<LicenseValidationWarningData.WarningData> warnings) {
      this.warnings = warnings;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof LicenseValidationWarningData other)) {
         return false;
      } else {
         if (!other.canEqual(this)) {
            return false;
         }

         Object this$warnings = this.warnings;
         Object other$warnings = other.warnings;
         return this$warnings == null ? other$warnings == null : this$warnings.equals(other$warnings);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   protected boolean canEqual(Object other) {
      return other instanceof LicenseValidationWarningData;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "LicenseValidationWarningData(warnings=" + this.getWarnings() + ")";
   }

   @SuppressFBWarnings(justification = "generated code")
   public LicenseValidationWarningData(List<LicenseValidationWarningData.WarningData> warnings) {
      this.warnings = warnings;
   }

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

   @Schema(ref = "#/components/schemas/WarningDataOverride")
   public static class WarningData {
      @NotNull
      private String code;
      @NotNull
      private String severity;
      @Nullable
      private Map<String, Object> params;

      @SuppressFBWarnings(justification = "generated code")
      public static LicenseValidationWarningData.WarningData.WarningDataBuilder builder() {
         return new LicenseValidationWarningData.WarningData.WarningDataBuilder();
      }

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

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

      @Nullable
      @SuppressFBWarnings(justification = "generated code")
      public Map<String, Object> getParams() {
         return this.params;
      }

      @SuppressFBWarnings(justification = "generated code")
      public void setCode(String code) {
         this.code = code;
      }

      @SuppressFBWarnings(justification = "generated code")
      public void setSeverity(String severity) {
         this.severity = severity;
      }

      @SuppressFBWarnings(justification = "generated code")
      public void setParams(@Nullable Map<String, Object> params) {
         this.params = params;
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public boolean equals(Object o) {
         if (o == this) {
            return true;
         } else if (!(o instanceof LicenseValidationWarningData.WarningData other)) {
            return false;
         } else {
            if (!other.canEqual(this)) {
               return false;
            }

            Object this$code = this.code;
            Object other$code = other.code;
            if (this$code == null ? other$code == null : this$code.equals(other$code)) {
               Object this$severity = this.severity;
               Object other$severity = other.severity;
               if (this$severity == null ? other$severity == null : this$severity.equals(other$severity)) {
                  Object this$params = this.params;
                  Object other$params = other.params;
                  return this$params == null ? other$params == null : this$params.equals(other$params);
               } else {
                  return false;
               }
            } else {
               return false;
            }
         }
      }

      @SuppressFBWarnings(justification = "generated code")
      protected boolean canEqual(Object other) {
         return other instanceof LicenseValidationWarningData.WarningData;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "LicenseValidationWarningData.WarningData(code=" + this.getCode() + ", severity=" + this.getSeverity() + ", params=" + this.getParams() + ")";
      }

      @SuppressFBWarnings(justification = "generated code")
      public WarningData(String code, String severity, @Nullable Map<String, Object> params) {
         this.code = code;
         this.severity = severity;
         this.params = params;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public static class WarningDataBuilder {
         @SuppressFBWarnings(justification = "generated code")
         private String code;
         @SuppressFBWarnings(justification = "generated code")
         private String severity;
         @SuppressFBWarnings(justification = "generated code")
         private ArrayList<String> params$key;
         @SuppressFBWarnings(justification = "generated code")
         private ArrayList<Object> params$value;

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

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData.WarningDataBuilder code(String code) {
            this.code = code;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData.WarningDataBuilder severity(String severity) {
            this.severity = severity;
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData.WarningDataBuilder param(String paramKey, Object paramValue) {
            if (this.params$key == null) {
               this.params$key = new ArrayList<>();
               this.params$value = new ArrayList<>();
            }

            this.params$key.add(paramKey);
            this.params$value.add(paramValue);
            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData.WarningDataBuilder params(Map<? extends String, ? extends Object> params) {
            if (params == null) {
               throw new NullPointerException("params cannot be null");
            }

            if (this.params$key == null) {
               this.params$key = new ArrayList<>();
               this.params$value = new ArrayList<>();
            }

            for (Entry<? extends String, ? extends Object> $lombokEntry : params.entrySet()) {
               this.params$key.add($lombokEntry.getKey());
               this.params$value.add($lombokEntry.getValue());
            }

            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData.WarningDataBuilder clearParams() {
            if (this.params$key != null) {
               this.params$key.clear();
               this.params$value.clear();
            }

            return this;
         }

         @SuppressFBWarnings(justification = "generated code")
         public LicenseValidationWarningData.WarningData build() {
            return new LicenseValidationWarningData.WarningData(
               this.code,
               this.severity,
               switch (this.params$key == null ? 0 : this.params$key.size()) {
                  case 0 -> Collections.emptyMap();
                  case 1 -> Collections.singletonMap(this.params$key.get(0), this.params$value.get(0));
                  default -> {
                     Map<String, Object> params = new LinkedHashMap<>(
                        this.params$key.size() < 1073741824 ? 1 + this.params$key.size() + (this.params$key.size() - 3) / 3 : Integer.MAX_VALUE
                     );

                     for (int $i = 0; $i < this.params$key.size(); $i++) {
                        params.put(this.params$key.get($i), this.params$value.get($i));
                     }

                     yield Collections.unmodifiableMap(params);
                  }
               }
            );
         }

         @SuppressFBWarnings(justification = "generated code")
         @Override
         public String toString() {
            return "LicenseValidationWarningData.WarningData.WarningDataBuilder(code="
               + this.code
               + ", severity="
               + this.severity
               + ", params$key="
               + this.params$key
               + ", params$value="
               + this.params$value
               + ")";
         }
      }
   }
}
