/*
 * 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 com.plaid.client.model.BusinessAccount;
import com.plaid.client.model.CashflowReportTransaction;
import com.plaid.client.model.Item;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * CashflowReportGetResponse defines the response schema for &#x60;/cashflow_report/get&#x60;
 */
@ApiModel(description = "CashflowReportGetResponse defines the response schema for `/cashflow_report/get`")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-12-11T18:58:39.328614Z[Etc/UTC]")
public class CashflowReportGetResponse {
  public static final String SERIALIZED_NAME_ACCOUNTS = "accounts";
  @SerializedName(SERIALIZED_NAME_ACCOUNTS)
  private List<BusinessAccount> accounts = new ArrayList<>();

  public static final String SERIALIZED_NAME_TRANSACTIONS = "transactions";
  @SerializedName(SERIALIZED_NAME_TRANSACTIONS)
  private List<CashflowReportTransaction> transactions = new ArrayList<>();

  public static final String SERIALIZED_NAME_TOTAL_TRANSACTIONS = "total_transactions";
  @SerializedName(SERIALIZED_NAME_TOTAL_TRANSACTIONS)
  private Integer totalTransactions;

  public static final String SERIALIZED_NAME_ITEM = "item";
  @SerializedName(SERIALIZED_NAME_ITEM)
  private Item item;

  public static final String SERIALIZED_NAME_NEXT_CURSOR = "next_cursor";
  @SerializedName(SERIALIZED_NAME_NEXT_CURSOR)
  private String nextCursor;

  public static final String SERIALIZED_NAME_HAS_MORE = "has_more";
  @SerializedName(SERIALIZED_NAME_HAS_MORE)
  private Boolean hasMore;

  public static final String SERIALIZED_NAME_LAST_SUCCESSFUL_UPDATE_TIME = "last_successful_update_time";
  @SerializedName(SERIALIZED_NAME_LAST_SUCCESSFUL_UPDATE_TIME)
  private OffsetDateTime lastSuccessfulUpdateTime;

  public static final String SERIALIZED_NAME_REQUEST_ID = "request_id";
  @SerializedName(SERIALIZED_NAME_REQUEST_ID)
  private String requestId;


  public CashflowReportGetResponse accounts(List<BusinessAccount> accounts) {
    
    this.accounts = accounts;
    return this;
  }

  public CashflowReportGetResponse addAccountsItem(BusinessAccount accountsItem) {
    this.accounts.add(accountsItem);
    return this;
  }

   /**
   * An array containing the &#x60;accounts&#x60; associated with the Item for which transactions are being returned. Each transaction can be mapped to its corresponding account via the &#x60;account_id&#x60; field.
   * @return accounts
  **/
  @ApiModelProperty(required = true, value = "An array containing the `accounts` associated with the Item for which transactions are being returned. Each transaction can be mapped to its corresponding account via the `account_id` field.")

  public List<BusinessAccount> getAccounts() {
    return accounts;
  }


  public void setAccounts(List<BusinessAccount> accounts) {
    this.accounts = accounts;
  }


  public CashflowReportGetResponse transactions(List<CashflowReportTransaction> transactions) {
    
    this.transactions = transactions;
    return this;
  }

  public CashflowReportGetResponse addTransactionsItem(CashflowReportTransaction transactionsItem) {
    this.transactions.add(transactionsItem);
    return this;
  }

   /**
   * An array containing transactions from the account. Transactions are returned in reverse chronological order, with the most recent at the beginning of the array. The maximum number of transactions returned is determined by the &#x60;count&#x60; parameter.
   * @return transactions
  **/
  @ApiModelProperty(required = true, value = "An array containing transactions from the account. Transactions are returned in reverse chronological order, with the most recent at the beginning of the array. The maximum number of transactions returned is determined by the `count` parameter.")

  public List<CashflowReportTransaction> getTransactions() {
    return transactions;
  }


  public void setTransactions(List<CashflowReportTransaction> transactions) {
    this.transactions = transactions;
  }


  public CashflowReportGetResponse totalTransactions(Integer totalTransactions) {
    
    this.totalTransactions = totalTransactions;
    return this;
  }

   /**
   * The total number of transactions available within the date range specified. If &#x60;total_transactions&#x60; is larger than the size of the &#x60;transactions&#x60; array, more transactions are available and can be fetched via manipulating the &#x60;offset&#x60; parameter.
   * @return totalTransactions
  **/
  @ApiModelProperty(required = true, value = "The total number of transactions available within the date range specified. If `total_transactions` is larger than the size of the `transactions` array, more transactions are available and can be fetched via manipulating the `offset` parameter.")

