/*
 * 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.CategoryExpenses;
import com.plaid.client.model.MonthlyAverage;
import com.plaid.client.model.MonthlySummary;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Insights into loan payment transactions made by the user, tracking outgoing payments to loan providers.
 */
@ApiModel(description = "Insights into loan payment transactions made by the user, tracking outgoing payments to loan providers.")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-12-11T18:58:39.328614Z[Etc/UTC]")
public class LoanPaymentsIndicators {
  public static final String SERIALIZED_NAME_AMOUNT = "amount";
  @SerializedName(SERIALIZED_NAME_AMOUNT)
  private Double amount;

  public static final String SERIALIZED_NAME_ISO_CURRENCY_CODE = "iso_currency_code";
  @SerializedName(SERIALIZED_NAME_ISO_CURRENCY_CODE)
  private String isoCurrencyCode;

  public static final String SERIALIZED_NAME_UNOFFICIAL_CURRENCY_CODE = "unofficial_currency_code";
  @SerializedName(SERIALIZED_NAME_UNOFFICIAL_CURRENCY_CODE)
  private String unofficialCurrencyCode;

  public static final String SERIALIZED_NAME_MONTHLY_AVERAGE = "monthly_average";
  @SerializedName(SERIALIZED_NAME_MONTHLY_AVERAGE)
  private MonthlyAverage monthlyAverage;

  public static final String SERIALIZED_NAME_CATEGORY_DETAILS = "category_details";
  @SerializedName(SERIALIZED_NAME_CATEGORY_DETAILS)
  private List<CategoryExpenses> categoryDetails = null;

  public static final String SERIALIZED_NAME_TOP_PROVIDERS = "top_providers";
  @SerializedName(SERIALIZED_NAME_TOP_PROVIDERS)
  private List<String> topProviders = null;

  public static final String SERIALIZED_NAME_TRANSACTIONS_COUNT = "transactions_count";
  @SerializedName(SERIALIZED_NAME_TRANSACTIONS_COUNT)
  private Integer transactionsCount;

  public static final String SERIALIZED_NAME_MONTHLY_SUMMARIES = "monthly_summaries";
  @SerializedName(SERIALIZED_NAME_MONTHLY_SUMMARIES)
  private List<MonthlySummary> monthlySummaries = null;

  public static final String SERIALIZED_NAME_DAYS_SINCE_LAST_OCCURRENCE = "days_since_last_occurrence";
  @SerializedName(SERIALIZED_NAME_DAYS_SINCE_LAST_OCCURRENCE)
  private Integer daysSinceLastOccurrence;

  public static final String SERIALIZED_NAME_PERCENTAGE_OF_INCOME = "percentage_of_income";
  @SerializedName(SERIALIZED_NAME_PERCENTAGE_OF_INCOME)
  private Double percentageOfIncome;


  public LoanPaymentsIndicators amount(Double amount) {
    
    this.amount = amount;
    return this;
  }

