=begin
#Lob

#The Lob API is organized around REST. Our API is designed to have predictable, resource-oriented URLs and uses HTTP response codes to indicate any API errors. <p> Looking for our [previous documentation](https://lob.github.io/legacy-docs/)? 

The version of the OpenAPI document: 1.3.0
Contact: lob-openapi@lob.com
Generated by: https://openapi-generator.tech
OpenAPI Generator version: 5.2.1

=end

require 'cgi'

module Lob
  class BankAccountsApi
    attr_accessor :api_client

    def initialize(api_client = ApiClient.default)
      @api_client = api_client
    end
    # create
    # Creates a new bank account with the provided properties. Bank accounts created in live mode will need to be verified via micro deposits before being able to send live checks. The deposits will appear in the bank account in 2-3 business days and have the description \"VERIFICATION\".
    # @param bank_account_writable [BankAccountWritable] 
    # @param [Hash] opts the optional parameters
    # @return [BankAccount]
    def create(bank_account_writable, opts = {})
      data, _status_code, _headers = bank_account_create_with_http_info(bank_account_writable, opts)
      data
    end

    # create
    # Creates a new bank account with the provided properties. Bank accounts created in live mode will need to be verified via micro deposits before being able to send live checks. The deposits will appear in the bank account in 2-3 business days and have the description \&quot;VERIFICATION\&quot;.
    # @param bank_account_writable [BankAccountWritable] 
    # @param [Hash] opts the optional parameters
    # @return [Array<(BankAccount, Integer, Hash)>] BankAccount data, response status code and response headers
    def bank_account_create_with_http_info(bank_account_writable, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: BankAccountsApi.bank_account_create ...'
      end
      # verify the required parameter 'bank_account_writable' is set
      if @api_client.config.client_side_validation && bank_account_writable.nil?
        fail ArgumentError, "Missing the required parameter 'bank_account_writable' when calling BankAccountsApi.bank_account_create"
      end
      # resource path
      local_var_path = '/bank_accounts'

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])
      # HTTP header 'Content-Type'
      content_type = @api_client.select_header_content_type(['application/json', 'application/x-www-form-urlencoded', 'multipart/form-data'])
      if !content_type.nil?
          header_params['Content-Type'] = content_type
      end

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:debug_body] || @api_client.object_to_http_body(bank_account_writable)

      # return_type
      return_type = opts[:debug_return_type] || 'BankAccount'

      # auth_names
      auth_names = opts[:debug_auth_names] || ['basicAuth']

      new_options = opts.merge(
        :operation => :"BankAccountsApi.bank_account_create",
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type
      )

      data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: BankAccountsApi#bank_account_create\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # delete
    # Permanently deletes a bank account. It cannot be undone.
    # @param bank_id [String] id of the bank account
    # @param [Hash] opts the optional parameters
    # @return [BankAccountDeletion]
    def delete(bank_id, opts = {})
      data, _status_code, _headers = bank_account_delete_with_http_info(bank_id, opts)
      data
    end

    # delete
    # Permanently deletes a bank account. It cannot be undone.
    # @param bank_id [String] id of the bank account
    # @param [Hash] opts the optional parameters
    # @return [Array<(BankAccountDeletion, Integer, Hash)>] BankAccountDeletion data, response status code and response headers
    def bank_account_delete_with_http_info(bank_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: BankAccountsApi.bank_account_delete ...'
      end
      # verify the required parameter 'bank_id' is set
      if @api_client.config.client_side_validation && bank_id.nil?
        fail ArgumentError, "Missing the required parameter 'bank_id' when calling BankAccountsApi.bank_account_delete"
      end
      pattern = Regexp.new(/^bank_[a-zA-Z0-9]+$/)
      if @api_client.config.client_side_validation && bank_id !~ pattern
        fail ArgumentError, "invalid value for 'bank_id' when calling BankAccountsApi.bank_account_delete, must conform to the pattern #{pattern}."
      end

      # resource path
      local_var_path = '/bank_accounts/{bank_id}'.sub('{' + 'bank_id' + '}', CGI.escape(bank_id.to_s))

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:debug_body]

      # return_type
      return_type = opts[:debug_return_type] || 'BankAccountDeletion'

      # auth_names
      auth_names = opts[:debug_auth_names] || ['basicAuth']

      new_options = opts.merge(
        :operation => :"BankAccountsApi.bank_account_delete",
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type
      )

      data, status_code, headers = @api_client.call_api(:DELETE, local_var_path, new_options)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: BankAccountsApi#bank_account_delete\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # get
    # Retrieves the details of an existing bank account. You need only supply the unique bank account identifier that was returned upon bank account creation.
    # @param bank_id [String] id of the bank account
    # @param [Hash] opts the optional parameters
    # @return [BankAccount]
    def get(bank_id, opts = {})
      data, _status_code, _headers = bank_account_retrieve_with_http_info(bank_id, opts)
      data
    end

    # get
    # Retrieves the details of an existing bank account. You need only supply the unique bank account identifier that was returned upon bank account creation.
    # @param bank_id [String] id of the bank account
    # @param [Hash] opts the optional parameters
    # @return [Array<(BankAccount, Integer, Hash)>] BankAccount data, response status code and response headers
    def bank_account_retrieve_with_http_info(bank_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: BankAccountsApi.bank_account_retrieve ...'
      end
      # verify the required parameter 'bank_id' is set
      if @api_client.config.client_side_validation && bank_id.nil?
        fail ArgumentError, "Missing the required parameter 'bank_id' when calling BankAccountsApi.bank_account_retrieve"
      end
      pattern = Regexp.new(/^bank_[a-zA-Z0-9]+$/)
      if @api_client.config.client_side_validation && bank_id !~ pattern
        fail ArgumentError, "invalid value for 'bank_id' when calling BankAccountsApi.bank_account_retrieve, must conform to the pattern #{pattern}."
      end

      # resource path
      local_var_path = '/bank_accounts/{bank_id}'.sub('{' + 'bank_id' + '}', CGI.escape(bank_id.to_s))

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:debug_body]

      # return_type
      return_type = opts[:debug_return_type] || 'BankAccount'

      # auth_names
      auth_names = opts[:debug_auth_names] || ['basicAuth']

      new_options = opts.merge(
        :operation => :"BankAccountsApi.bank_account_retrieve",
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type
      )

      data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: BankAccountsApi#bank_account_retrieve\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # verify
    # Verify a bank account in order to create a check.
    # @param bank_id [String] id of the bank account to be verified
    # @param bank_account_verify [BankAccountVerify] 
    # @param [Hash] opts the optional parameters
    # @return [BankAccount]
    def verify(bank_id, bank_account_verify, opts = {})
      data, _status_code, _headers = bank_account_verify_with_http_info(bank_id, bank_account_verify, opts)
      data
    end

    # verify
    # Verify a bank account in order to create a check.
    # @param bank_id [String] id of the bank account to be verified
    # @param bank_account_verify [BankAccountVerify] 
    # @param [Hash] opts the optional parameters
    # @return [Array<(BankAccount, Integer, Hash)>] BankAccount data, response status code and response headers
    def bank_account_verify_with_http_info(bank_id, bank_account_verify, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: BankAccountsApi.bank_account_verify ...'
      end
      # verify the required parameter 'bank_id' is set
      if @api_client.config.client_side_validation && bank_id.nil?
        fail ArgumentError, "Missing the required parameter 'bank_id' when calling BankAccountsApi.bank_account_verify"
      end
      pattern = Regexp.new(/^bank_[a-zA-Z0-9]+$/)
      if @api_client.config.client_side_validation && bank_id !~ pattern
        fail ArgumentError, "invalid value for 'bank_id' when calling BankAccountsApi.bank_account_verify, must conform to the pattern #{pattern}."
      end

      # verify the required parameter 'bank_account_verify' is set
      if @api_client.config.client_side_validation && bank_account_verify.nil?
        fail ArgumentError, "Missing the required parameter 'bank_account_verify' when calling BankAccountsApi.bank_account_verify"
      end
      # resource path
      local_var_path = '/bank_accounts/{bank_id}/verify'.sub('{' + 'bank_id' + '}', CGI.escape(bank_id.to_s))

      # query parameters
      query_params = opts[:query_params] || {}

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])
      # HTTP header 'Content-Type'
      content_type = @api_client.select_header_content_type(['application/json', 'application/x-www-form-urlencoded', 'multipart/form-data'])
      if !content_type.nil?
          header_params['Content-Type'] = content_type
      end

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:debug_body] || @api_client.object_to_http_body(bank_account_verify)

      # return_type
      return_type = opts[:debug_return_type] || 'BankAccount'

      # auth_names
      auth_names = opts[:debug_auth_names] || ['basicAuth']

      new_options = opts.merge(
        :operation => :"BankAccountsApi.bank_account_verify",
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type
      )

      data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: BankAccountsApi#bank_account_verify\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # list
    # Returns a list of your bank accounts. The bank accounts are returned sorted by creation date, with the most recently created bank accounts appearing first.
    # @param [Hash] opts the optional parameters
    # @option opts [Integer] :limit How many results to return. (default to 10)
    # @option opts [String] :before A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the &#x60;previous_url&#x60; field in the return response. 
    # @option opts [String] :after A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the &#x60;next_url&#x60; field in the return response. 
    # @option opts [Array<String>] :include Request that the response include the total count by specifying &#x60;include[]&#x3D;total_count&#x60;. 
    # @option opts [Hash<String, Time>] :date_created Filter by date created.
    # @option opts [Hash<String, String>] :metadata Filter by metadata key-value pair&#x60;.
    # @return [BankAccountList]
    def list(opts = {})
      data, _status_code, _headers = bank_accounts_list_with_http_info(opts)
      data
    end

    # list
    # Returns a list of your bank accounts. The bank accounts are returned sorted by creation date, with the most recently created bank accounts appearing first.
    # @param [Hash] opts the optional parameters
    # @option opts [Integer] :limit How many results to return. (default to 10)
    # @option opts [String] :before A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the &#x60;previous_url&#x60; field in the return response. 
    # @option opts [String] :after A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the &#x60;next_url&#x60; field in the return response. 
    # @option opts [Array<String>] :include Request that the response include the total count by specifying &#x60;include[]&#x3D;total_count&#x60;. 
    # @option opts [Hash<String, Time>] :date_created Filter by date created.
    # @option opts [Hash<String, String>] :metadata Filter by metadata key-value pair&#x60;.
    # @return [Array<(BankAccountList, Integer, Hash)>] BankAccountList data, response status code and response headers
    def bank_accounts_list_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug 'Calling API: BankAccountsApi.bank_accounts_list ...'
      end
      if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100
        fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling BankAccountsApi.bank_accounts_list, must be smaller than or equal to 100.'
      end

      if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
        fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling BankAccountsApi.bank_accounts_list, must be greater than or equal to 1.'
      end

      if @api_client.config.client_side_validation && !opts[:'metadata'].nil? && opts[:'metadata'].to_s.length > 500
        fail ArgumentError, 'invalid value for "opts[:"metadata"]" when calling BankAccountsApi.bank_accounts_list, the character length must be smaller than or equal to 500.'
      end

      pattern = Regexp.new(/[^"\\]{0,500}/)
      if @api_client.config.client_side_validation && !opts[:'metadata'].nil? && opts[:'metadata'] !~ pattern
        fail ArgumentError, "invalid value for 'opts[:\"metadata\"]' when calling BankAccountsApi.bank_accounts_list, must conform to the pattern #{pattern}."
      end

      # resource path
      local_var_path = '/bank_accounts'

      # query parameters
      query_params = opts[:query_params] || {}
      query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
      query_params[:'before'] = opts[:'before'] if !opts[:'before'].nil?
      query_params[:'after'] = opts[:'after'] if !opts[:'after'].nil?
      query_params[:'include'] = @api_client.build_collection_param(opts[:'include'], :multi) if !opts[:'include'].nil?
      query_params[:'date_created'] = opts[:'date_created'] if !opts[:'date_created'].nil?
      query_params[:'metadata'] = opts[:'metadata'] if !opts[:'metadata'].nil?

      # header parameters
      header_params = opts[:header_params] || {}
      # HTTP header 'Accept' (if needed)
      header_params['Accept'] = @api_client.select_header_accept(['application/json'])

      # form parameters
      form_params = opts[:form_params] || {}

      # http body (model)
      post_body = opts[:debug_body]

      # return_type
      return_type = opts[:debug_return_type] || 'BankAccountList'

      # auth_names
      auth_names = opts[:debug_auth_names] || ['basicAuth']

      new_options = opts.merge(
        :operation => :"BankAccountsApi.bank_accounts_list",
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => return_type
      )

      data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: BankAccountsApi#bank_accounts_list\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
  end
end
