=begin
#Auth Oauth

#No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)

The version of the OpenAPI document: v1

Generated by: https://openapi-generator.tech
OpenAPI Generator version: 6.2.1

=end

require 'cgi'

module Hubspot
  module Oauth
    class TokensApi
      attr_accessor :api_client

      def initialize(api_client = ApiClient.default)
        @api_client = api_client
      end
      # Refresh an access token
      # Use a [previously obtained refresh token](#get-oauth-2.0-access-and-refresh-tokens) to generate a new access token.   Access tokens are short lived. You can check the `expires_in` parameter when generating an access token to determine its lifetime (in seconds). If you need offline access to HubSpot data, store the refresh token you get when [initiating your OAuth integration](https://developers.hubspot.com/docs/guides/api/app-management/oauth-tokens#initiating-oauth-access) and use it to generate a new access token once the initial one expires.  Note: HubSpot access tokens will fluctuate in size as the information that's encoded in them changes over time. It's recommended to allow for tokens to be up to 300 characters to account for any potential changes.
      # @param [Hash] opts the optional parameters
      # @option opts [String] :grant_type 
      # @option opts [String] :code 
      # @option opts [String] :redirect_uri 
      # @option opts [String] :client_id 
      # @option opts [String] :client_secret 
      # @option opts [String] :refresh_token 
      # @return [TokenResponseIF]
      def create(opts = {})
        data, _status_code, _headers = create_with_http_info(opts)
        data
      end

      # Refresh an access token
      # Use a [previously obtained refresh token](#get-oauth-2.0-access-and-refresh-tokens) to generate a new access token.   Access tokens are short lived. You can check the &#x60;expires_in&#x60; parameter when generating an access token to determine its lifetime (in seconds). If you need offline access to HubSpot data, store the refresh token you get when [initiating your OAuth integration](https://developers.hubspot.com/docs/guides/api/app-management/oauth-tokens#initiating-oauth-access) and use it to generate a new access token once the initial one expires.  Note: HubSpot access tokens will fluctuate in size as the information that&#39;s encoded in them changes over time. It&#39;s recommended to allow for tokens to be up to 300 characters to account for any potential changes.
      # @param [Hash] opts the optional parameters
      # @option opts [String] :grant_type 
      # @option opts [String] :code 
      # @option opts [String] :redirect_uri 
      # @option opts [String] :client_id 
      # @option opts [String] :client_secret 
      # @option opts [String] :refresh_token 
      # @return [Array<(TokenResponseIF, Integer, Hash)>] TokenResponseIF data, response status code and response headers
      def create_with_http_info(opts = {})
        if @api_client.config.debugging
          @api_client.config.logger.debug 'Calling API: TokensApi.create ...'
        end
        allowable_values = ["authorization_code", "refresh_token"]
        if @api_client.config.client_side_validation && opts[:'grant_type'] && !allowable_values.include?(opts[:'grant_type'])
          fail ArgumentError, "invalid value for \"grant_type\", must be one of #{allowable_values}"
        end
        # resource path
        local_var_path = '/oauth/v1/token'

        # 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/x-www-form-urlencoded'])
        if !content_type.nil?
            header_params['Content-Type'] = content_type
        end

        # form parameters
        form_params = opts[:form_params] || {}
        form_params['grant_type'] = opts[:'grant_type'] if !opts[:'grant_type'].nil?
        form_params['code'] = opts[:'code'] if !opts[:'code'].nil?
        form_params['redirect_uri'] = opts[:'redirect_uri'] if !opts[:'redirect_uri'].nil?
        form_params['client_id'] = opts[:'client_id'] if !opts[:'client_id'].nil?
        form_params['client_secret'] = opts[:'client_secret'] if !opts[:'client_secret'].nil?
        form_params['refresh_token'] = opts[:'refresh_token'] if !opts[:'refresh_token'].nil?

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

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

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

        new_options = opts.merge(
          :operation => :"TokensApi.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: TokensApi#create\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
        end
        return data, status_code, headers
      end
    end
  end
end
