/*
 * 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.PartnerEndCustomerAddress;
import com.plaid.client.model.PartnerEndCustomerBankAddendumAcceptance;
import com.plaid.client.model.PartnerEndCustomerBillingContact;
import com.plaid.client.model.PartnerEndCustomerCustomerSupportInfo;
import com.plaid.client.model.PartnerEndCustomerQuestionnaires;
import com.plaid.client.model.PartnerEndCustomerTechnicalContact;
import com.plaid.client.model.Products;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Request schema for &#x60;/beta/partner/customer/v1/create&#x60;.
 */
@ApiModel(description = "Request schema for `/beta/partner/customer/v1/create`.")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-12-11T18:58:39.328614Z[Etc/UTC]")
public class BetaPartnerCustomerV1CreateRequest {
  public static final String SERIALIZED_NAME_CLIENT_ID = "client_id";
  @SerializedName(SERIALIZED_NAME_CLIENT_ID)
  private String clientId;

  public static final String SERIALIZED_NAME_SECRET = "secret";
  @SerializedName(SERIALIZED_NAME_SECRET)
  private String secret;

  public static final String SERIALIZED_NAME_COMPANY_NAME = "company_name";
  @SerializedName(SERIALIZED_NAME_COMPANY_NAME)
  private String companyName;

  public static final String SERIALIZED_NAME_IS_DILIGENCE_ATTESTED = "is_diligence_attested";
  @SerializedName(SERIALIZED_NAME_IS_DILIGENCE_ATTESTED)
  private Boolean isDiligenceAttested;

  public static final String SERIALIZED_NAME_PRODUCTS = "products";
  @SerializedName(SERIALIZED_NAME_PRODUCTS)
  private List<Products> products = null;

  public static final String SERIALIZED_NAME_CREATE_LINK_CUSTOMIZATION = "create_link_customization";
  @SerializedName(SERIALIZED_NAME_CREATE_LINK_CUSTOMIZATION)
  private Boolean createLinkCustomization;

  public static final String SERIALIZED_NAME_LOGO = "logo";
  @SerializedName(SERIALIZED_NAME_LOGO)
  private String logo;

  public static final String SERIALIZED_NAME_LEGAL_ENTITY_NAME = "legal_entity_name";
  @SerializedName(SERIALIZED_NAME_LEGAL_ENTITY_NAME)
  private String legalEntityName;

  public static final String SERIALIZED_NAME_WEBSITE = "website";
  @SerializedName(SERIALIZED_NAME_WEBSITE)
  private String website;

  public static final String SERIALIZED_NAME_APPLICATION_NAME = "application_name";
  @SerializedName(SERIALIZED_NAME_APPLICATION_NAME)
  private String applicationName;

  public static final String SERIALIZED_NAME_TECHNICAL_CONTACT = "technical_contact";
  @SerializedName(SERIALIZED_NAME_TECHNICAL_CONTACT)
  private PartnerEndCustomerTechnicalContact technicalContact;

  public static final String SERIALIZED_NAME_BILLING_CONTACT = "billing_contact";
  @SerializedName(SERIALIZED_NAME_BILLING_CONTACT)
  private PartnerEndCustomerBillingContact billingContact;

  public static final String SERIALIZED_NAME_CUSTOMER_SUPPORT_INFO = "customer_support_info";
  @SerializedName(SERIALIZED_NAME_CUSTOMER_SUPPORT_INFO)
  private PartnerEndCustomerCustomerSupportInfo customerSupportInfo;

  public static final String SERIALIZED_NAME_ADDRESS = "address";
  @SerializedName(SERIALIZED_NAME_ADDRESS)
  private PartnerEndCustomerAddress address;

  public static final String SERIALIZED_NAME_REDIRECT_URIS = "redirect_uris";
  @SerializedName(SERIALIZED_NAME_REDIRECT_URIS)
  private List<String> redirectUris = null;

  public static final String SERIALIZED_NAME_BANK_ADDENDUM_ACCEPTANCE = "bank_addendum_acceptance";
  @SerializedName(SERIALIZED_NAME_BANK_ADDENDUM_ACCEPTANCE)
  private PartnerEndCustomerBankAddendumAcceptance bankAddendumAcceptance;

