/*
 * 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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Summary statistics for a specific expenditure category, including total amount, monthly average, and percentage of income.
 */
@ApiModel(description = "Summary statistics for a specific expenditure category, including total amount, monthly average, and percentage of income.")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-12-11T18:58:39.328614Z[Etc/UTC]")
public class ExpenditureSummary {
  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_TRANSACTIONS_COUNT = "transactions_count";
  @SerializedName(SERIALIZED_NAME_TRANSACTIONS_COUNT)
  private Integer transactionsCount;

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

  public static final String SERIALIZED_NAME_TOP_CATEGORIES = "top_categories";
  @SerializedName(SERIALIZED_NAME_TOP_CATEGORIES)
  private List<CategoryExpenses> topCategories = null;


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

   /**
   * The total value of all the aggregated transactions in this expenditure category.
   * @return amount
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The total value of all the aggregated transactions in this expenditure category.")

  public Double getAmount() {
    return amount;
  }


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


  public ExpenditureSummary 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 ExpenditureSummary 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 ExpenditureSummary 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 ExpenditureSummary transactionsCount(Integer transactionsCount) {
    
    this.transactionsCount = transactionsCount;
    return this;
  }

   /**
   * The total number of outflow transactions in this expenses group, within the given time window across all the accounts in the report.
   * @return transactionsCount
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The total number of outflow transactions in this expenses group, within the given time window across all the accounts in the report.")

  public Integer getTransactionsCount() {
    return transactionsCount;
  }


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


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

   /**
   * The percentage of the total inflows that was spent in this expenses group, within the given time window across all the accounts in the report. For example, a value of 100 represents that 100% of the inflows were spent on transactions that fall into this expenditure group. 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 total inflows that was spent in this expenses group, within the given time window across all the accounts in the report. For example, a value of 100 represents that 100% of the inflows were spent on transactions that fall into this expenditure group. 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;
  }


  public ExpenditureSummary topCategories(List<CategoryExpenses> topCategories) {
    
    this.topCategories = topCategories;
    return this;
  }

  public ExpenditureSummary addTopCategoriesItem(CategoryExpenses topCategoriesItem) {
    if (this.topCategories == null) {
      this.topCategories = new ArrayList<>();
    }
    this.topCategories.add(topCategoriesItem);
    return this;
  }

   /**
   * The primary credit categories of the expenses within the given time window, across all the accounts in the report.  The categories are sorted in descending order by the total value spent. See the [category taxonomy](https://plaid.com/documents/credit-category-taxonomy.csv) for a full listing of category IDs.
   * @return topCategories
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The primary credit categories of the expenses within the given time window, across all the accounts in the report.  The categories are sorted in descending order by the total value spent. See the [category taxonomy](https://plaid.com/documents/credit-category-taxonomy.csv) for a full listing of category IDs.")

  public List<CategoryExpenses> getTopCategories() {
    return topCategories;
  }


  public void setTopCategories(List<CategoryExpenses> topCategories) {
    this.topCategories = topCategories;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    ExpenditureSummary expenditureSummary = (ExpenditureSummary) o;
    return Objects.equals(this.amount, expenditureSummary.amount) &&
        Objects.equals(this.isoCurrencyCode, expenditureSummary.isoCurrencyCode) &&
        Objects.equals(this.unofficialCurrencyCode, expenditureSummary.unofficialCurrencyCode) &&
        Objects.equals(this.monthlyAverage, expenditureSummary.monthlyAverage) &&
        Objects.equals(this.transactionsCount, expenditureSummary.transactionsCount) &&
        Objects.equals(this.percentageOfIncome, expenditureSummary.percentageOfIncome) &&
        Objects.equals(this.topCategories, expenditureSummary.topCategories);
  }

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

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class ExpenditureSummary {\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("    transactionsCount: ").append(toIndentedString(transactionsCount)).append("\n");
    sb.append("    percentageOfIncome: ").append(toIndentedString(percentageOfIncome)).append("\n");
    sb.append("    topCategories: ").append(toIndentedString(topCategories)).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    ");
  }

}

