# frozen_string_literal: true

class REST::CompactStatusesSerializer < ActiveModel::Serializer
  attribute :statuses
  attribute :referenced_statuses
  attribute :accounts
  attribute :relationships

  def current_user?
    !current_user.nil?
  end

  def statuses
    object.statuses.map do |status|
      REST::StatusSerializer.new(status, root: false, relationships: status_relationships, account_relationships: account_relationships, compact: true, scope: current_user, scope_name: :current_user)
    end || []
  end

  def referenced_statuses
    Status.where(id: referenced_status_ids).map do |status|
      REST::StatusSerializer.new(status, root: false, relationships: status_relationships, account_relationships: account_relationships, compact: true, scope: current_user, scope_name: :current_user)
    end || []
  end

  def accounts
    source_accounts.map do |account|
      REST::AccountSerializer.new(account, root: false, scope: current_user, scope_name: :current_user)
    end || []
  end

  def relationships
    return [] unless current_user?

    source_accounts.map do |account|
      REST::RelationshipSerializer.new(account, root: false, relationships: account_relationships, scope: current_user, scope_name: :current_user)
    end || []
  end

  def referenced_status_ids
    @referenced_status_ids ||= object.statuses.flat_map { |status| [status.reblog_of_id, status.quote_id, status.reblog&.quote_id] }.compact.uniq - object.statuses.pluck(:id)
  end

  def source_accounts
    @source_accounts ||= Account.where(id: source_accounts_ids)
  end

  def source_accounts_ids
    @source_accounts_ids ||= object.statuses.flat_map(&:account_ids).uniq
  end

  def status_relationships
    @status_relationships ||= StatusRelationshipsPresenter.new(object.statuses, current_user&.account_id)
  end

  def account_relationships
    @account_relationships ||= AccountRelationshipsPresenter.new(source_accounts_ids, current_user&.account_id)
  end
end