  public static final String SERIALIZED_NAME_QUESTIONNAIRES = "questionnaires";
  @SerializedName(SERIALIZED_NAME_QUESTIONNAIRES)
  private PartnerEndCustomerQuestionnaires questionnaires;


  public BetaPartnerCustomerV1CreateRequest clientId(String clientId) {
    
    this.clientId = clientId;
    return this;
  }

   /**
   * Your Plaid API &#x60;client_id&#x60;. The &#x60;client_id&#x60; is required and may be provided either in the &#x60;PLAID-CLIENT-ID&#x60; header or as part of a request body.
   * @return clientId
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body.")

  public String getClientId() {
    return clientId;
  }


  public void setClientId(String clientId) {
    this.clientId = clientId;
  }


  public BetaPartnerCustomerV1CreateRequest secret(String secret) {
    
    this.secret = secret;
    return this;
  }

   /**
   * Your Plaid API &#x60;secret&#x60;. The &#x60;secret&#x60; is required and may be provided either in the &#x60;PLAID-SECRET&#x60; header or as part of a request body.
   * @return secret
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body.")

  public String getSecret() {
    return secret;
  }


  public void setSecret(String secret) {
    this.secret = secret;
  }


  public BetaPartnerCustomerV1CreateRequest companyName(String companyName) {
    
    this.companyName = companyName;
    return this;
  }

   /**
   * The company name of the end customer being created. This will be used to display the end customer in the Plaid Dashboard. It will not be shown to end users.
   * @return companyName
  **/
  @ApiModelProperty(required = true, value = "The company name of the end customer being created. This will be used to display the end customer in the Plaid Dashboard. It will not be shown to end users.")

  public String getCompanyName() {
    return companyName;
  }


  public void setCompanyName(String companyName) {
    this.companyName = companyName;
  }


  public BetaPartnerCustomerV1CreateRequest isDiligenceAttested(Boolean isDiligenceAttested) {
    
    this.isDiligenceAttested = isDiligenceAttested;
    return this;
  }

