=begin
#BillForward REST API

#No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)

OpenAPI spec version: 1.0.0

Generated by: https://github.com/swagger-api/swagger-codegen.git

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

=end

require "uri"

module BillForward
  class RolesApi
    attr_accessor :api_client

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

    # Create a new role.
    # {\"nickname\":\"Create a new role\",\"request\":\"createRoleRequest.html\",\"response\":\"createRoleResponse.html\"}
    # @param role_request 
    # @param [Hash] opts the optional parameters
    # @return [RolePagedMetadata]
    def create_role(role_request, opts = {})
      data, _status_code, _headers = create_role_with_http_info(role_request, opts)
      return data
    end

    # Create a new role.
    # {\&quot;nickname\&quot;:\&quot;Create a new role\&quot;,\&quot;request\&quot;:\&quot;createRoleRequest.html\&quot;,\&quot;response\&quot;:\&quot;createRoleResponse.html\&quot;}
    # @param role_request 
    # @param [Hash] opts the optional parameters
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def create_role_with_http_info(role_request, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.create_role ..."
      end
      # verify the required parameter 'role_request' is set
      fail ArgumentError, "Missing the required parameter 'role_request' when calling RolesApi.create_role" if role_request.nil?
      # resource path
      local_var_path = "/roles".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['text/xml', 'application/xml', '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(role_request)
      auth_names = []
      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 => 'RolePagedMetadata')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: RolesApi#create_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Retrieves a collection of all roles. By default 10 values are returned. Records are returned in natural order.
    # {\"nickname\":\"Retrieve all roles\",\"response\":\"getRoleAll.html\"}
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @option opts [Integer] :offset The offset from the first subscription to return. (default to 0)
    # @option opts [Integer] :records The maximum number of subscriptions to return. (default to 10)
    # @option opts [String] :order_by Specify a field used to order the result set. (default to created)
    # @option opts [String] :order Ihe direction of any ordering, either ASC or DESC. (default to DESC)
    # @option opts [BOOLEAN] :include_retired Whether retired subscriptions should be returned. (default to false)
    # @return [RolePagedMetadata]
    def get_all_roles(opts = {})
      data, _status_code, _headers = get_all_roles_with_http_info(opts)
      return data
    end

    # Retrieves a collection of all roles. By default 10 values are returned. Records are returned in natural order.
    # {\&quot;nickname\&quot;:\&quot;Retrieve all roles\&quot;,\&quot;response\&quot;:\&quot;getRoleAll.html\&quot;}
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @option opts [Integer] :offset The offset from the first subscription to return.
    # @option opts [Integer] :records The maximum number of subscriptions to return.
    # @option opts [String] :order_by Specify a field used to order the result set.
    # @option opts [String] :order Ihe direction of any ordering, either ASC or DESC.
    # @option opts [BOOLEAN] :include_retired Whether retired subscriptions should be returned.
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def get_all_roles_with_http_info(opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.get_all_roles ..."
      end
      if opts[:'order'] && !['ASC', 'DESC'].include?(opts[:'order'])
        fail ArgumentError, 'invalid value for "order", must be one of ASC, DESC'
      end
      # resource path
      local_var_path = "/roles".sub('{format}','json')

      # query parameters
      query_params = {}
      query_params[:'organizations'] = @api_client.build_collection_param(opts[:'organizations'], :multi) if !opts[:'organizations'].nil?
      query_params[:'offset'] = opts[:'offset'] if !opts[:'offset'].nil?
      query_params[:'records'] = opts[:'records'] if !opts[:'records'].nil?
      query_params[:'order_by'] = opts[:'order_by'] if !opts[:'order_by'].nil?
      query_params[:'order'] = opts[:'order'] if !opts[:'order'].nil?
      query_params[:'include_retired'] = opts[:'include_retired'] if !opts[:'include_retired'].nil?

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

    # Retrieves a single role, specified by the ID parameter.
    # {\"nickname\":\"Retrieve a role\",\"response\":\"getRoleByID.html\"}
    # @param role ID or name of the role.
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @option opts [BOOLEAN] :include_retired Whether retired subscriptions should be returned. (default to false)
    # @return [RolePagedMetadata]
    def get_role_by_id(role, opts = {})
      data, _status_code, _headers = get_role_by_id_with_http_info(role, opts)
      return data
    end

    # Retrieves a single role, specified by the ID parameter.
    # {\&quot;nickname\&quot;:\&quot;Retrieve a role\&quot;,\&quot;response\&quot;:\&quot;getRoleByID.html\&quot;}
    # @param role ID or name of the role.
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @option opts [BOOLEAN] :include_retired Whether retired subscriptions should be returned.
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def get_role_by_id_with_http_info(role, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.get_role_by_id ..."
      end
      # verify the required parameter 'role' is set
      fail ArgumentError, "Missing the required parameter 'role' when calling RolesApi.get_role_by_id" if role.nil?
      # resource path
      local_var_path = "/roles/{role}".sub('{format}','json').sub('{' + 'role' + '}', role.to_s)

      # query parameters
      query_params = {}
      query_params[:'organizations'] = @api_client.build_collection_param(opts[:'organizations'], :multi) if !opts[:'organizations'].nil?
      query_params[:'include_retired'] = opts[:'include_retired'] if !opts[:'include_retired'].nil?

      # 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 = ['text/plain']
      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 = []
      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 => 'RolePagedMetadata')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: RolesApi#get_role_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Revokes a particular permission
    # {\"nickname\":\"Remove Permission from role\",\"response\":\"removePermissionFromGroup.html\",\"request\":\"removePermissionFromGroupRequest.html\"}
    # @param role ID or name of the role.
    # @param resource 
    # @param action 
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @return [RolePagedMetadata]
    def remove_permission_from_role(role, resource, action, opts = {})
      data, _status_code, _headers = remove_permission_from_role_with_http_info(role, resource, action, opts)
      return data
    end

    # Revokes a particular permission
    # {\&quot;nickname\&quot;:\&quot;Remove Permission from role\&quot;,\&quot;response\&quot;:\&quot;removePermissionFromGroup.html\&quot;,\&quot;request\&quot;:\&quot;removePermissionFromGroupRequest.html\&quot;}
    # @param role ID or name of the role.
    # @param resource 
    # @param action 
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def remove_permission_from_role_with_http_info(role, resource, action, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.remove_permission_from_role ..."
      end
      # verify the required parameter 'role' is set
      fail ArgumentError, "Missing the required parameter 'role' when calling RolesApi.remove_permission_from_role" if role.nil?
      # verify the required parameter 'resource' is set
      fail ArgumentError, "Missing the required parameter 'resource' when calling RolesApi.remove_permission_from_role" if resource.nil?
      # verify enum value
      unless ['All', 'Account', 'Address', 'Amendment', 'Analytics', 'Audit', 'BFAdmin', 'BFJS', 'Charge', 'Client', 'Configuration', 'CouponBook', 'CouponBookDefinition', 'CouponDefinition', 'CouponInstance', 'CouponModifier', 'CouponRule', 'Coupon', 'Credit', 'CybersourceToken', 'Dunning', 'Email', 'FixedTerm', 'Gateway', 'Invoice', 'Notification', 'Organization', 'Password', 'PaymentMethod', 'Payment', 'Permission', 'PricingComponent', 'PricingComponentTier', 'PricingComponentValueChange', 'PricingComponentValue', 'ProductRatePlan', 'Product', 'ProductResources', 'Profile', 'Quote', 'Receipt', 'Refund', 'Salesforce', 'Search', 'Subscription', 'Tax', 'UnitOfMeasure', 'Usage', 'Username', 'User', 'UserResources', 'Webhook'].include?(resource)
        fail ArgumentError, "invalid value for 'resource', must be one of All, Account, Address, Amendment, Analytics, Audit, BFAdmin, BFJS, Charge, Client, Configuration, CouponBook, CouponBookDefinition, CouponDefinition, CouponInstance, CouponModifier, CouponRule, Coupon, Credit, CybersourceToken, Dunning, Email, FixedTerm, Gateway, Invoice, Notification, Organization, Password, PaymentMethod, Payment, Permission, PricingComponent, PricingComponentTier, PricingComponentValueChange, PricingComponentValue, ProductRatePlan, Product, ProductResources, Profile, Quote, Receipt, Refund, Salesforce, Search, Subscription, Tax, UnitOfMeasure, Usage, Username, User, UserResources, Webhook"
      end
      # verify the required parameter 'action' is set
      fail ArgumentError, "Missing the required parameter 'action' when calling RolesApi.remove_permission_from_role" if action.nil?
      # verify enum value
      unless ['All', 'AddToInvoice', 'AddToProductRatePlan', 'AddToSubscription', 'Advance', 'Aggregate', 'RemoveFromInvoice', 'RemoveFromProductRatePlan', 'RemoveFromSubscription', 'Cancel', 'Create', 'Delete', 'Edit', 'Execute', 'Freeze', 'Import', 'InvoiceCharges', 'Issue', 'Migrate', 'Read', 'Recalculate', 'Reset', 'Resume', 'Revive', 'Stop', 'Tokenize', 'Void'].include?(action)
        fail ArgumentError, "invalid value for 'action', must be one of All, AddToInvoice, AddToProductRatePlan, AddToSubscription, Advance, Aggregate, RemoveFromInvoice, RemoveFromProductRatePlan, RemoveFromSubscription, Cancel, Create, Delete, Edit, Execute, Freeze, Import, InvoiceCharges, Issue, Migrate, Read, Recalculate, Reset, Resume, Revive, Stop, Tokenize, Void"
      end
      # resource path
      local_var_path = "/roles/{role}/permission/{resource}/{action}".sub('{format}','json').sub('{' + 'role' + '}', role.to_s).sub('{' + 'resource' + '}', resource.to_s).sub('{' + 'action' + '}', action.to_s)

      # query parameters
      query_params = {}
      query_params[:'organizations'] = @api_client.build_collection_param(opts[:'organizations'], :multi) if !opts[:'organizations'].nil?

      # 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 = ['text/plain']
      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 = []
      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,
        :return_type => 'RolePagedMetadata')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: RolesApi#remove_permission_from_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Revokes a role
    # {\"nickname\":\"Revoke role\",\"response\":\"revokeRole.html\",\"request\":\"revokeRoleRequest.html\"}
    # @param role ID or name of the role.
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @return [RolePagedMetadata]
    def revoke_role(role, opts = {})
      data, _status_code, _headers = revoke_role_with_http_info(role, opts)
      return data
    end

    # Revokes a role
    # {\&quot;nickname\&quot;:\&quot;Revoke role\&quot;,\&quot;response\&quot;:\&quot;revokeRole.html\&quot;,\&quot;request\&quot;:\&quot;revokeRoleRequest.html\&quot;}
    # @param role ID or name of the role.
    # @param [Hash] opts the optional parameters
    # @option opts [Array<String>] :organizations 
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def revoke_role_with_http_info(role, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.revoke_role ..."
      end
      # verify the required parameter 'role' is set
      fail ArgumentError, "Missing the required parameter 'role' when calling RolesApi.revoke_role" if role.nil?
      # resource path
      local_var_path = "/roles/{role}".sub('{format}','json').sub('{' + 'role' + '}', role.to_s)

      # query parameters
      query_params = {}
      query_params[:'organizations'] = @api_client.build_collection_param(opts[:'organizations'], :multi) if !opts[:'organizations'].nil?

      # 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 = ['text/plain']
      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 = []
      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,
        :return_type => 'RolePagedMetadata')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: RolesApi#revoke_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end

    # Update a role.
    # {\"nickname\":\"Update a role\",\"request\":\"updateRoleRequest.html\",\"response\":\"updateRoleResponse.html\"}
    # @param role_request 
    # @param [Hash] opts the optional parameters
    # @return [RolePagedMetadata]
    def update_role(role_request, opts = {})
      data, _status_code, _headers = update_role_with_http_info(role_request, opts)
      return data
    end

    # Update a role.
    # {\&quot;nickname\&quot;:\&quot;Update a role\&quot;,\&quot;request\&quot;:\&quot;updateRoleRequest.html\&quot;,\&quot;response\&quot;:\&quot;updateRoleResponse.html\&quot;}
    # @param role_request 
    # @param [Hash] opts the optional parameters
    # @return [Array<(RolePagedMetadata, Fixnum, Hash)>] RolePagedMetadata data, response status code and response headers
    def update_role_with_http_info(role_request, opts = {})
      if @api_client.config.debugging
        @api_client.config.logger.debug "Calling API: RolesApi.update_role ..."
      end
      # verify the required parameter 'role_request' is set
      fail ArgumentError, "Missing the required parameter 'role_request' when calling RolesApi.update_role" if role_request.nil?
      # resource path
      local_var_path = "/roles".sub('{format}','json')

      # query parameters
      query_params = {}

      # header parameters
      header_params = {}

      # HTTP header 'Accept' (if needed)
      local_header_accept = ['text/xml', 'application/xml', '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(role_request)
      auth_names = []
      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 => 'RolePagedMetadata')
      if @api_client.config.debugging
        @api_client.config.logger.debug "API called: RolesApi#update_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
      end
      return data, status_code, headers
    end
  end
end
