# frozen_string_literal: true

module DiscourseRewind
  # Service responsible to fetch a rewind for a username/year.
  #
  # @example
  #  ::DiscourseRewind::Rewind::Fetch.call(
  #    guardian: guardian
  #  )
  #
  class Rewind::Fetch
    include Service::Base

    # @!method self.call(guardian:, params:)
    #   @param [Guardian] guardian
    #   @param [Hash] params
    #   @option params [Integer] :year of the rewind
    #   @option params [Integer] :username of the rewind
    #   @return [Service::Base::Context]

    CACHE_DURATION = 5.minutes

    model :year
    model :user
    model :date
    model :reports

    private

    def fetch_user(guardian:)
      User.find_by_username(guardian.user.username)
    end

    def fetch_year
      current_date = Time.zone.now
      current_month = current_date.month
      current_year = current_date.year

      case current_month
      when 1
        current_year - 1
      when 12
        current_year
      else
        false
      end
    end

    def fetch_date(params:, year:)
      Date.new(year).all_year
    end

    def fetch_reports(date:, user:, guardian:, year:)
      # key = "rewind:#{guardian.user.username}:#{year}"
      # reports = Discourse.redis.get(key)

      # if Rails.env.development? || !reports
      reports =
        ::DiscourseRewind::Rewind::Action::BaseReport
          .descendants
          .filter { _1.enabled? }
          .map { |report| report.call(date:, user:, guardian:) }
      #   Discourse.redis.setex(key, CACHE_DURATION, MultiJson.dump(reports))
      # else
      #   reports = MultiJson.load(reports.compact, symbolize_keys: true)
      # end

      reports
    end
  end
end
