=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: ININ
http://www.inin.com

Terms of Service: https://developer.mypurecloud.com/tos

=end

require "uri"

module PureCloud
  class PresenceApi
    attr_accessor :api_client

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

    # Delete a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param [Hash] opts the optional parameters
    # @return [nil]
    def delete_presencedefinition(presence_id, opts = {})
      delete_presencedefinition_with_http_info(presence_id, opts)
      return nil
    end

    # Delete a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param [Hash] opts the optional parameters
    # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers
    def delete_presencedefinition_with_http_info(presence_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.delete_presencedefinition ..."
      end
      # verify the required parameter 'presence_id' is set
      fail ArgumentError, "Missing the required parameter 'presence_id' when calling PresenceApi.delete_presencedefinition" if presence_id.nil?
      # resource path
      local_var_path = "/api/v2/presencedefinitions/{presenceId}".sub('{format}','json').sub('{' + 'presenceId' + '}', presence_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 Auth']
      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: PresenceApi#delete_presencedefinition\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param [Hash] opts the optional parameters
    # @option opts [String] :locale_code The locale code to fetch for the presence definition. Use ALL to fetch everything.
    # @return [OrganizationPresence]
    def get_presencedefinition(presence_id, opts = {})
      data, _status_code, _headers = get_presencedefinition_with_http_info(presence_id, opts)
      return data
    end

    # Get a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param [Hash] opts the optional parameters
    # @option opts [String] :locale_code The locale code to fetch for the presence definition. Use ALL to fetch everything.
    # @return [Array<(OrganizationPresence, Fixnum, Hash)>] OrganizationPresence data, response status code and response headers
    def get_presencedefinition_with_http_info(presence_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.get_presencedefinition ..."
      end
      # verify the required parameter 'presence_id' is set
      fail ArgumentError, "Missing the required parameter 'presence_id' when calling PresenceApi.get_presencedefinition" if presence_id.nil?
      # resource path
      local_var_path = "/api/v2/presencedefinitions/{presenceId}".sub('{format}','json').sub('{' + 'presenceId' + '}', presence_id.to_s)

      # query parameters
      query_params = {}
      query_params[:'localeCode'] = opts[:'locale_code'] if opts[:'locale_code']

      # 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 Auth']
      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 => 'OrganizationPresence')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#get_presencedefinition\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get an Organization's list of Presence Definitions
    # 
    # @param [Hash] opts the optional parameters
    # @option opts [Integer] :page_number Page number (default to 1)
    # @option opts [Integer] :page_size Page size (default to 25)
    # @option opts [String] :deleted Deleted query can be TRUE, FALSE or ALL (default to false)
    # @option opts [String] :locale_code The locale code to fetch for each presence definition. Use ALL to fetch everything.
    # @return [OrganizationPresenceEntityListing]
    def get_presencedefinitions(opts = {})
      data, _status_code, _headers = get_presencedefinitions_with_http_info(opts)
      return data
    end

    # Get an Organization&#39;s list of Presence Definitions
    # 
    # @param [Hash] opts the optional parameters
    # @option opts [Integer] :page_number Page number
    # @option opts [Integer] :page_size Page size
    # @option opts [String] :deleted Deleted query can be TRUE, FALSE or ALL
    # @option opts [String] :locale_code The locale code to fetch for each presence definition. Use ALL to fetch everything.
    # @return [Array<(OrganizationPresenceEntityListing, Fixnum, Hash)>] OrganizationPresenceEntityListing data, response status code and response headers
    def get_presencedefinitions_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.get_presencedefinitions ..."
      end
      # resource path
      local_var_path = "/api/v2/presencedefinitions".sub('{format}','json')

      # query parameters
      query_params = {}
      query_params[:'pageNumber'] = opts[:'page_number'] if opts[:'page_number']
      query_params[:'pageSize'] = opts[:'page_size'] if opts[:'page_size']
      query_params[:'deleted'] = opts[:'deleted'] if opts[:'deleted']
      query_params[:'localeCode'] = opts[:'locale_code'] if opts[:'locale_code']

      # 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 Auth']
      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 => 'OrganizationPresenceEntityListing')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#get_presencedefinitions\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get the list of SystemPresences
    # 
    # @param [Hash] opts the optional parameters
    # @return [Array<SystemPresence>]
    def get_systempresences(opts = {})
      data, _status_code, _headers = get_systempresences_with_http_info(opts)
      return data
    end

    # Get the list of SystemPresences
    # 
    # @param [Hash] opts the optional parameters
    # @return [Array<(Array<SystemPresence>, Fixnum, Hash)>] Array<SystemPresence> data, response status code and response headers
    def get_systempresences_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.get_systempresences ..."
      end
      # resource path
      local_var_path = "/api/v2/systempresences".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 Auth']
      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 => 'Array<SystemPresence>')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#get_systempresences\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Get a user's Presence
    # 
    # @param user_id user Id
    # @param source_id Source
    # @param [Hash] opts the optional parameters
    # @return [UserPresence]
    def get_user_presence(user_id, source_id, opts = {})
      data, _status_code, _headers = get_user_presence_with_http_info(user_id, source_id, opts)
      return data
    end

    # Get a user&#39;s Presence
    # 
    # @param user_id user Id
    # @param source_id Source
    # @param [Hash] opts the optional parameters
    # @return [Array<(UserPresence, Fixnum, Hash)>] UserPresence data, response status code and response headers
    def get_user_presence_with_http_info(user_id, source_id, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.get_user_presence ..."
      end
      # verify the required parameter 'user_id' is set
      fail ArgumentError, "Missing the required parameter 'user_id' when calling PresenceApi.get_user_presence" if user_id.nil?
      # verify the required parameter 'source_id' is set
      fail ArgumentError, "Missing the required parameter 'source_id' when calling PresenceApi.get_user_presence" if source_id.nil?
      # resource path
      local_var_path = "/api/v2/users/{userId}/presences/{sourceId}".sub('{format}','json').sub('{' + 'userId' + '}', user_id.to_s).sub('{' + 'sourceId' + '}', source_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 Auth']
      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 => 'UserPresence')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#get_user_presence\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Patch a user's Presence
    # The presence object can be patched one of three ways. Option 1: Set the 'primary' property to true. This will set the 'source' defined in the path as the user's primary presence source. Option 2: Provide the presenceDefinition value. The 'id' is the only value required within the presenceDefinition. Option 3: Provide the message value. Option 1 can be combined with Option 2 and/or Option 3.
    # @param user_id user Id
    # @param source_id Source
    # @param body User presence
    # @param [Hash] opts the optional parameters
    # @return [UserPresence]
    def patch_user_presence(user_id, source_id, body, opts = {})
      data, _status_code, _headers = patch_user_presence_with_http_info(user_id, source_id, body, opts)
      return data
    end

    # Patch a user&#39;s Presence
    # The presence object can be patched one of three ways. Option 1: Set the &#39;primary&#39; property to true. This will set the &#39;source&#39; defined in the path as the user&#39;s primary presence source. Option 2: Provide the presenceDefinition value. The &#39;id&#39; is the only value required within the presenceDefinition. Option 3: Provide the message value. Option 1 can be combined with Option 2 and/or Option 3.
    # @param user_id user Id
    # @param source_id Source
    # @param body User presence
    # @param [Hash] opts the optional parameters
    # @return [Array<(UserPresence, Fixnum, Hash)>] UserPresence data, response status code and response headers
    def patch_user_presence_with_http_info(user_id, source_id, body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.patch_user_presence ..."
      end
      # verify the required parameter 'user_id' is set
      fail ArgumentError, "Missing the required parameter 'user_id' when calling PresenceApi.patch_user_presence" if user_id.nil?
      # verify the required parameter 'source_id' is set
      fail ArgumentError, "Missing the required parameter 'source_id' when calling PresenceApi.patch_user_presence" if source_id.nil?
      # verify the required parameter 'body' is set
      fail ArgumentError, "Missing the required parameter 'body' when calling PresenceApi.patch_user_presence" if body.nil?
      # resource path
      local_var_path = "/api/v2/users/{userId}/presences/{sourceId}".sub('{format}','json').sub('{' + 'userId' + '}', user_id.to_s).sub('{' + 'sourceId' + '}', source_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 Auth']
      data, status_code, headers = @api_client.call_api(:PATCH, local_var_path,
        :header_params => header_params,
        :query_params => query_params,
        :form_params => form_params,
        :body => post_body,
        :auth_names => auth_names,
        :return_type => 'UserPresence')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#patch_user_presence\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Create a Presence Definition
    # 
    # @param body The Presence Definition to create
    # @param [Hash] opts the optional parameters
    # @return [OrganizationPresence]
    def post_presencedefinitions(body, opts = {})
      data, _status_code, _headers = post_presencedefinitions_with_http_info(body, opts)
      return data
    end

    # Create a Presence Definition
    # 
    # @param body The Presence Definition to create
    # @param [Hash] opts the optional parameters
    # @return [Array<(OrganizationPresence, Fixnum, Hash)>] OrganizationPresence data, response status code and response headers
    def post_presencedefinitions_with_http_info(body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.post_presencedefinitions ..."
      end
      # verify the required parameter 'body' is set
      fail ArgumentError, "Missing the required parameter 'body' when calling PresenceApi.post_presencedefinitions" if body.nil?
      # resource path
      local_var_path = "/api/v2/presencedefinitions".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 Auth']
      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 => 'OrganizationPresence')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#post_presencedefinitions\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Update a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param body The OrganizationPresence to update
    # @param [Hash] opts the optional parameters
    # @return [OrganizationPresence]
    def put_presencedefinition(presence_id, body, opts = {})
      data, _status_code, _headers = put_presencedefinition_with_http_info(presence_id, body, opts)
      return data
    end

    # Update a Presence Definition
    # 
    # @param presence_id Organization Presence ID
    # @param body The OrganizationPresence to update
    # @param [Hash] opts the optional parameters
    # @return [Array<(OrganizationPresence, Fixnum, Hash)>] OrganizationPresence data, response status code and response headers
    def put_presencedefinition_with_http_info(presence_id, body, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: PresenceApi.put_presencedefinition ..."
      end
      # verify the required parameter 'presence_id' is set
      fail ArgumentError, "Missing the required parameter 'presence_id' when calling PresenceApi.put_presencedefinition" if presence_id.nil?
      # verify the required parameter 'body' is set
      fail ArgumentError, "Missing the required parameter 'body' when calling PresenceApi.put_presencedefinition" if body.nil?
      # resource path
      local_var_path = "/api/v2/presencedefinitions/{presenceId}".sub('{format}','json').sub('{' + 'presenceId' + '}', presence_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 Auth']
      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 => 'OrganizationPresence')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: PresenceApi#put_presencedefinition\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
  end
end