/*
 * The Plaid API
 * The Plaid REST API. Please see https://plaid.com/docs/api for more details.
 *
 * The version of the OpenAPI document: 2020-09-14_1.680.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 com.plaid.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;

/**
 * Specifies options for initializing Link for [update mode](https://plaid.com/docs/link/update-mode).
 */
@ApiModel(description = "Specifies options for initializing Link for [update mode](https://plaid.com/docs/link/update-mode).")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-12-11T18:58:39.328614Z[Etc/UTC]")
public class LinkTokenCreateRequestUpdate {
  public static final String SERIALIZED_NAME_ACCOUNT_SELECTION_ENABLED = "account_selection_enabled";
  @SerializedName(SERIALIZED_NAME_ACCOUNT_SELECTION_ENABLED)
  private Boolean accountSelectionEnabled = false;

  public static final String SERIALIZED_NAME_REAUTHORIZATION_ENABLED = "reauthorization_enabled";
  @SerializedName(SERIALIZED_NAME_REAUTHORIZATION_ENABLED)
  private Boolean reauthorizationEnabled;

  public static final String SERIALIZED_NAME_USER = "user";
  @SerializedName(SERIALIZED_NAME_USER)
  private Boolean user = false;

  public static final String SERIALIZED_NAME_ITEM_IDS = "item_ids";
  @SerializedName(SERIALIZED_NAME_ITEM_IDS)
  private List<String> itemIds = null;


  public LinkTokenCreateRequestUpdate accountSelectionEnabled(Boolean accountSelectionEnabled) {
    
    this.accountSelectionEnabled = accountSelectionEnabled;
    return this;
  }

   /**
   * If &#x60;true&#x60;, enables [update mode with Account Select](https://plaid.com/docs/link/update-mode/#using-update-mode-to-request-new-accounts) for institutions in the US and Canada that do not use OAuth, or that use OAuth but do not have their own account selection flow. For institutions in the US that have an OAuth account selection flow (i.e. most OAuth-enabled institutions), update mode with Account Select will always be enabled, regardless of the value of this field.
   * @return accountSelectionEnabled
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "If `true`, enables [update mode with Account Select](https://plaid.com/docs/link/update-mode/#using-update-mode-to-request-new-accounts) for institutions in the US and Canada that do not use OAuth, or that use OAuth but do not have their own account selection flow. For institutions in the US that have an OAuth account selection flow (i.e. most OAuth-enabled institutions), update mode with Account Select will always be enabled, regardless of the value of this field.")

  public Boolean getAccountSelectionEnabled() {
    return accountSelectionEnabled;
  }


  public void setAccountSelectionEnabled(Boolean accountSelectionEnabled) {
    this.accountSelectionEnabled = accountSelectionEnabled;
  }


  public LinkTokenCreateRequestUpdate reauthorizationEnabled(Boolean reauthorizationEnabled) {
    
    this.reauthorizationEnabled = reauthorizationEnabled;
    return this;
  }

   /**
   * Note: this field is not currently used. Plaid may enable this field in the future if 1033-related expiration begins to be enforced.   By default, Plaid will enable the reauthorization flow during update mode for an Item enabled for [Data Transparency Messaging](https://plaid.com/docs/link/data-transparency-messaging-migration-guide/) if the Item expires within six months. During a reauthorization flow, an end user will review Plaid&#39;s end user privacy policy, use case and data scope consents, and account access consents; they may also be required to log in to their financial institution&#39;s OAuth flow. After the end user successfully completes the reauthorization flow, the Item&#39;s expiration date will be extended to 12 months from the time that the reauthorization took place. This field allows you to optionally override the default reauthorization scheduling logic to either forcibly enable or disable the reauthorization flow for a given update mode session. This field does not impact the flow for Items at institutions in the EU or UK. 
   * @return reauthorizationEnabled
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Note: this field is not currently used. Plaid may enable this field in the future if 1033-related expiration begins to be enforced.   By default, Plaid will enable the reauthorization flow during update mode for an Item enabled for [Data Transparency Messaging](https://plaid.com/docs/link/data-transparency-messaging-migration-guide/) if the Item expires within six months. During a reauthorization flow, an end user will review Plaid's end user privacy policy, use case and data scope consents, and account access consents; they may also be required to log in to their financial institution's OAuth flow. After the end user successfully completes the reauthorization flow, the Item's expiration date will be extended to 12 months from the time that the reauthorization took place. This field allows you to optionally override the default reauthorization scheduling logic to either forcibly enable or disable the reauthorization flow for a given update mode session. This field does not impact the flow for Items at institutions in the EU or UK. ")

  public Boolean getReauthorizationEnabled() {
    return reauthorizationEnabled;
  }


  public void setReauthorizationEnabled(Boolean reauthorizationEnabled) {
    this.reauthorizationEnabled = reauthorizationEnabled;
  }


  public LinkTokenCreateRequestUpdate user(Boolean user) {
    
    this.user = user;
    return this;
  }

   /**
   * If &#x60;true&#x60;, a &#x60;user_token&#x60; must also be provided, and Link will open in update mode for the given user.
   * @return user
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "If `true`, a `user_token` must also be provided, and Link will open in update mode for the given user.")

  public Boolean getUser() {
    return user;
  }


  public void setUser(Boolean user) {
    this.user = user;
  }


  public LinkTokenCreateRequestUpdate itemIds(List<String> itemIds) {
    
    this.itemIds = itemIds;
    return this;
  }

  public LinkTokenCreateRequestUpdate addItemIdsItem(String itemIdsItem) {
    if (this.itemIds == null) {
      this.itemIds = new ArrayList<>();
    }
    this.itemIds.add(itemIdsItem);
    return this;
  }

   /**
   * An array of &#x60;item_id&#x60;s associated with the user to be updated in update mode. If empty or &#x60;null&#x60;, this field will default to initializing update mode for the most recent unhealthy Item associated with the user. A &#x60;user_token&#x60; must also be provided to use this field. 
   * @return itemIds
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "An array of `item_id`s associated with the user to be updated in update mode. If empty or `null`, this field will default to initializing update mode for the most recent unhealthy Item associated with the user. A `user_token` must also be provided to use this field. ")

  public List<String> getItemIds() {
    return itemIds;
  }


  public void setItemIds(List<String> itemIds) {
    this.itemIds = itemIds;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    LinkTokenCreateRequestUpdate linkTokenCreateRequestUpdate = (LinkTokenCreateRequestUpdate) o;
    return Objects.equals(this.accountSelectionEnabled, linkTokenCreateRequestUpdate.accountSelectionEnabled) &&
        Objects.equals(this.reauthorizationEnabled, linkTokenCreateRequestUpdate.reauthorizationEnabled) &&
        Objects.equals(this.user, linkTokenCreateRequestUpdate.user) &&
        Objects.equals(this.itemIds, linkTokenCreateRequestUpdate.itemIds);
  }

  @Override
  public int hashCode() {
    return Objects.hash(accountSelectionEnabled, reauthorizationEnabled, user, itemIds);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class LinkTokenCreateRequestUpdate {\n");
    sb.append("    accountSelectionEnabled: ").append(toIndentedString(accountSelectionEnabled)).append("\n");
    sb.append("    reauthorizationEnabled: ").append(toIndentedString(reauthorizationEnabled)).append("\n");
    sb.append("    user: ").append(toIndentedString(user)).append("\n");
    sb.append("    itemIds: ").append(toIndentedString(itemIds)).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    ");
  }

}

