=begin
PureCloud Platform API

With the PureCloud Platform API, you can control all aspects of your PureCloud environment. With the APIs you can access the system configuration, manage conversations and more.

OpenAPI spec version: v2
Contact: DeveloperEvangelists@genesys.com
Generated by: https://github.com/swagger-api/swagger-codegen.git

License: UNLICENSED
https://help.mypurecloud.com/articles/terms-and-conditions/

Terms of Service: https://help.mypurecloud.com/articles/terms-and-conditions/

=end

require "uri"

module PureCloud
  class OAuthApi
    attr_accessor :api_client

    def initialize(api_client = ApiClient.default)
      @api_client = api_client
    end

    # Delete OAuth Client
    # 
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [nil]
    def delete_oauth_client(client_id, opts = {})
      delete_oauth_client_with_http_info(client_id, opts)
      return nil
    end

    # Delete OAuth Client
    # 
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers
    def delete_oauth_client_with_http_info(client_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.delete_oauth_client ..."
      end
      
      
      # verify the required parameter 'client_id' is set
      fail ArgumentError, "Missing the required parameter 'client_id' when calling OAuthApi.delete_oauth_client" if client_id.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/clients/{clientId}".sub('{format}','json').sub('{' + 'clientId' + '}', client_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:DELETE, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names)
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#delete_oauth_client\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get a client that is authorized by the resource owner
    # 
    # @param client_id The ID of client
    # @param [Hash] opts the optional parameters
    # @return [OAuthAuthorization]
    def get_oauth_authorization(client_id, opts = {})
      data, _status_code, _headers = get_oauth_authorization_with_http_info(client_id, opts)
      return data
    end

    # Get a client that is authorized by the resource owner
    # 
    # @param client_id The ID of client
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthAuthorization, Fixnum, Hash)>] OAuthAuthorization data, response status code and response headers
    def get_oauth_authorization_with_http_info(client_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_authorization ..."
      end
      
      
      # verify the required parameter 'client_id' is set
      fail ArgumentError, "Missing the required parameter 'client_id' when calling OAuthApi.get_oauth_authorization" if client_id.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/authorizations/{clientId}".sub('{format}','json').sub('{' + 'clientId' + '}', client_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthAuthorization')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_authorization\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # List clients that are authorized by the resource owner
    # 
    # @param [Hash] opts the optional parameters
    # @return [OAuthAuthorizationListing]
    def get_oauth_authorizations(opts = {})
      data, _status_code, _headers = get_oauth_authorizations_with_http_info(opts)
      return data
    end

    # List clients that are authorized by the resource owner
    # 
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthAuthorizationListing, Fixnum, Hash)>] OAuthAuthorizationListing data, response status code and response headers
    def get_oauth_authorizations_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_authorizations ..."
      end
      
      # resource path
      local_var_path = "/api/v2/oauth/authorizations".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthAuthorizationListing')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_authorizations\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get OAuth Client
    # 
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [OAuthClient]
    def get_oauth_client(client_id, opts = {})
      data, _status_code, _headers = get_oauth_client_with_http_info(client_id, opts)
      return data
    end

    # Get OAuth Client
    # 
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthClient, Fixnum, Hash)>] OAuthClient data, response status code and response headers
    def get_oauth_client_with_http_info(client_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_client ..."
      end
      
      
      # verify the required parameter 'client_id' is set
      fail ArgumentError, "Missing the required parameter 'client_id' when calling OAuthApi.get_oauth_client" if client_id.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/clients/{clientId}".sub('{format}','json').sub('{' + 'clientId' + '}', client_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthClient')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_client\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # The list of OAuth clients
    # 
    # @param [Hash] opts the optional parameters
    # @return [OAuthClientEntityListing]
    def get_oauth_clients(opts = {})
      data, _status_code, _headers = get_oauth_clients_with_http_info(opts)
      return data
    end

    # The list of OAuth clients
    # 
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthClientEntityListing, Fixnum, Hash)>] OAuthClientEntityListing data, response status code and response headers
    def get_oauth_clients_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_clients ..."
      end
      
      # resource path
      local_var_path = "/api/v2/oauth/clients".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthClientEntityListing')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_clients\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # An OAuth scope
    # 
    # @param scope_id Scope ID
    # @param [Hash] opts the optional parameters
    # @option opts [String] :accept_language The language with which to display the scope description. (default to en-us)
    # @return [OAuthScope]
    def get_oauth_scope(scope_id, opts = {})
      data, _status_code, _headers = get_oauth_scope_with_http_info(scope_id, opts)
      return data
    end

    # An OAuth scope
    # 
    # @param scope_id Scope ID
    # @param [Hash] opts the optional parameters
    # @option opts [String] :accept_language The language with which to display the scope description.
    # @return [Array<(OAuthScope, Fixnum, Hash)>] OAuthScope data, response status code and response headers
    def get_oauth_scope_with_http_info(scope_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_scope ..."
      end
      
      
      # verify the required parameter 'scope_id' is set
      fail ArgumentError, "Missing the required parameter 'scope_id' when calling OAuthApi.get_oauth_scope" if scope_id.nil?
      
      
      
      
      
      
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/scopes/{scopeId}".sub('{format}','json').sub('{' + 'scopeId' + '}', scope_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)
      header_params[:'Accept-Language'] = opts[:'accept_language'] if opts[:'accept_language']

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthScope')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_scope\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # The list of OAuth scopes
    # 
    # @param [Hash] opts the optional parameters
    # @option opts [String] :accept_language The language with which to display the scope descriptions. (default to en-us)
    # @return [OAuthScopeListing]
    def get_oauth_scopes(opts = {})
      data, _status_code, _headers = get_oauth_scopes_with_http_info(opts)
      return data
    end

    # The list of OAuth scopes
    # 
    # @param [Hash] opts the optional parameters
    # @option opts [String] :accept_language The language with which to display the scope descriptions.
    # @return [Array<(OAuthScopeListing, Fixnum, Hash)>] OAuthScopeListing data, response status code and response headers
    def get_oauth_scopes_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.get_oauth_scopes ..."
      end
      
      
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/scopes".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)
      header_params[:'Accept-Language'] = opts[:'accept_language'] if opts[:'accept_language']

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:GET, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthScopeListing')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#get_oauth_scopes\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Regenerate Client Secret
    # This operation will set the client secret to a randomly generated cryptographically random value. All clients must be updated with the new secret. This operation should be used with caution.
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [OAuthClient]
    def post_oauth_client_secret(client_id, opts = {})
      data, _status_code, _headers = post_oauth_client_secret_with_http_info(client_id, opts)
      return data
    end

    # Regenerate Client Secret
    # This operation will set the client secret to a randomly generated cryptographically random value. All clients must be updated with the new secret. This operation should be used with caution.
    # @param client_id Client ID
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthClient, Fixnum, Hash)>] OAuthClient data, response status code and response headers
    def post_oauth_client_secret_with_http_info(client_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.post_oauth_client_secret ..."
      end
      
      
      # verify the required parameter 'client_id' is set
      fail ArgumentError, "Missing the required parameter 'client_id' when calling OAuthApi.post_oauth_client_secret" if client_id.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/clients/{clientId}/secret".sub('{format}','json').sub('{' + 'clientId' + '}', client_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = nil
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:POST, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthClient')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#post_oauth_client_secret\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Create OAuth client
    # The OAuth Grant/Client is required in order to create an authentication token and gain access to PureCloud.  The preferred authorizedGrantTypes is 'CODE' which requires applications to send a client ID and client secret. This is typically a web server.  If the client is unable to secure the client secret then the 'TOKEN' grant type aka IMPLICIT should be used. This is would be for browser or mobile apps.  If a client is to be used outside of the context of a user then the 'CLIENT-CREDENTIALS' grant may be used. In this case the client must be granted roles  via the 'roleIds' field.
    # @param body Client
    # @param [Hash] opts the optional parameters
    # @return [OAuthClient]
    def post_oauth_clients(body, opts = {})
      data, _status_code, _headers = post_oauth_clients_with_http_info(body, opts)
      return data
    end

    # Create OAuth client
    # The OAuth Grant/Client is required in order to create an authentication token and gain access to PureCloud.  The preferred authorizedGrantTypes is &#39;CODE&#39; which requires applications to send a client ID and client secret. This is typically a web server.  If the client is unable to secure the client secret then the &#39;TOKEN&#39; grant type aka IMPLICIT should be used. This is would be for browser or mobile apps.  If a client is to be used outside of the context of a user then the &#39;CLIENT-CREDENTIALS&#39; grant may be used. In this case the client must be granted roles  via the &#39;roleIds&#39; field.
    # @param body Client
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthClient, Fixnum, Hash)>] OAuthClient data, response status code and response headers
    def post_oauth_clients_with_http_info(body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.post_oauth_clients ..."
      end
      
      
      # verify the required parameter 'body' is set
      fail ArgumentError, "Missing the required parameter 'body' when calling OAuthApi.post_oauth_clients" if body.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/clients".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = @api_client.object_to_http_body(body)
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:POST, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthClient')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#post_oauth_clients\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Update OAuth Client
    # 
    # @param client_id Client ID
    # @param body Client
    # @param [Hash] opts the optional parameters
    # @return [OAuthClient]
    def put_oauth_client(client_id, body, opts = {})
      data, _status_code, _headers = put_oauth_client_with_http_info(client_id, body, opts)
      return data
    end

    # Update OAuth Client
    # 
    # @param client_id Client ID
    # @param body Client
    # @param [Hash] opts the optional parameters
    # @return [Array<(OAuthClient, Fixnum, Hash)>] OAuthClient data, response status code and response headers
    def put_oauth_client_with_http_info(client_id, body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: OAuthApi.put_oauth_client ..."
      end
      
      
      # verify the required parameter 'client_id' is set
      fail ArgumentError, "Missing the required parameter 'client_id' when calling OAuthApi.put_oauth_client" if client_id.nil?
      
      
      
      
      
      
      # verify the required parameter 'body' is set
      fail ArgumentError, "Missing the required parameter 'body' when calling OAuthApi.put_oauth_client" if body.nil?
      
      
      
      
      
      # resource path
      local_var_path = "/api/v2/oauth/clients/{clientId}".sub('{format}','json').sub('{' + 'clientId' + '}', client_id.to_s)

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['application/json']
      local_header_accept_result = @api_client.select_header_accept(local_header_accept) and header_params['Accept'] = local_header_accept_result

      # HTTP header 'Content-Type'
      local_header_content_type = ['application/json']
      header_params['Content-Type'] = @api_client.select_header_content_type(local_header_content_type)

      # form parameters
      form_params = {}

      # http body (model)
      post_body = @api_client.object_to_http_body(body)
      
      auth_names = ['PureCloud OAuth']
      data, status_code, headers = @api_client.call_api(:PUT, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'OAuthClient')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: OAuthApi#put_oauth_client\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
  end
end