   /**
   * Denotes whether or not the partner has completed attestation of diligence for the end customer to be created.
   * @return isDiligenceAttested
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Denotes whether or not the partner has completed attestation of diligence for the end customer to be created.")

  public Boolean getIsDiligenceAttested() {
    return isDiligenceAttested;
  }


  public void setIsDiligenceAttested(Boolean isDiligenceAttested) {
    this.isDiligenceAttested = isDiligenceAttested;
  }


  public BetaPartnerCustomerV1CreateRequest products(List<Products> products) {
    
    this.products = products;
    return this;
  }

  public BetaPartnerCustomerV1CreateRequest addProductsItem(Products productsItem) {
    if (this.products == null) {
      this.products = new ArrayList<>();
    }
    this.products.add(productsItem);
    return this;
  }

   /**
   * The products to be enabled for the end customer. If empty or &#x60;null&#x60;, this field will default to the products enabled for the reseller at the time this endpoint is called.
   * @return products
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The products to be enabled for the end customer. If empty or `null`, this field will default to the products enabled for the reseller at the time this endpoint is called.")

  public List<Products> getProducts() {
    return products;
  }


  public void setProducts(List<Products> products) {
    this.products = products;
  }


  public BetaPartnerCustomerV1CreateRequest createLinkCustomization(Boolean createLinkCustomization) {
    
    this.createLinkCustomization = createLinkCustomization;
    return this;
  }

   /**
   * If &#x60;true&#x60;, the end customer&#39;s default Link customization will be set to match the partner&#39;s. You can always change the end customer&#39;s Link customization in the Plaid Dashboard. See the [Link Customization docs](https://plaid.com/docs/link/customization/) for more information. If you require the ability to programmatically create end customers using multiple different Link customization profiles, contact your Plaid Account Manager for assistance.   Important: Data Transparency Messaging (DTM) use cases will not be copied to the end customer&#39;s Link customization unless the **Publish changes** button is clicked after the use cases are applied. Link will not work in Production unless the end customer&#39;s DTM use cases are configured. For more details, see [Data Transparency Messaging](https://plaid.com/docs/link/data-transparency-messaging-migration-guide/).
   * @return createLinkCustomization
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "If `true`, the end customer's default Link customization will be set to match the partner's. You can always change the end customer's Link customization in the Plaid Dashboard. See the [Link Customization docs](https://plaid.com/docs/link/customization/) for more information. If you require the ability to programmatically create end customers using multiple different Link customization profiles, contact your Plaid Account Manager for assistance.   Important: Data Transparency Messaging (DTM) use cases will not be copied to the end customer's Link customization unless the **Publish changes** button is clicked after the use cases are applied. Link will not work in Production unless the end customer's DTM use cases are configured. For more details, see [Data Transparency Messaging](https://plaid.com/docs/link/data-transparency-messaging-migration-guide/).")

  public Boolean getCreateLinkCustomization() {
    return createLinkCustomization;
  }


  public void setCreateLinkCustomization(Boolean createLinkCustomization) {
    this.createLinkCustomization = createLinkCustomization;
  }


  public BetaPartnerCustomerV1CreateRequest logo(String logo) {
    
    this.logo = logo;
    return this;
  }

   /**
   * Base64-encoded representation of the end customer&#39;s logo. Must be a PNG of size 1024x1024 under 4MB. The logo will be shared with financial institutions and shown to the end user during Link flows. A logo is required if &#x60;create_link_customization&#x60; is &#x60;true&#x60;. If &#x60;create_link_customization&#x60; is &#x60;false&#x60; and the logo is omitted, the partner&#39;s logo will be used if one exists, otherwise a stock logo will be used.
   * @return logo
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "Base64-encoded representation of the end customer's logo. Must be a PNG of size 1024x1024 under 4MB. The logo will be shared with financial institutions and shown to the end user during Link flows. A logo is required if `create_link_customization` is `true`. If `create_link_customization` is `false` and the logo is omitted, the partner's logo will be used if one exists, otherwise a stock logo will be used.")

  public String getLogo() {
    return logo;
  }


  public void setLogo(String logo) {
    this.logo = logo;
  }


  public BetaPartnerCustomerV1CreateRequest legalEntityName(String legalEntityName) {
    
    this.legalEntityName = legalEntityName;
    return this;
  }

   /**
   * The end customer&#39;s legal name. This will be shared with financial institutions as part of the OAuth registration process. It will not be shown to end users.
   * @return legalEntityName
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "The end customer's legal name. This will be shared with financial institutions as part of the OAuth registration process. It will not be shown to end users.")

  public String getLegalEntityName() {
    return legalEntityName;
  }


  public void setLegalEntityName(String legalEntityName) {
    this.legalEntityName = legalEntityName;
  }


  public BetaPartnerCustomerV1CreateRequest website(String website) {
    
    this.website = website;
    return this;
  }

   /**
   * The end customer&#39;s website.
   * @return website
  **/
  @ApiModelProperty(required = true, value = "The end customer's website.")

  public String getWebsite() {
    return website;
  }


  public void setWebsite(String website) {
    this.website = website;
  }


  public BetaPartnerCustomerV1CreateRequest applicationName(String applicationName) {
    
    this.applicationName = applicationName;
    return this;
  }

   /**
   * The name of the end customer&#39;s application. This will be shown to end users when they go through the Plaid Link flow. The application name must be unique and cannot match the name of another application already registered with Plaid.
   * @return applicationName
  **/
  @ApiModelProperty(required = true, value = "The name of the end customer's application. This will be shown to end users when they go through the Plaid Link flow. The application name must be unique and cannot match the name of another application already registered with Plaid.")

  public String getApplicationName() {
    return applicationName;
  }


  public void setApplicationName(String applicationName) {
    this.applicationName = applicationName;
  }


  public BetaPartnerCustomerV1CreateRequest technicalContact(PartnerEndCustomerTechnicalContact technicalContact) {
    
    this.technicalContact = technicalContact;
    return this;
  }

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

