=begin
#Communication Preferences Subscriptions

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

The version of the OpenAPI document: v3

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

=end

require 'cgi'

module Hubspot
  module CommunicationPreferences
    class StatusApi
      attr_accessor :api_client

      def initialize(api_client = ApiClient.default)
        @api_client = api_client
      end
      # Get subscription statuses for a contact
      # Returns a list of subscriptions and their status for a given contact.
      # @param email_address [String] 
      # @param [Hash] opts the optional parameters
      # @return [PublicSubscriptionStatusesResponse]
      def get_email_status(email_address, opts = {})
        data, _status_code, _headers = get_email_status_with_http_info(email_address, opts)
        data
      end

      # Get subscription statuses for a contact
      # Returns a list of subscriptions and their status for a given contact.
      # @param email_address [String] 
      # @param [Hash] opts the optional parameters
      # @return [Array<(PublicSubscriptionStatusesResponse, Integer, Hash)>] PublicSubscriptionStatusesResponse data, response status code and response headers
      def get_email_status_with_http_info(email_address, opts = {})
        if @api_client.config.debugging
          @api_client.config.logger.debug 'Calling API: StatusApi.get_email_status ...'
        end
        # verify the required parameter 'email_address' is set
        if @api_client.config.client_side_validation && email_address.nil?
          fail ArgumentError, "Missing the required parameter 'email_address' when calling StatusApi.get_email_status"
        end
        # resource path
        local_var_path = '/communication-preferences/v3/status/email/{emailAddress}'.sub('{' + 'emailAddress' + '}', CGI.escape(email_address.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] || 'PublicSubscriptionStatusesResponse'

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

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

      # Subscribe a contact
      # Subscribes a contact to the given subscription type. This API is not valid to use for subscribing a contact at a brand or portal level and will return an error.
      # @param public_update_subscription_status_request [PublicUpdateSubscriptionStatusRequest] 
      # @param [Hash] opts the optional parameters
      # @return [PublicSubscriptionStatus]
      def subscribe(public_update_subscription_status_request, opts = {})
        data, _status_code, _headers = subscribe_with_http_info(public_update_subscription_status_request, opts)
        data
      end

      # Subscribe a contact
      # Subscribes a contact to the given subscription type. This API is not valid to use for subscribing a contact at a brand or portal level and will return an error.
      # @param public_update_subscription_status_request [PublicUpdateSubscriptionStatusRequest] 
      # @param [Hash] opts the optional parameters
      # @return [Array<(PublicSubscriptionStatus, Integer, Hash)>] PublicSubscriptionStatus data, response status code and response headers
      def subscribe_with_http_info(public_update_subscription_status_request, opts = {})
        if @api_client.config.debugging
          @api_client.config.logger.debug 'Calling API: StatusApi.subscribe ...'
        end
        # verify the required parameter 'public_update_subscription_status_request' is set
        if @api_client.config.client_side_validation && public_update_subscription_status_request.nil?
          fail ArgumentError, "Missing the required parameter 'public_update_subscription_status_request' when calling StatusApi.subscribe"
        end
        # resource path
        local_var_path = '/communication-preferences/v3/subscribe'

        # 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'])
        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(public_update_subscription_status_request)

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

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

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

      # Unsubscribe a contact
      # Unsubscribes a contact from the given subscription type. This API is not valid to use for unsubscribing a contact at a brand or portal level and will return an error.
      # @param public_update_subscription_status_request [PublicUpdateSubscriptionStatusRequest] 
      # @param [Hash] opts the optional parameters
      # @return [PublicSubscriptionStatus]
      def unsubscribe(public_update_subscription_status_request, opts = {})
        data, _status_code, _headers = unsubscribe_with_http_info(public_update_subscription_status_request, opts)
        data
      end

      # Unsubscribe a contact
      # Unsubscribes a contact from the given subscription type. This API is not valid to use for unsubscribing a contact at a brand or portal level and will return an error.
      # @param public_update_subscription_status_request [PublicUpdateSubscriptionStatusRequest] 
      # @param [Hash] opts the optional parameters
      # @return [Array<(PublicSubscriptionStatus, Integer, Hash)>] PublicSubscriptionStatus data, response status code and response headers
      def unsubscribe_with_http_info(public_update_subscription_status_request, opts = {})
        if @api_client.config.debugging
          @api_client.config.logger.debug 'Calling API: StatusApi.unsubscribe ...'
        end
        # verify the required parameter 'public_update_subscription_status_request' is set
        if @api_client.config.client_side_validation && public_update_subscription_status_request.nil?
          fail ArgumentError, "Missing the required parameter 'public_update_subscription_status_request' when calling StatusApi.unsubscribe"
        end
        # resource path
        local_var_path = '/communication-preferences/v3/unsubscribe'

        # 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'])
        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(public_update_subscription_status_request)

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

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

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