/*
 * OpenAPI Petstore
 * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
 *
 * The version of the OpenAPI document: 1.0.0
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


package org.openapitools.model;

import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import javax.validation.constraints.*;
import javax.validation.Valid;

/**
 * NullableClass
 */
@JsonPropertyOrder({
  NullableClass.JSON_PROPERTY_INTEGER_PROP,
  NullableClass.JSON_PROPERTY_NUMBER_PROP,
  NullableClass.JSON_PROPERTY_BOOLEAN_PROP,
  NullableClass.JSON_PROPERTY_STRING_PROP,
  NullableClass.JSON_PROPERTY_DATE_PROP,
  NullableClass.JSON_PROPERTY_DATETIME_PROP,
  NullableClass.JSON_PROPERTY_ARRAY_NULLABLE_PROP,
  NullableClass.JSON_PROPERTY_ARRAY_AND_ITEMS_NULLABLE_PROP,
  NullableClass.JSON_PROPERTY_ARRAY_ITEMS_NULLABLE,
  NullableClass.JSON_PROPERTY_OBJECT_NULLABLE_PROP,
  NullableClass.JSON_PROPERTY_OBJECT_AND_ITEMS_NULLABLE_PROP,
  NullableClass.JSON_PROPERTY_OBJECT_ITEMS_NULLABLE
})
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen")
public class NullableClass extends HashMap<String, Object>  {
  public static final String JSON_PROPERTY_INTEGER_PROP = "integer_prop";
  @JsonProperty(JSON_PROPERTY_INTEGER_PROP)
  private Integer integerProp;

  public static final String JSON_PROPERTY_NUMBER_PROP = "number_prop";
  @JsonProperty(JSON_PROPERTY_NUMBER_PROP)
  private BigDecimal numberProp;

  public static final String JSON_PROPERTY_BOOLEAN_PROP = "boolean_prop";
  @JsonProperty(JSON_PROPERTY_BOOLEAN_PROP)
  private Boolean booleanProp;

  public static final String JSON_PROPERTY_STRING_PROP = "string_prop";
  @JsonProperty(JSON_PROPERTY_STRING_PROP)
  private String stringProp;

  public static final String JSON_PROPERTY_DATE_PROP = "date_prop";
  @JsonProperty(JSON_PROPERTY_DATE_PROP)
  private Date dateProp;

  public static final String JSON_PROPERTY_DATETIME_PROP = "datetime_prop";
  @JsonProperty(JSON_PROPERTY_DATETIME_PROP)
  private Date datetimeProp;

  public static final String JSON_PROPERTY_ARRAY_NULLABLE_PROP = "array_nullable_prop";
  @JsonProperty(JSON_PROPERTY_ARRAY_NULLABLE_PROP)
  private List<Object> arrayNullableProp;

  public static final String JSON_PROPERTY_ARRAY_AND_ITEMS_NULLABLE_PROP = "array_and_items_nullable_prop";
  @JsonProperty(JSON_PROPERTY_ARRAY_AND_ITEMS_NULLABLE_PROP)
  private List<Object> arrayAndItemsNullableProp;

  public static final String JSON_PROPERTY_ARRAY_ITEMS_NULLABLE = "array_items_nullable";
  @JsonProperty(JSON_PROPERTY_ARRAY_ITEMS_NULLABLE)
  private List<Object> arrayItemsNullable;

  public static final String JSON_PROPERTY_OBJECT_NULLABLE_PROP = "object_nullable_prop";
  @JsonProperty(JSON_PROPERTY_OBJECT_NULLABLE_PROP)
  private Map<String, Object> objectNullableProp;

  public static final String JSON_PROPERTY_OBJECT_AND_ITEMS_NULLABLE_PROP = "object_and_items_nullable_prop";
  @JsonProperty(JSON_PROPERTY_OBJECT_AND_ITEMS_NULLABLE_PROP)
  private Map<String, Object> objectAndItemsNullableProp;

  public static final String JSON_PROPERTY_OBJECT_ITEMS_NULLABLE = "object_items_nullable";
  @JsonProperty(JSON_PROPERTY_OBJECT_ITEMS_NULLABLE)
  private Map<String, Object> objectItemsNullable = new HashMap<>();

  public NullableClass integerProp(Integer integerProp) {
    this.integerProp = integerProp;
    return this;
  }

  /**
   * Get integerProp
   * @return integerProp
   **/
  @JsonProperty(value = "integer_prop")
  @ApiModelProperty(value = "")
  
  public Integer getIntegerProp() {
    return integerProp;
  }

  public void setIntegerProp(Integer integerProp) {
    this.integerProp = integerProp;
  }

  public NullableClass numberProp(BigDecimal numberProp) {
    this.numberProp = numberProp;
    return this;
  }

  /**
   * Get numberProp
   * @return numberProp
   **/
  @JsonProperty(value = "number_prop")
  @ApiModelProperty(value = "")
  @Valid 
  public BigDecimal getNumberProp() {
    return numberProp;
  }

  public void setNumberProp(BigDecimal numberProp) {
    this.numberProp = numberProp;
  }

