java/src/main/java/com/konfigthis/newscatcherapi/client/model/LatestHeadlinesUserInput.java
/*
 * NewsCatcher News API V2
 * NewsCatcher is a data-as-a-service startup that has one main goal: to build the largest database of structured news articles published online. In other words, we're like Google for the news part of the web, which you can access as a source of data.  Some useful links: - [How NewsCatcher Works](https://docs.newscatcherapi.com/knowledge-base/how-newscatcher-works) - [GitHub for the Python SDK](https://github.com/NewscatcherAPI/newscatcherapi-sdk-python) 
 *
 * The version of the OpenAPI document: 1.0.1
 * Contact: nnheo@example.com
 *
 * NOTE: This class is auto generated by Konfig (https://konfigthis.com).
 * Do not edit the class manually.
 */


package com.konfigthis.newscatcherapi.client.model;

import java.util.Objects;
import java.util.Arrays;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.openapitools.jackson.nullable.JsonNullable;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.konfigthis.newscatcherapi.client.JSON;

/**
 * LatestHeadlinesUserInput
 */
@javax.annotation.Generated(value = "Generated by https://konfigthis.com")
public class LatestHeadlinesUserInput {
  public static final String SERIALIZED_NAME_LANG = "lang";
  @SerializedName(SERIALIZED_NAME_LANG)
  private List<String> lang = null;

  public static final String SERIALIZED_NAME_NOT_LANG = "not_lang";
  @SerializedName(SERIALIZED_NAME_NOT_LANG)
  private List<String> notLang = null;

  public static final String SERIALIZED_NAME_COUNTRIES = "countries";
  @SerializedName(SERIALIZED_NAME_COUNTRIES)
  private List<String> countries = null;

  public static final String SERIALIZED_NAME_NOT_COUNTRIES = "not_countries";
  @SerializedName(SERIALIZED_NAME_NOT_COUNTRIES)
  private List<String> notCountries = null;

  public static final String SERIALIZED_NAME_PAGE = "page";
  @SerializedName(SERIALIZED_NAME_PAGE)
  private Integer page;

  public static final String SERIALIZED_NAME_SIZE = "size";
  @SerializedName(SERIALIZED_NAME_SIZE)
  private Integer size;

  public static final String SERIALIZED_NAME_SOURCES = "sources";
  @SerializedName(SERIALIZED_NAME_SOURCES)
  private List<String> sources = null;

  public static final String SERIALIZED_NAME_NOT_SOURCES = "not_sources";
  @SerializedName(SERIALIZED_NAME_NOT_SOURCES)
  private List<String> notSources = null;

  public static final String SERIALIZED_NAME_TOPIC = "topic";
  @SerializedName(SERIALIZED_NAME_TOPIC)
  private String topic;

  public LatestHeadlinesUserInput() {
  }

  public LatestHeadlinesUserInput lang(List<String> lang) {
    
    this.lang = lang;
    return this;
  }

  public LatestHeadlinesUserInput addLangItem(String langItem) {
    if (this.lang == null) {
      this.lang = new ArrayList<>();
    }
    this.lang.add(langItem);
    return this;
  }

