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

module ConstantContact
  module Services
    class CampaignScheduleService < BaseService
      class << self

        # Create a new schedule for a campaign
        # @param [Integer] campaign_id - Campaign id to be scheduled
        # @param [Schedule] schedule - Schedule to be created
        # @return [Schedule]
        def add_schedule(campaign_id, schedule)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_schedules'), campaign_id)
          url = build_url(url)
          payload = schedule.to_json
          response = RestClient.post(url, payload, get_headers())
          Components::Schedule.create(JSON.parse(response.body))
        end


        # Get a list of schedules for a campaign
        # @param [Integer] campaign_id - Campaign id to be scheduled
        # @return [Array<Schedule>]
        def get_schedules(campaign_id)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_schedules'), campaign_id)
          url = build_url(url)
          response = RestClient.get(url, get_headers())
          body = JSON.parse(response.body)

          schedules = []
          body.each do |schedule|
            schedules << Components::Schedule.create(schedule)
          end

          schedules
        end


        # Get a specific schedule for a campaign
        # @param [Integer] campaign_id - Campaign id to get a schedule for
        # @param [Integer] schedule_id - Schedule id to retrieve
        # @return [Schedule]
        def get_schedule(campaign_id, schedule_id)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule_id)
          url = build_url(url)
          response = RestClient.get(url, get_headers())
          Components::Schedule.create(JSON.parse(response.body))
        end


        # Delete a specific schedule for a campaign
        # @param [Integer] campaign_id - Campaign id to delete a schedule for
        # @param [Integer] schedule_id - Schedule id to delete
        # @return [Boolean]
        def delete_schedule(campaign_id, schedule_id)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule_id)
          url = build_url(url)
          response = RestClient.delete(url, get_headers())
          response.code == 204
        end


        # Update a specific schedule for a campaign
        # @param [Integer] campaign_id - Campaign id to be scheduled
        # @param [Schedule] schedule - Schedule to retrieve
        # @return [Schedule]
        def update_schedule(campaign_id, schedule)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule.id)
          url = build_url(url)
          payload = schedule.to_json
          response = RestClient.put(url, payload, get_headers())
          Components::Schedule.create(JSON.parse(response.body))
        end


        # Send a test send of a campaign
        # @param [Integer] campaign_id - Id of campaign to send test of
        # @param [TestSend] test_send - Test send details
        # @return [TestSend]
        def send_test(campaign_id, test_send)
          url = Util::Config.get('endpoints.base_url') +
                sprintf(Util::Config.get('endpoints.campaign_test_sends'), campaign_id)
          url = build_url(url)
          payload = test_send.to_json
          response = RestClient.post(url, payload, get_headers())
          Components::TestSend.create(JSON.parse(response.body))
        end

      end
    end
  end
end