  public NullableClass booleanProp(Boolean booleanProp) {
    this.booleanProp = booleanProp;
    return this;
  }

  /**
   * Get booleanProp
   * @return booleanProp
   **/
  @JsonProperty(value = "boolean_prop")
  @ApiModelProperty(value = "")
  
  public Boolean getBooleanProp() {
    return booleanProp;
  }

  public void setBooleanProp(Boolean booleanProp) {
    this.booleanProp = booleanProp;
  }

  public NullableClass stringProp(String stringProp) {
    this.stringProp = stringProp;
    return this;
  }

  /**
   * Get stringProp
   * @return stringProp
   **/
  @JsonProperty(value = "string_prop")
  @ApiModelProperty(value = "")
  
  public String getStringProp() {
    return stringProp;
  }

  public void setStringProp(String stringProp) {
    this.stringProp = stringProp;
  }

  public NullableClass dateProp(Date dateProp) {
    this.dateProp = dateProp;
    return this;
  }

  /**
   * Get dateProp
   * @return dateProp
   **/
  @JsonProperty(value = "date_prop")
  @ApiModelProperty(value = "")
  
  public Date getDateProp() {
    return dateProp;
  }

  public void setDateProp(Date dateProp) {
    this.dateProp = dateProp;
  }

  public NullableClass datetimeProp(Date datetimeProp) {
    this.datetimeProp = datetimeProp;
    return this;
  }

  /**
   * Get datetimeProp
   * @return datetimeProp
   **/
  @JsonProperty(value = "datetime_prop")
  @ApiModelProperty(value = "")
  
  public Date getDatetimeProp() {
    return datetimeProp;
  }

  public void setDatetimeProp(Date datetimeProp) {
    this.datetimeProp = datetimeProp;
  }

  public NullableClass arrayNullableProp(List<Object> arrayNullableProp) {
    this.arrayNullableProp = arrayNullableProp;
    return this;
  }

  public NullableClass addArrayNullablePropItem(Object arrayNullablePropItem) {
    if (this.arrayNullableProp == null) {
      this.arrayNullableProp = new ArrayList<>();
    }
    this.arrayNullableProp.add(arrayNullablePropItem);
    return this;
  }

  /**
   * Get arrayNullableProp
   * @return arrayNullableProp
   **/
  @JsonProperty(value = "array_nullable_prop")
  @ApiModelProperty(value = "")
  
  public List<Object> getArrayNullableProp() {
    return arrayNullableProp;
  }

  public void setArrayNullableProp(List<Object> arrayNullableProp) {
    this.arrayNullableProp = arrayNullableProp;
  }

  public NullableClass arrayAndItemsNullableProp(List<Object> arrayAndItemsNullableProp) {
    this.arrayAndItemsNullableProp = arrayAndItemsNullableProp;
    return this;
  }

  public NullableClass addArrayAndItemsNullablePropItem(Object arrayAndItemsNullablePropItem) {
    if (this.arrayAndItemsNullableProp == null) {
      this.arrayAndItemsNullableProp = new ArrayList<>();
    }
    this.arrayAndItemsNullableProp.add(arrayAndItemsNullablePropItem);
    return this;
  }

  /**
   * Get arrayAndItemsNullableProp
   * @return arrayAndItemsNullableProp
   **/
  @JsonProperty(value = "array_and_items_nullable_prop")
  @ApiModelProperty(value = "")
  
  public List<Object> getArrayAndItemsNullableProp() {
    return arrayAndItemsNullableProp;
  }

  public void setArrayAndItemsNullableProp(List<Object> arrayAndItemsNullableProp) {
    this.arrayAndItemsNullableProp = arrayAndItemsNullableProp;
  }

  public NullableClass arrayItemsNullable(List<Object> arrayItemsNullable) {
    this.arrayItemsNullable = arrayItemsNullable;
    return this;
  }

  public NullableClass addArrayItemsNullableItem(Object arrayItemsNullableItem) {
    if (this.arrayItemsNullable == null) {
      this.arrayItemsNullable = new ArrayList<>();
    }
    this.arrayItemsNullable.add(arrayItemsNullableItem);
    return this;
  }

  /**
   * Get arrayItemsNullable
   * @return arrayItemsNullable
   **/
  @JsonProperty(value = "array_items_nullable")
  @ApiModelProperty(value = "")
  
  public List<Object> getArrayItemsNullable() {
    return arrayItemsNullable;
  }

  public void setArrayItemsNullable(List<Object> arrayItemsNullable) {
    this.arrayItemsNullable = arrayItemsNullable;
  }

  public NullableClass objectNullableProp(Map<String, Object> objectNullableProp) {
    this.objectNullableProp = objectNullableProp;
    return this;
  }

  public NullableClass putObjectNullablePropItem(String key, Object objectNullablePropItem) {
    if (this.objectNullableProp == null) {
      this.objectNullableProp = new HashMap<>();
    }
    this.objectNullableProp.put(key, objectNullablePropItem);
    return this;
  }

  /**
   * Get objectNullableProp
   * @return objectNullableProp
   **/
  @JsonProperty(value = "object_nullable_prop")
  @ApiModelProperty(value = "")
  
