# frozen_string_literal: true

class InboxController < ApplicationController
  before_action :authenticate_user!

  def show
    find_inbox_entries

    @delete_id = find_delete_id
    @disabled = true if @inbox.empty?

    mark_inbox_entries_as_read

    respond_to do |format|
      format.html
      format.turbo_stream
    end
  end

  def create
    question = Question.create!(content:             QuestionGenerator.generate,
                                author_is_anonymous: true,
                                author_identifier:   "justask",
                                user:                current_user)

    inbox = Inbox.create!(user: current_user, question_id: question.id, new: true)
    increment_metric

    respond_to do |format|
      format.turbo_stream do
        render turbo_stream: turbo_stream.prepend("entries", partial: "inbox/entry", locals: { i: inbox })

        inbox.update(new: false)
      end

      format.html { redirect_to inbox_path }
    end
  end

  private

  def filter_params
    params.slice(*InboxFilter::KEYS).permit(*InboxFilter::KEYS)
  end

  def find_inbox_entries
    filter = InboxFilter.new(current_user, filter_params)
    @inbox = filter.cursored_results(last_id: params[:last_id])
    @inbox_last_id = @inbox.map(&:id).min
    @more_data_available = filter.cursored_results(last_id: @inbox_last_id, size: 1).count.positive?
    @inbox_count = filter.results.count
  end

  def find_delete_id
    return "ib-delete-all-author" if params[:author].present? && @inbox_count.positive?

    "ib-delete-all"
  end

  # rubocop:disable Rails/SkipsModelValidations
  def mark_inbox_entries_as_read
    # using .dup to not modify @inbox -- useful in tests
    updated = @inbox&.dup&.update_all(new: false)
    current_user.touch(:inbox_updated_at) if updated.positive?
  end
  # rubocop:enable Rails/SkipsModelValidations

  def increment_metric
    Retrospring::Metrics::QUESTIONS_ASKED.increment(
      labels: {
        anonymous: true,
        followers: false,
        generated: true,
      }
    )
  end
end