# Fetch and compute monthly reports about the users conversations on Helpscout
class Helpscout::UserConversationsAdapter
  EXCLUDED_TAGS = ['openlab', 'bizdev', 'admin', 'webinaire']

  def initialize(from, to)
    @from = from
    @to = to
  end

  def can_fetch_reports?
    api_client.ready?
  end

  # Return an array of monthly reports
  def reports
    @reports ||= (@from..@to)
      .group_by { |date| [date.year, date.month] }
      .keys
      .map { |key| { year: key[0], month: key[1] } }
      .map { |interval| report(interval[:year], interval[:month]) }
  end

  private

  def report(year, month)
    report = fetch_conversations_report(year, month)

    total_conversations = report.dig(:current, :totalConversations)
    excluded_conversations = report
      .dig(:tags, :top)
      .select { |tag| tag[:name]&.in?(EXCLUDED_TAGS) }
      .map { |tag| tag[:count] }
      .sum

    {
      start_date: report.dig(:current, :startDate).to_datetime,
      end_date: report.dig(:current, :endDate).to_datetime,
      conversations_count: total_conversations - excluded_conversations
    }
  end

  def api_client
    @api_client ||= Helpscout::API.new
  end

  def fetch_conversations_report(year, month)
    if year == Date.today.year && month == Date.today.month
      raise ArgumentError, 'The report for the current month will change in the future, and cannot be cached.'
    end

    Rails.cache.fetch("helpscout-conversation-report-#{year}-#{month}") do
      api_client.conversations_report(year, month)
    end
  end
end