   /**
   * The total value of outflow transactions categorized as &#x60;LOAN_PAYMENTS&#x60;, across all the accounts in the report within the requested time window.
   * @return amount
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The total value of outflow transactions categorized as `LOAN_PAYMENTS`, across all the accounts in the report within the requested time window.")

  public Double getAmount() {
    return amount;
  }


  public void setAmount(Double amount) {
    this.amount = amount;
  }


  public LoanPaymentsIndicators isoCurrencyCode(String isoCurrencyCode) {
    
    this.isoCurrencyCode = isoCurrencyCode;
    return this;
  }

   /**
   * The ISO-4217 currency code of the amount. Always &#x60;null&#x60; if &#x60;unofficial_currency_code&#x60; is non-&#x60;null&#x60;.
   * @return isoCurrencyCode
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The ISO-4217 currency code of the amount. Always `null` if `unofficial_currency_code` is non-`null`.")

  public String getIsoCurrencyCode() {
    return isoCurrencyCode;
  }


  public void setIsoCurrencyCode(String isoCurrencyCode) {
    this.isoCurrencyCode = isoCurrencyCode;
  }


  public LoanPaymentsIndicators unofficialCurrencyCode(String unofficialCurrencyCode) {
    
    this.unofficialCurrencyCode = unofficialCurrencyCode;
    return this;
  }

   /**
   * The unofficial currency code associated with the amount. Always &#x60;null&#x60; if &#x60;iso_currency_code&#x60; is non-&#x60;null&#x60;.  See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported &#x60;unofficial_currency_code&#x60;s.
   * @return unofficialCurrencyCode
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The unofficial currency code associated with the amount. Always `null` if `iso_currency_code` is non-`null`.  See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `unofficial_currency_code`s.")

  public String getUnofficialCurrencyCode() {
    return unofficialCurrencyCode;
  }


  public void setUnofficialCurrencyCode(String unofficialCurrencyCode) {
    this.unofficialCurrencyCode = unofficialCurrencyCode;
  }


  public LoanPaymentsIndicators monthlyAverage(MonthlyAverage monthlyAverage) {
    
    this.monthlyAverage = monthlyAverage;
    return this;
  }

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

  public MonthlyAverage getMonthlyAverage() {
    return monthlyAverage;
  }


  public void setMonthlyAverage(MonthlyAverage monthlyAverage) {
    this.monthlyAverage = monthlyAverage;
  }


  public LoanPaymentsIndicators categoryDetails(List<CategoryExpenses> categoryDetails) {
    
    this.categoryDetails = categoryDetails;
    return this;
  }

  public LoanPaymentsIndicators addCategoryDetailsItem(CategoryExpenses categoryDetailsItem) {
    if (this.categoryDetails == null) {
      this.categoryDetails = new ArrayList<>();
    }
    this.categoryDetails.add(categoryDetailsItem);
    return this;
  }

   /**
   * Detailed categories view of all the transactions that fall into the &#x60;LOAN_PAYMENTS&#x60; credit category within the given time window, across all the accounts in the report.
   * @return categoryDetails
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Detailed categories view of all the transactions that fall into the `LOAN_PAYMENTS` credit category within the given time window, across all the accounts in the report.")

  public List<CategoryExpenses> getCategoryDetails() {
    return categoryDetails;
  }


  public void setCategoryDetails(List<CategoryExpenses> categoryDetails) {
    this.categoryDetails = categoryDetails;
  }


  public LoanPaymentsIndicators topProviders(List<String> topProviders) {
    
    this.topProviders = topProviders;
    return this;
  }

  public LoanPaymentsIndicators addTopProvidersItem(String topProvidersItem) {
    if (this.topProviders == null) {
      this.topProviders = new ArrayList<>();
    }
    this.topProviders.add(topProvidersItem);
    return this;
  }

   /**
   * Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend.  If the user has not spent money on any provider in the given time window, this list will be empty.
   * @return topProviders
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Up to 3 top service providers that the user had the most transactions for in the given time window, in descending order of total spend.  If the user has not spent money on any provider in the given time window, this list will be empty.")

  public List<String> getTopProviders() {
    return topProviders;
  }


  public void setTopProviders(List<String> topProviders) {
    this.topProviders = topProviders;
  }


  public LoanPaymentsIndicators transactionsCount(Integer transactionsCount) {
    
    this.transactionsCount = transactionsCount;
    return this;
  }

   /**
   * The total number of transactions that fall into the &#x60;LOAN_PAYMENTS&#x60; credit category, across all the accounts in the report.
   * @return transactionsCount
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The total number of transactions that fall into the `LOAN_PAYMENTS` credit category, across all the accounts in the report.")

  public Integer getTransactionsCount() {
    return transactionsCount;
  }


  public void setTransactionsCount(Integer transactionsCount) {
    this.transactionsCount = transactionsCount;
  }


  public LoanPaymentsIndicators monthlySummaries(List<MonthlySummary> monthlySummaries) {
    
    this.monthlySummaries = monthlySummaries;
    return this;
  }

  public LoanPaymentsIndicators addMonthlySummariesItem(MonthlySummary monthlySummariesItem) {
    if (this.monthlySummaries == null) {
      this.monthlySummaries = new ArrayList<>();
    }
    this.monthlySummaries.add(monthlySummariesItem);
    return this;
  }

   /**
   * The monthly summaries of the transactions that fall into the &#x60;LOAN_PAYMENTS&#x60; credit category within the given time window, across all the accounts in the report.
   * @return monthlySummaries
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The monthly summaries of the transactions that fall into the `LOAN_PAYMENTS` credit category within the given time window, across all the accounts in the report.")

  public List<MonthlySummary> getMonthlySummaries() {
    return monthlySummaries;
  }


  public void setMonthlySummaries(List<MonthlySummary> monthlySummaries) {
    this.monthlySummaries = monthlySummaries;
  }


  public LoanPaymentsIndicators daysSinceLastOccurrence(Integer daysSinceLastOccurrence) {
    
    this.daysSinceLastOccurrence = daysSinceLastOccurrence;
    return this;
  }

   /**
   * The number of days since the last transaction that falls into the &#x60;LOAN_PAYMENTS&#x60; credit category, across all the accounts in the report.
   * @return daysSinceLastOccurrence
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The number of days since the last transaction that falls into the `LOAN_PAYMENTS` credit category, across all the accounts in the report.")

  public Integer getDaysSinceLastOccurrence() {
    return daysSinceLastOccurrence;
  }


  public void setDaysSinceLastOccurrence(Integer daysSinceLastOccurrence) {
    this.daysSinceLastOccurrence = daysSinceLastOccurrence;
  }


  public LoanPaymentsIndicators percentageOfIncome(Double percentageOfIncome) {
    
    this.percentageOfIncome = percentageOfIncome;
    return this;
  }

   /**
   * The percentage of the user&#39;s monthly inflows that was spent on transactions that fall into the &#x60;LOAN_PAYMENTS&#x60; credit category within the given time window, across all the accounts in the report. For example, a value of 100 indicates that 100% of the inflows were spent on transactions that fall into the &#x60;LOAN_PAYMENTS&#x60; credit category. If there&#39;s no available income for the giving time period, this field value will be &#x60;-1&#x60;
   * @return percentageOfIncome
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The percentage of the user's monthly inflows that was spent on transactions that fall into the `LOAN_PAYMENTS` credit category within the given time window, across all the accounts in the report. For example, a value of 100 indicates that 100% of the inflows were spent on transactions that fall into the `LOAN_PAYMENTS` credit category. If there's no available income for the giving time period, this field value will be `-1`")

  public Double getPercentageOfIncome() {
    return percentageOfIncome;
  }


  public void setPercentageOfIncome(Double percentageOfIncome) {
    this.percentageOfIncome = percentageOfIncome;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    LoanPaymentsIndicators loanPaymentsIndicators = (LoanPaymentsIndicators) o;
    return Objects.equals(this.amount, loanPaymentsIndicators.amount) &&
        Objects.equals(this.isoCurrencyCode, loanPaymentsIndicators.isoCurrencyCode) &&
        Objects.equals(this.unofficialCurrencyCode, loanPaymentsIndicators.unofficialCurrencyCode) &&
        Objects.equals(this.monthlyAverage, loanPaymentsIndicators.monthlyAverage) &&
        Objects.equals(this.categoryDetails, loanPaymentsIndicators.categoryDetails) &&
        Objects.equals(this.topProviders, loanPaymentsIndicators.topProviders) &&
        Objects.equals(this.transactionsCount, loanPaymentsIndicators.transactionsCount) &&
        Objects.equals(this.monthlySummaries, loanPaymentsIndicators.monthlySummaries) &&
        Objects.equals(this.daysSinceLastOccurrence, loanPaymentsIndicators.daysSinceLastOccurrence) &&
        Objects.equals(this.percentageOfIncome, loanPaymentsIndicators.percentageOfIncome);
  }

  @Override
  public int hashCode() {
    return Objects.hash(amount, isoCurrencyCode, unofficialCurrencyCode, monthlyAverage, categoryDetails, topProviders, transactionsCount, monthlySummaries, daysSinceLastOccurrence, percentageOfIncome);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class LoanPaymentsIndicators {\n");
    sb.append("    amount: ").append(toIndentedString(amount)).append("\n");
    sb.append("    isoCurrencyCode: ").append(toIndentedString(isoCurrencyCode)).append("\n");
    sb.append("    unofficialCurrencyCode: ").append(toIndentedString(unofficialCurrencyCode)).append("\n");
    sb.append("    monthlyAverage: ").append(toIndentedString(monthlyAverage)).append("\n");
    sb.append("    categoryDetails: ").append(toIndentedString(categoryDetails)).append("\n");
    sb.append("    topProviders: ").append(toIndentedString(topProviders)).append("\n");
    sb.append("    transactionsCount: ").append(toIndentedString(transactionsCount)).append("\n");
    sb.append("    monthlySummaries: ").append(toIndentedString(monthlySummaries)).append("\n");
    sb.append("    daysSinceLastOccurrence: ").append(toIndentedString(daysSinceLastOccurrence)).append("\n");
    sb.append("    percentageOfIncome: ").append(toIndentedString(percentageOfIncome)).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    ");
  }

}