  public Map<String, Object> getObjectNullableProp() {
    return objectNullableProp;
  }

  public void setObjectNullableProp(Map<String, Object> objectNullableProp) {
    this.objectNullableProp = objectNullableProp;
  }

  public NullableClass objectAndItemsNullableProp(Map<String, Object> objectAndItemsNullableProp) {
    this.objectAndItemsNullableProp = objectAndItemsNullableProp;
    return this;
  }

  public NullableClass putObjectAndItemsNullablePropItem(String key, Object objectAndItemsNullablePropItem) {
    if (this.objectAndItemsNullableProp == null) {
      this.objectAndItemsNullableProp = new HashMap<>();
    }
    this.objectAndItemsNullableProp.put(key, objectAndItemsNullablePropItem);
    return this;
  }

  /**
   * Get objectAndItemsNullableProp
   * @return objectAndItemsNullableProp
   **/
  @JsonProperty(value = "object_and_items_nullable_prop")
  @ApiModelProperty(value = "")
  
  public Map<String, Object> getObjectAndItemsNullableProp() {
    return objectAndItemsNullableProp;
  }

  public void setObjectAndItemsNullableProp(Map<String, Object> objectAndItemsNullableProp) {
    this.objectAndItemsNullableProp = objectAndItemsNullableProp;
  }

  public NullableClass objectItemsNullable(Map<String, Object> objectItemsNullable) {
    this.objectItemsNullable = objectItemsNullable;
    return this;
  }

  public NullableClass putObjectItemsNullableItem(String key, Object objectItemsNullableItem) {
    if (this.objectItemsNullable == null) {
      this.objectItemsNullable = new HashMap<>();
    }
    this.objectItemsNullable.put(key, objectItemsNullableItem);
    return this;
  }

  /**
   * Get objectItemsNullable
   * @return objectItemsNullable
   **/
  @JsonProperty(value = "object_items_nullable")
  @ApiModelProperty(value = "")
  
  public Map<String, Object> getObjectItemsNullable() {
    return objectItemsNullable;
  }

  public void setObjectItemsNullable(Map<String, Object> objectItemsNullable) {
    this.objectItemsNullable = objectItemsNullable;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    NullableClass nullableClass = (NullableClass) o;
    return super.equals(o) && Objects.equals(integerProp, nullableClass.integerProp) &&
        Objects.equals(numberProp, nullableClass.numberProp) &&
        Objects.equals(booleanProp, nullableClass.booleanProp) &&
        Objects.equals(stringProp, nullableClass.stringProp) &&
        Objects.equals(dateProp, nullableClass.dateProp) &&
        Objects.equals(datetimeProp, nullableClass.datetimeProp) &&
        Objects.equals(arrayNullableProp, nullableClass.arrayNullableProp) &&
        Objects.equals(arrayAndItemsNullableProp, nullableClass.arrayAndItemsNullableProp) &&
        Objects.equals(arrayItemsNullable, nullableClass.arrayItemsNullable) &&
        Objects.equals(objectNullableProp, nullableClass.objectNullableProp) &&
        Objects.equals(objectAndItemsNullableProp, nullableClass.objectAndItemsNullableProp) &&
        Objects.equals(objectItemsNullable, nullableClass.objectItemsNullable);
  }

  @Override
  public int hashCode() {
    return Objects.hash(super.hashCode(), integerProp, super.hashCode(), numberProp, super.hashCode(), booleanProp, super.hashCode(), stringProp, super.hashCode(), dateProp, super.hashCode(), datetimeProp, super.hashCode(), arrayNullableProp, super.hashCode(), arrayAndItemsNullableProp, super.hashCode(), arrayItemsNullable, super.hashCode(), objectNullableProp, super.hashCode(), objectAndItemsNullableProp, super.hashCode(), objectItemsNullable);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class NullableClass {\n");
    sb.append("    ").append(toIndentedString(super.toString())).append("\n");
    sb.append("    integerProp: ").append(toIndentedString(integerProp)).append("\n");
    sb.append("    numberProp: ").append(toIndentedString(numberProp)).append("\n");
    sb.append("    booleanProp: ").append(toIndentedString(booleanProp)).append("\n");
    sb.append("    stringProp: ").append(toIndentedString(stringProp)).append("\n");
    sb.append("    dateProp: ").append(toIndentedString(dateProp)).append("\n");
    sb.append("    datetimeProp: ").append(toIndentedString(datetimeProp)).append("\n");
    sb.append("    arrayNullableProp: ").append(toIndentedString(arrayNullableProp)).append("\n");
    sb.append("    arrayAndItemsNullableProp: ").append(toIndentedString(arrayAndItemsNullableProp)).append("\n");
    sb.append("    arrayItemsNullable: ").append(toIndentedString(arrayItemsNullable)).append("\n");
    sb.append("    objectNullableProp: ").append(toIndentedString(objectNullableProp)).append("\n");
    sb.append("    objectAndItemsNullableProp: ").append(toIndentedString(objectAndItemsNullableProp)).append("\n");
    sb.append("    objectItemsNullable: ").append(toIndentedString(objectItemsNullable)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

