# frozen_string_literal: true

class ReactionsController < ApplicationController
  include TurboStreamable

  before_action :authenticate_user!, only: %w[create destroy]

  turbo_stream_actions :create, :destroy

  def index
    answer = Answer.includes([smiles: { user: :profile }]).find(params[:id])

    render "index", locals: { a: answer }
  end

  def create
    params.require :id

    target = target_class.find(params[:id])

    UseCase::Reaction::Create.call(
      source_user_id: current_user.id,
      target:,
    )

    target.reload

    respond_to do |format|
      format.turbo_stream do
        render turbo_stream: [
          turbo_stream.replace("reaction-#{params[:type]}-#{params[:id]}", partial: "reactions/destroy", locals: { type: params[:type], target: }),
          render_toast(t(".#{params[:type].downcase}.success"))
        ]
      end

      format.html { redirect_back(fallback_location: root_path) }
    end
  end

  def destroy
    params.require :id

    target = target_class.find(params[:id])

    UseCase::Reaction::Destroy.call(
      source_user_id: current_user.id,
      target:,
    )

    target.reload

    respond_to do |format|
      format.turbo_stream do
        render turbo_stream: [
          turbo_stream.replace("reaction-#{params[:type]}-#{params[:id]}", partial: "reactions/create", locals: { type: params[:type], target: }),
          render_toast(t(".#{params[:type].downcase}.success"))
        ]
      end

      format.html { redirect_back(fallback_location: root_path) }
    end
  end

  private

  ALLOWED_TYPES = %w[Answer Comment].freeze
  private_constant :ALLOWED_TYPES

  def target_class
    params.require :type
    raise NameError unless ALLOWED_TYPES.include?(params[:type])

    params[:type].constantize
  end
end