  public PartnerEndCustomerTechnicalContact getTechnicalContact() {
    return technicalContact;
  }


  public void setTechnicalContact(PartnerEndCustomerTechnicalContact technicalContact) {
    this.technicalContact = technicalContact;
  }


  public BetaPartnerCustomerV1CreateRequest billingContact(PartnerEndCustomerBillingContact billingContact) {
    
    this.billingContact = billingContact;
    return this;
  }

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

  public PartnerEndCustomerBillingContact getBillingContact() {
    return billingContact;
  }


  public void setBillingContact(PartnerEndCustomerBillingContact billingContact) {
    this.billingContact = billingContact;
  }


  public BetaPartnerCustomerV1CreateRequest customerSupportInfo(PartnerEndCustomerCustomerSupportInfo customerSupportInfo) {
    
    this.customerSupportInfo = customerSupportInfo;
    return this;
  }

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

  public PartnerEndCustomerCustomerSupportInfo getCustomerSupportInfo() {
    return customerSupportInfo;
  }


  public void setCustomerSupportInfo(PartnerEndCustomerCustomerSupportInfo customerSupportInfo) {
    this.customerSupportInfo = customerSupportInfo;
  }


  public BetaPartnerCustomerV1CreateRequest address(PartnerEndCustomerAddress address) {
    
    this.address = address;
    return this;
  }

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

  public PartnerEndCustomerAddress getAddress() {
    return address;
  }


  public void setAddress(PartnerEndCustomerAddress address) {
    this.address = address;
  }


  public BetaPartnerCustomerV1CreateRequest redirectUris(List<String> redirectUris) {
    
    this.redirectUris = redirectUris;
    return this;
  }

  public BetaPartnerCustomerV1CreateRequest addRedirectUrisItem(String redirectUrisItem) {
    if (this.redirectUris == null) {
      this.redirectUris = new ArrayList<>();
    }
    this.redirectUris.add(redirectUrisItem);
    return this;
  }