  public Integer getTotalTransactions() {
    return totalTransactions;
  }


  public void setTotalTransactions(Integer totalTransactions) {
    this.totalTransactions = totalTransactions;
  }


  public CashflowReportGetResponse item(Item item) {
    
    this.item = item;
    return this;
  }

   /**
   * Get item
   * @return item
  **/
  @ApiModelProperty(required = true, value = "")

  public Item getItem() {
    return item;
  }


  public void setItem(Item item) {
    this.item = item;
  }


  public CashflowReportGetResponse nextCursor(String nextCursor) {
    
    this.nextCursor = nextCursor;
    return this;
  }

   /**
   * Cursor used for fetching any future updates after the latest update provided in this response.
   * @return nextCursor
  **/
  @ApiModelProperty(required = true, value = "Cursor used for fetching any future updates after the latest update provided in this response.")

  public String getNextCursor() {
    return nextCursor;
  }


  public void setNextCursor(String nextCursor) {
    this.nextCursor = nextCursor;
  }


  public CashflowReportGetResponse hasMore(Boolean hasMore) {
    
    this.hasMore = hasMore;
    return this;
  }

   /**
   * Represents if more than requested count of transactions exists to be fetched
   * @return hasMore
  **/
  @ApiModelProperty(required = true, value = "Represents if more than requested count of transactions exists to be fetched")

  public Boolean getHasMore() {
    return hasMore;
  }


  public void setHasMore(Boolean hasMore) {
    this.hasMore = hasMore;
  }


  public CashflowReportGetResponse lastSuccessfulUpdateTime(OffsetDateTime lastSuccessfulUpdateTime) {
    
    this.lastSuccessfulUpdateTime = lastSuccessfulUpdateTime;
    return this;
  }

   /**
   * The last successful update time in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format ( &#x60;YYYY-MM-DDTHH:mm:ssZ&#x60; )
   * @return lastSuccessfulUpdateTime
  **/
  @ApiModelProperty(required = true, value = "The last successful update time in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format ( `YYYY-MM-DDTHH:mm:ssZ` )")

  public OffsetDateTime getLastSuccessfulUpdateTime() {
    return lastSuccessfulUpdateTime;
  }


  public void setLastSuccessfulUpdateTime(OffsetDateTime lastSuccessfulUpdateTime) {
    this.lastSuccessfulUpdateTime = lastSuccessfulUpdateTime;
  }


  public CashflowReportGetResponse requestId(String requestId) {
    
    this.requestId = requestId;
    return this;
  }

   /**
   * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
   * @return requestId
  **/
  @ApiModelProperty(required = true, value = "A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.")

  public String getRequestId() {
    return requestId;
  }


  public void setRequestId(String requestId) {
    this.requestId = requestId;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    CashflowReportGetResponse cashflowReportGetResponse = (CashflowReportGetResponse) o;
    return Objects.equals(this.accounts, cashflowReportGetResponse.accounts) &&
        Objects.equals(this.transactions, cashflowReportGetResponse.transactions) &&
        Objects.equals(this.totalTransactions, cashflowReportGetResponse.totalTransactions) &&
        Objects.equals(this.item, cashflowReportGetResponse.item) &&
        Objects.equals(this.nextCursor, cashflowReportGetResponse.nextCursor) &&
        Objects.equals(this.hasMore, cashflowReportGetResponse.hasMore) &&
        Objects.equals(this.lastSuccessfulUpdateTime, cashflowReportGetResponse.lastSuccessfulUpdateTime) &&
        Objects.equals(this.requestId, cashflowReportGetResponse.requestId);
  }

  @Override
  public int hashCode() {
    return Objects.hash(accounts, transactions, totalTransactions, item, nextCursor, hasMore, lastSuccessfulUpdateTime, requestId);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class CashflowReportGetResponse {\n");
    sb.append("    accounts: ").append(toIndentedString(accounts)).append("\n");
    sb.append("    transactions: ").append(toIndentedString(transactions)).append("\n");
    sb.append("    totalTransactions: ").append(toIndentedString(totalTransactions)).append("\n");
    sb.append("    item: ").append(toIndentedString(item)).append("\n");
    sb.append("    nextCursor: ").append(toIndentedString(nextCursor)).append("\n");
    sb.append("    hasMore: ").append(toIndentedString(hasMore)).append("\n");
    sb.append("    lastSuccessfulUpdateTime: ").append(toIndentedString(lastSuccessfulUpdateTime)).append("\n");
    sb.append("    requestId: ").append(toIndentedString(requestId)).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    ");
  }

}

