class NotificationSubscriptionsController < ApplicationController
  def show
    result = if current_user
               NotificationSubscription.where(user_id: current_user.id, notifiable_id: params[:notifiable_id], notifiable_type: params[:notifiable_type]).
                 first&.to_json(only: %i[config]) || { config: "not_subscribed" }
             end
    respond_to do |format|
      format.json { render json: result }
    end
  end

  def upsert
    not_found unless current_user

    @notification_subscription = NotificationSubscription.find_or_initialize_by(user_id: current_user.id,
                                                                                notifiable_id: params[:notifiable_id],
                                                                                notifiable_type: params[:notifiable_type].capitalize)
    if params[:config] == "not_subscribed"
      @notification_subscription.delete
      @notification_subscription.notifiable.update(receive_notifications: false) if current_user_is_author?
    else
      @notification_subscription.config = params[:config] || "all_comments"
      receive_notifications = (params[:config] == "all_comments" && current_user_is_author?)
      @notification_subscription.notifiable.update(receive_notifications: true) if receive_notifications
      @notification_subscription.save
    end
    result = @notification_subscription.persisted?
    respond_to do |format|
      format.json { render json: result }
      format.html { redirect_to request.referer }
    end
  end

  private

  def current_user_is_author?
    # TODO: think of a better solution for handling mute notifications in dashboard / manage
    current_user.id == @notification_subscription.notifiable.user_id
  end
end
