require 'urbanairship'


module Urbanairship
  module Devices
    class ChannelTags
      include Urbanairship::Common
      include Urbanairship::Loggable
      attr_writer :client
      attr_reader :audience, :add_group, :remove_group, :set_group

      def initialize(client: required('client'))
        @client = client
        @audience = {}
        @add_group = {}
        @remove_group = {}
        @set_group = {}
        @url = CHANNEL_URL + 'tags/'
      end

      def set_audience(ios: nil, android: nil, amazon: nil)
        if ios
          @audience['ios_channel'] = ios
        end
        if android
          @audience['android_channel'] = android
        end
        if amazon
          @audience['amazon_channel'] = amazon
        end
      end

      def add(group_name: required('group_name'), tags: required('tags'))
        @add_group[group_name] = tags
      end

      def remove(group_name: required('group_name'), tags: required('tags'))
        @remove_group[group_name] = tags
      end

      def set(group_name: required('group_name'), tags: required('tags'))
        @set_group[group_name] = tags
      end

      def send_request
        payload = {}

        fail ArgumentError,
          'An audience is required for modifying tags' if @audience.empty?
        fail ArgumentError,
          'A tag request cannot both add and set tags' if !@add_group.empty? and !@set_group.empty?
        fail ArgumentError,
          'A tag request cannot both remove and set tags' if !@remove_group.empty? and !@set_group.empty?
        fail ArgumentError,
          'A tag request must add, remove, or set a tag' if @remove_group.empty? and @add_group.empty? and @set_group.empty?

        payload['audience'] = @audience
        payload['add'] = @add_group unless @add_group.empty?
        payload['remove'] = @remove_group unless @remove_group.empty?
        payload['set'] = @set_group unless @set_group.empty?

        response = @client.send_request(
          method: 'POST',
          body: JSON.dump(payload),
          url: @url,
          content_type: 'application/json'
        )
        logger.info("Set tags for audience: #{@audience}")
        response
      end
    end
  end
end