   /**
   * Get lang
   * @return lang
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getLang() {
    return lang;
  }


  public void setLang(List<String> lang) {
    this.lang = lang;
  }


  public LatestHeadlinesUserInput notLang(List<String> notLang) {
    
    this.notLang = notLang;
    return this;
  }

  public LatestHeadlinesUserInput addNotLangItem(String notLangItem) {
    if (this.notLang == null) {
      this.notLang = new ArrayList<>();
    }
    this.notLang.add(notLangItem);
    return this;
  }

   /**
   * Get notLang
   * @return notLang
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotLang() {
    return notLang;
  }


  public void setNotLang(List<String> notLang) {
    this.notLang = notLang;
  }


  public LatestHeadlinesUserInput countries(List<String> countries) {
    
    this.countries = countries;
    return this;
  }

  public LatestHeadlinesUserInput addCountriesItem(String countriesItem) {
    if (this.countries == null) {
      this.countries = new ArrayList<>();
    }
    this.countries.add(countriesItem);
    return this;
  }

   /**
   * Get countries
   * @return countries
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getCountries() {
    return countries;
  }


  public void setCountries(List<String> countries) {
    this.countries = countries;
  }


  public LatestHeadlinesUserInput notCountries(List<String> notCountries) {
    
    this.notCountries = notCountries;
    return this;
  }

  public LatestHeadlinesUserInput addNotCountriesItem(String notCountriesItem) {
    if (this.notCountries == null) {
      this.notCountries = new ArrayList<>();
    }
    this.notCountries.add(notCountriesItem);
    return this;
  }

   /**
   * Get notCountries
   * @return notCountries
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotCountries() {
    return notCountries;
  }


  public void setNotCountries(List<String> notCountries) {
    this.notCountries = notCountries;
  }


  public LatestHeadlinesUserInput page(Integer page) {
    
    this.page = page;
    return this;
  }

   /**
   * Get page
   * @return page
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getPage() {
    return page;
  }


  public void setPage(Integer page) {
    this.page = page;
  }


  public LatestHeadlinesUserInput size(Integer size) {
    
    this.size = size;
    return this;
  }

   /**
   * Get size
   * @return size
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getSize() {
    return size;
  }


  public void setSize(Integer size) {
    this.size = size;
  }


  public LatestHeadlinesUserInput sources(List<String> sources) {
    
    this.sources = sources;
    return this;
  }

  public LatestHeadlinesUserInput addSourcesItem(String sourcesItem) {
    if (this.sources == null) {
      this.sources = new ArrayList<>();
    }
    this.sources.add(sourcesItem);
    return this;
  }

   /**
   * Get sources
   * @return sources
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getSources() {
    return sources;
  }


  public void setSources(List<String> sources) {
    this.sources = sources;
  }


  public LatestHeadlinesUserInput notSources(List<String> notSources) {
    
    this.notSources = notSources;
    return this;
  }

  public LatestHeadlinesUserInput addNotSourcesItem(String notSourcesItem) {
    if (this.notSources == null) {
      this.notSources = new ArrayList<>();
    }
    this.notSources.add(notSourcesItem);
    return this;
  }

   /**
   * Get notSources
   * @return notSources
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotSources() {
    return notSources;
  }


  public void setNotSources(List<String> notSources) {
    this.notSources = notSources;
  }


  public LatestHeadlinesUserInput topic(String topic) {
    
    this.topic = topic;
    return this;
  }

   /**
   * Get topic
   * @return topic
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getTopic() {
    return topic;
  }


  public void setTopic(String topic) {
    this.topic = topic;
  }

  /**
   * A container for additional, undeclared properties.
   * This is a holder for any undeclared properties as specified with
   * the 'additionalProperties' keyword in the OAS document.
   */
  private Map<String, Object> additionalProperties;

  /**
   * Set the additional (undeclared) property with the specified name and value.
   * If the property does not already exist, create it otherwise replace it.
   *
   * @param key name of the property
   * @param value value of the property
   * @return the LatestHeadlinesUserInput instance itself
   */
  public LatestHeadlinesUserInput putAdditionalProperty(String key, Object value) {
    if (this.additionalProperties == null) {
        this.additionalProperties = new HashMap<String, Object>();
    }
    this.additionalProperties.put(key, value);
    return this;
  }

  /**
   * Return the additional (undeclared) property.
   *
   * @return a map of objects
   */
  public Map<String, Object> getAdditionalProperties() {
    return additionalProperties;
  }

