#
# campaign_tracking_service.rb
# ConstantContact
#
# Copyright (c) 2013 Constant Contact. All rights reserved.

module ConstantContact
  module Services
    class CampaignTrackingService < BaseService
      class << self

        # Get bounces for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query parameters to be appended to request
        # @return [ResultSet<BounceActivity>] - Containing a results array of BounceActivity
        def get_bounces(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_bounces'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          bounces = []
          body['results'].each do |bounce_activity|
            bounces << Components::BounceActivity.create(bounce_activity)
          end

          Components::ResultSet.new(bounces, body['meta'])
        end


        # Get clicks for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query parameters to be appended to request
        # @return [ResultSet<ClickActivity>] - Containing a results array of ClickActivity
        def get_clicks(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_clicks'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          clicks = []
          body['results'].each do |click_activity|
            clicks << Components::ClickActivity.create(click_activity)
          end

          Components::ResultSet.new(clicks, body['meta'])
        end


        # Get forwards for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query parameters to be appended to request
        # @return [ResultSet<ForwardActivity>] - Containing a results array of ForwardActivity
        def get_forwards(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_forwards'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          forwards = []
          body['results'].each do |forward_activity|
            forwards << Components::ForwardActivity.create(forward_activity)
          end

          Components::ResultSet.new(forwards, body['meta'])
        end


        # Get opens for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query parameters to be appended to request
        # @return [ResultSet<OpenActivity>] - Containing a results array of OpenActivity
        def get_opens(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_opens'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          opens = []
          body['results'].each do |open_activity|
            opens << Components::OpenActivity.create(open_activity)
          end

          Components::ResultSet.new(opens, body['meta'])
        end


        # Get sends for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query parameters to be appended to request
        # @return [ResultSet<SendActivity>] - Containing a results array of SendActivity
        def get_sends(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_sends'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          sends = []
          body['results'].each do |send_activity|
            sends << Components::SendActivity.create(send_activity)
          end

          Components::ResultSet.new(sends, body['meta'])
        end


        # Get unsubscribes for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [String] campaign_id - Campaign id
        # @param [Hash] params - query params to be appended to request
        # @return [ResultSet<UnsubscribeActivity>] - Containing a results array of UnsubscribeActivity
        def get_unsubscribes(access_token, campaign_id, params = {})
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_unsubscribes'), campaign_id)
          url = build_url(url, params)

          response = RestClient.get(url, get_headers(access_token))
          body = JSON.parse(response.body)

          unsubscribes = []
          body['results'].each do |unsubscribe_activity|
            unsubscribes << Components::UnsubscribeActivity.create(unsubscribe_activity)
          end

          Components::ResultSet.new(unsubscribes, body['meta'])
        end


        # Get a summary of reporting data for a given campaign
        # @param [String] access_token - Constant Contact OAuth2 access token
        # @param [Integer] campaign_id - Campaign id
        # @return [TrackingSummary]
        def get_summary(access_token, campaign_id)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_tracking_summary'), campaign_id)
          url = build_url(url)
          response = RestClient.get(url, get_headers(access_token))
          Components::TrackingSummary.create(JSON.parse(response.body))
        end

      end
    end
  end
end