require 'date'

module OpenX
  module Services
    class Banner < Base
      LOCAL_SQL = 'sql'
      LOCAL_WEB = 'web'
      EXTERNAL  = 'url'
      HTML      = 'html'
      TEXT      = 'txt'

      RUNNING = 0
      PAUSED  = 1

      class << self
        def find(id, *args)
          if id == :all
            responses = remote.call(find_all, *args)
            response  = responses.first
            return [] unless response
            responses = [response]

            ### Annoying..  For some reason OpenX returns a linked list.
            ### Probably a bug....
            while response.key?('aImage')
              response = response.delete('aImage')
              break unless response
              responses << response
            end

            responses.map do |response|
              new(translate(response))
            end
          else
            response  = remote.call(find_one, id)
            new(translate(response))
          end
        end
      end

      # Translate our property names to OpenX property names
      openx_accessor  :name           => :bannerName,
                      :campaign_id    => :campaignId,
                      :id             => :bannerId,
                      :storage_type   => :storageType,
                      :file_name      => :fileName,
                      :image_url      => :imageURL,
                      :html_template  => :htmlTemplate,
                      :width          => :width,
                      :height         => :height,
                      :weight         => :weight,
                      :target         => :target,
                      :url            => :url,
                      :status         => :status,
                      :adserver       => :adserver,
                      :transparent    => :transparent,
                      :image          => :aImage,
                      :backup_image   => :aBackupImage,
                      # 'keyword' only supported by patched server
                      # as per https://developer.openx.org/jira/browse/OX-4779
                      # No averse effect when unsupported by server (returns nil)
                      :keyword        => :keyword,
                      :comments       => :comments

      has_one :campaign

      self.create   = 'ox.addBanner'
      self.update   = 'ox.modifyBanner'
      self.delete   = 'ox.deleteBanner'
      self.find_one = 'ox.getBanner'
      self.find_all = 'ox.getBannerListByCampaignId'

      def initialize(params = {})
        raise ArgumentError.new("Missing campaign_id") unless params[:campaign_id] || params[:campaign]
        params[:campaign_id] ||= params[:campaign].id
        super(params)
      end

      def statistics start_on = Date.today, end_on = Date.today
        remote.call('ox.bannerDailyStatistics', self.id, start_on, end_on)
      end

      def targeting
        remote.call('ox.getBannerTargeting', self.id) do |line|
          TargetingRule.instantiate(line)
        end
      end

      def targeting=(rules)
        remote.call('ox.setBannerTargeting', self.id, rules)
      end
    end
  end
end