  /**
   * Return the additional (undeclared) property with the specified name.
   *
   * @param key name of the property
   * @return an object
   */
  public Object getAdditionalProperty(String key) {
    if (this.additionalProperties == null) {
        return null;
    }
    return this.additionalProperties.get(key);
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    LatestHeadlinesUserInput latestHeadlinesUserInput = (LatestHeadlinesUserInput) o;
    return Objects.equals(this.lang, latestHeadlinesUserInput.lang) &&
        Objects.equals(this.notLang, latestHeadlinesUserInput.notLang) &&
        Objects.equals(this.countries, latestHeadlinesUserInput.countries) &&
        Objects.equals(this.notCountries, latestHeadlinesUserInput.notCountries) &&
        Objects.equals(this.page, latestHeadlinesUserInput.page) &&
        Objects.equals(this.size, latestHeadlinesUserInput.size) &&
        Objects.equals(this.sources, latestHeadlinesUserInput.sources) &&
        Objects.equals(this.notSources, latestHeadlinesUserInput.notSources) &&
        Objects.equals(this.topic, latestHeadlinesUserInput.topic)&&
        Objects.equals(this.additionalProperties, latestHeadlinesUserInput.additionalProperties);
  }

  private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
    return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
  }

  @Override
  public int hashCode() {
    return Objects.hash(lang, notLang, countries, notCountries, page, size, sources, notSources, topic, additionalProperties);
  }

  private static <T> int hashCodeNullable(JsonNullable<T> a) {
    if (a == null) {
      return 1;
    }
    return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class LatestHeadlinesUserInput {\n");
    sb.append("    lang: ").append(toIndentedString(lang)).append("\n");
    sb.append("    notLang: ").append(toIndentedString(notLang)).append("\n");
    sb.append("    countries: ").append(toIndentedString(countries)).append("\n");
    sb.append("    notCountries: ").append(toIndentedString(notCountries)).append("\n");
    sb.append("    page: ").append(toIndentedString(page)).append("\n");
    sb.append("    size: ").append(toIndentedString(size)).append("\n");
    sb.append("    sources: ").append(toIndentedString(sources)).append("\n");
    sb.append("    notSources: ").append(toIndentedString(notSources)).append("\n");
    sb.append("    topic: ").append(toIndentedString(topic)).append("\n");
    sb.append("    additionalProperties: ").append(toIndentedString(additionalProperties)).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    ");
  }


  public static HashSet<String> openapiFields;
  public static HashSet<String> openapiRequiredFields;

  static {
    // a set of all properties/fields (JSON key names)
    openapiFields = new HashSet<String>();
    openapiFields.add("lang");
    openapiFields.add("not_lang");
    openapiFields.add("countries");
    openapiFields.add("not_countries");
    openapiFields.add("page");
    openapiFields.add("size");
    openapiFields.add("sources");
    openapiFields.add("not_sources");
    openapiFields.add("topic");

    // a set of required properties/fields (JSON key names)
    openapiRequiredFields = new HashSet<String>();
  }

 /**
  * Validates the JSON Object and throws an exception if issues found
  *
  * @param jsonObj JSON Object
  * @throws IOException if the JSON Object is invalid with respect to LatestHeadlinesUserInput
  */
  public static void validateJsonObject(JsonObject jsonObj) throws IOException {
      if (jsonObj == null) {
        if (!LatestHeadlinesUserInput.openapiRequiredFields.isEmpty()) { // has required fields but JSON object is null
          throw new IllegalArgumentException(String.format("The required field(s) %s in LatestHeadlinesUserInput is not found in the empty JSON string", LatestHeadlinesUserInput.openapiRequiredFields.toString()));
        }
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("lang") != null && !jsonObj.get("lang").isJsonNull() && !jsonObj.get("lang").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `lang` to be an array in the JSON string or null but got `%s`", jsonObj.get("lang").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_lang") != null && !jsonObj.get("not_lang").isJsonNull() && !jsonObj.get("not_lang").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_lang` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_lang").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("countries") != null && !jsonObj.get("countries").isJsonNull() && !jsonObj.get("countries").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `countries` to be an array in the JSON string or null but got `%s`", jsonObj.get("countries").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_countries") != null && !jsonObj.get("not_countries").isJsonNull() && !jsonObj.get("not_countries").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_countries` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_countries").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("sources") != null && !jsonObj.get("sources").isJsonNull() && !jsonObj.get("sources").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `sources` to be an array in the JSON string or null but got `%s`", jsonObj.get("sources").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_sources") != null && !jsonObj.get("not_sources").isJsonNull() && !jsonObj.get("not_sources").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_sources` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_sources").toString()));
      }
      if (!jsonObj.get("topic").isJsonNull() && (jsonObj.get("topic") != null && !jsonObj.get("topic").isJsonNull()) && !jsonObj.get("topic").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `topic` to be a primitive type in the JSON string but got `%s`", jsonObj.get("topic").toString()));
      }
  }

  public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @SuppressWarnings("unchecked")
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
       if (!LatestHeadlinesUserInput.class.isAssignableFrom(type.getRawType())) {
         return null; // this class only serializes 'LatestHeadlinesUserInput' and its subtypes
       }
       final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
       final TypeAdapter<LatestHeadlinesUserInput> thisAdapter
                        = gson.getDelegateAdapter(this, TypeToken.get(LatestHeadlinesUserInput.class));

       return (TypeAdapter<T>) new TypeAdapter<LatestHeadlinesUserInput>() {
           @Override
           public void write(JsonWriter out, LatestHeadlinesUserInput value) throws IOException {
             JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject();
             obj.remove("additionalProperties");
             // serialize additonal properties
             if (value.getAdditionalProperties() != null) {
               for (Map.Entry<String, Object> entry : value.getAdditionalProperties().entrySet()) {
                 if (entry.getValue() instanceof String)
                   obj.addProperty(entry.getKey(), (String) entry.getValue());
                 else if (entry.getValue() instanceof Number)
                   obj.addProperty(entry.getKey(), (Number) entry.getValue());
                 else if (entry.getValue() instanceof Boolean)
                   obj.addProperty(entry.getKey(), (Boolean) entry.getValue());
                 else if (entry.getValue() instanceof Character)
                   obj.addProperty(entry.getKey(), (Character) entry.getValue());
                 else {
                   obj.add(entry.getKey(), gson.toJsonTree(entry.getValue()).getAsJsonObject());
                 }
               }
             }
             elementAdapter.write(out, obj);
           }

           @Override
           public LatestHeadlinesUserInput read(JsonReader in) throws IOException {
             JsonObject jsonObj = elementAdapter.read(in).getAsJsonObject();
             validateJsonObject(jsonObj);
             // store additional fields in the deserialized instance
             LatestHeadlinesUserInput instance = thisAdapter.fromJsonTree(jsonObj);
             for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
               if (!openapiFields.contains(entry.getKey())) {
                 if (entry.getValue().isJsonPrimitive()) { // primitive type
                   if (entry.getValue().getAsJsonPrimitive().isString())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsString());
                   else if (entry.getValue().getAsJsonPrimitive().isNumber())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsNumber());
                   else if (entry.getValue().getAsJsonPrimitive().isBoolean())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsBoolean());
                   else
                     throw new IllegalArgumentException(String.format("The field `%s` has unknown primitive type. Value: %s", entry.getKey(), entry.getValue().toString()));
                 } else if (entry.getValue().isJsonArray()) {
                     instance.putAdditionalProperty(entry.getKey(), gson.fromJson(entry.getValue(), List.class));
                 } else { // JSON object
                     instance.putAdditionalProperty(entry.getKey(), gson.fromJson(entry.getValue(), HashMap.class));
                 }
               }
             }
             return instance;
           }

       }.nullSafe();
    }
  }

 /**
  * Create an instance of LatestHeadlinesUserInput given an JSON string
  *
  * @param jsonString JSON string
  * @return An instance of LatestHeadlinesUserInput
  * @throws IOException if the JSON string is invalid with respect to LatestHeadlinesUserInput
  */
  public static LatestHeadlinesUserInput fromJson(String jsonString) throws IOException {
    return JSON.getGson().fromJson(jsonString, LatestHeadlinesUserInput.class);
  }

 /**
  * Convert an instance of LatestHeadlinesUserInput to an JSON string
  *
  * @return JSON string
  */
  public String toJson() {
    return JSON.getGson().toJson(this);
  }
}

