# frozen_string_literal: true

class ChatView
  attr_reader :user, :chat_channel, :chat_messages, :can_load_more_past, :can_load_more_future

  def initialize(
    chat_channel:,
    chat_messages:,
    user:,
    can_load_more_past: nil,
    can_load_more_future: nil
  )
    @chat_channel = chat_channel
    @chat_messages = chat_messages
    @user = user
    @can_load_more_past = can_load_more_past
    @can_load_more_future = can_load_more_future
  end

  def reviewable_ids
    return @reviewable_ids if defined?(@reviewable_ids)

    @reviewable_ids = @user.staff? ? get_reviewable_ids : nil
  end

  def user_flag_statuses
    return @user_flag_statuses if defined?(@user_flag_statuses)

    @user_flag_statuses = get_user_flag_statuses
  end

  private

  def get_reviewable_ids
    sql = <<~SQL
        SELECT
          target_id,
          MAX(r.id) reviewable_id
        FROM
          reviewables r
        JOIN
          reviewable_scores s ON reviewable_id = r.id
        WHERE
          r.target_id IN (:message_ids) AND
          r.target_type = 'ChatMessage' AND
          s.status = :pending
        GROUP BY
          target_id
    SQL

    ids = {}

    DB
      .query(
        sql,
        pending: ReviewableScore.statuses[:pending],
        message_ids: @chat_messages.map(&:id),
      )
      .each { |row| ids[row.target_id] = row.reviewable_id }

    ids
  end

  def get_user_flag_statuses
    sql = <<~SQL
        SELECT
          target_id,
          s.status
        FROM
          reviewables r
        JOIN
          reviewable_scores s ON reviewable_id = r.id
        WHERE
          s.user_id = :user_id AND
          r.target_id IN (:message_ids) AND
          r.target_type = 'ChatMessage'
    SQL

    statuses = {}

    DB
      .query(sql, message_ids: @chat_messages.map(&:id), user_id: @user.id)
      .each { |row| statuses[row.target_id] = row.status }

    statuses
  end
end