   /**
   * A list of URIs indicating the destination(s) where a user can be forwarded after completing the Link flow; used to support OAuth authentication flows when launching Link in the browser or another app. URIs should not contain any query parameters. When used in Production, URIs must use https. To specify any subdomain, use &#x60;*&#x60; as a wildcard character, e.g. &#x60;https://_*.example.com/oauth.html&#x60;. To modify redirect URIs for an end customer after creating them, go to the end customer&#39;s [API page](https://dashboard.plaid.com/team/api) in the Dashboard.
   * @return redirectUris
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "A list of URIs indicating the destination(s) where a user can be forwarded after completing the Link flow; used to support OAuth authentication flows when launching Link in the browser or another app. URIs should not contain any query parameters. When used in Production, URIs must use https. To specify any subdomain, use `*` as a wildcard character, e.g. `https://_*.example.com/oauth.html`. To modify redirect URIs for an end customer after creating them, go to the end customer's [API page](https://dashboard.plaid.com/team/api) in the Dashboard.")

  public List<String> getRedirectUris() {
    return redirectUris;
  }


  public void setRedirectUris(List<String> redirectUris) {
    this.redirectUris = redirectUris;
  }


  public BetaPartnerCustomerV1CreateRequest bankAddendumAcceptance(PartnerEndCustomerBankAddendumAcceptance bankAddendumAcceptance) {
    
    this.bankAddendumAcceptance = bankAddendumAcceptance;
    return this;
  }

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

  public PartnerEndCustomerBankAddendumAcceptance getBankAddendumAcceptance() {
    return bankAddendumAcceptance;
  }


  public void setBankAddendumAcceptance(PartnerEndCustomerBankAddendumAcceptance bankAddendumAcceptance) {
    this.bankAddendumAcceptance = bankAddendumAcceptance;
  }


  public BetaPartnerCustomerV1CreateRequest questionnaires(PartnerEndCustomerQuestionnaires questionnaires) {
    
    this.questionnaires = questionnaires;
    return this;
  }

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

  public PartnerEndCustomerQuestionnaires getQuestionnaires() {
    return questionnaires;
  }


  public void setQuestionnaires(PartnerEndCustomerQuestionnaires questionnaires) {
    this.questionnaires = questionnaires;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    BetaPartnerCustomerV1CreateRequest betaPartnerCustomerV1CreateRequest = (BetaPartnerCustomerV1CreateRequest) o;
    return Objects.equals(this.clientId, betaPartnerCustomerV1CreateRequest.clientId) &&
        Objects.equals(this.secret, betaPartnerCustomerV1CreateRequest.secret) &&
        Objects.equals(this.companyName, betaPartnerCustomerV1CreateRequest.companyName) &&
        Objects.equals(this.isDiligenceAttested, betaPartnerCustomerV1CreateRequest.isDiligenceAttested) &&
        Objects.equals(this.products, betaPartnerCustomerV1CreateRequest.products) &&
        Objects.equals(this.createLinkCustomization, betaPartnerCustomerV1CreateRequest.createLinkCustomization) &&
        Objects.equals(this.logo, betaPartnerCustomerV1CreateRequest.logo) &&
        Objects.equals(this.legalEntityName, betaPartnerCustomerV1CreateRequest.legalEntityName) &&
        Objects.equals(this.website, betaPartnerCustomerV1CreateRequest.website) &&
        Objects.equals(this.applicationName, betaPartnerCustomerV1CreateRequest.applicationName) &&
        Objects.equals(this.technicalContact, betaPartnerCustomerV1CreateRequest.technicalContact) &&
        Objects.equals(this.billingContact, betaPartnerCustomerV1CreateRequest.billingContact) &&
        Objects.equals(this.customerSupportInfo, betaPartnerCustomerV1CreateRequest.customerSupportInfo) &&
        Objects.equals(this.address, betaPartnerCustomerV1CreateRequest.address) &&
        Objects.equals(this.redirectUris, betaPartnerCustomerV1CreateRequest.redirectUris) &&
        Objects.equals(this.bankAddendumAcceptance, betaPartnerCustomerV1CreateRequest.bankAddendumAcceptance) &&
        Objects.equals(this.questionnaires, betaPartnerCustomerV1CreateRequest.questionnaires);
  }

  @Override
  public int hashCode() {
    return Objects.hash(clientId, secret, companyName, isDiligenceAttested, products, createLinkCustomization, logo, legalEntityName, website, applicationName, technicalContact, billingContact, customerSupportInfo, address, redirectUris, bankAddendumAcceptance, questionnaires);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class BetaPartnerCustomerV1CreateRequest {\n");
    sb.append("    clientId: ").append(toIndentedString(clientId)).append("\n");
    sb.append("    secret: ").append(toIndentedString(secret)).append("\n");
    sb.append("    companyName: ").append(toIndentedString(companyName)).append("\n");
    sb.append("    isDiligenceAttested: ").append(toIndentedString(isDiligenceAttested)).append("\n");
    sb.append("    products: ").append(toIndentedString(products)).append("\n");
    sb.append("    createLinkCustomization: ").append(toIndentedString(createLinkCustomization)).append("\n");
    sb.append("    logo: ").append(toIndentedString(logo)).append("\n");
    sb.append("    legalEntityName: ").append(toIndentedString(legalEntityName)).append("\n");
    sb.append("    website: ").append(toIndentedString(website)).append("\n");
    sb.append("    applicationName: ").append(toIndentedString(applicationName)).append("\n");
    sb.append("    technicalContact: ").append(toIndentedString(technicalContact)).append("\n");
    sb.append("    billingContact: ").append(toIndentedString(billingContact)).append("\n");
    sb.append("    customerSupportInfo: ").append(toIndentedString(customerSupportInfo)).append("\n");
    sb.append("    address: ").append(toIndentedString(address)).append("\n");
    sb.append("    redirectUris: ").append(toIndentedString(redirectUris)).append("\n");
    sb.append("    bankAddendumAcceptance: ").append(toIndentedString(bankAddendumAcceptance)).append("\n");
    sb.append("    questionnaires: ").append(toIndentedString(questionnaires)).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    ");
  }

}

