# frozen_string_literal: true

module Gitlab
  module Analytics
    class UniqueVisits
      TARGET_IDS = Set[
        'g_analytics_contribution',
        'g_analytics_insights',
        'g_analytics_issues',
        'g_analytics_productivity',
        'g_analytics_valuestream',
        'p_analytics_pipelines',
        'p_analytics_code_reviews',
        'p_analytics_valuestream',
        'p_analytics_insights',
        'p_analytics_issues',
        'p_analytics_repo',
        'u_analytics_todos',
        'i_analytics_cohorts',
        'i_analytics_dev_ops_score'
      ].freeze

      KEY_EXPIRY_LENGTH = 28.days

      def track_visit(visitor_id, target_id, time = Time.zone.now)
        target_key = key(target_id, time)

        Gitlab::Redis::SharedState.with do |redis|
          redis.multi do |multi|
            multi.pfadd(target_key, visitor_id)
            multi.expire(target_key, KEY_EXPIRY_LENGTH)
          end
        end
      end

      def weekly_unique_visits_for_target(target_id, week_of: 7.days.ago)
        Gitlab::Redis::SharedState.with do |redis|
          redis.pfcount(key(target_id, week_of))
        end
      end

      def weekly_unique_visits_for_any_target(week_of: 7.days.ago)
        keys = TARGET_IDS.map { |target_id| key(target_id, week_of) }

        Gitlab::Redis::SharedState.with do |redis|
          redis.pfcount(*keys)
        end
      end

      private

      def key(target_id, time)
        raise "Invalid target id #{target_id}" unless TARGET_IDS.include?(target_id.to_s)

        year_week = time.strftime('%G-%V')
        "#{target_id}-{#{year_week}}"
      end
    end
  end
end