# frozen_string_literal: true

module EmailControllerHelper
  class TopicEmailUnsubscriber < BaseEmailUnsubscriber
    def prepare_unsubscribe_options(controller)
      super(controller)
      watching = TopicUser.notification_levels[:watching]

      topic = unsubscribe_key.associated_topic

      controller.instance_variable_set(:@topic, topic)
      controller.instance_variable_set(
        :@watching_topic,
        TopicUser.exists?(user: key_owner, notification_level: watching, topic_id: topic.id),
      )

      return if topic.category_id.blank?
      if !CategoryUser.exists?(
           user: key_owner,
           notification_level: CategoryUser.watching_levels,
           category_id: topic.category_id,
         )
        return
      end

      controller.instance_variable_set(
        :@watched_count,
        TopicUser
          .joins(:topic)
          .where(user: key_owner, notification_level: watching)
          .where(topics: { category_id: topic.category_id })
          .count,
      )
    end

    def unsubscribe(params)
      updated = super(params)

      topic = unsubscribe_key.associated_topic
      return updated if topic.nil?

      if params[:unwatch_topic]
        TopicUser.where(topic_id: topic.id, user_id: key_owner.id).update_all(
          notification_level: TopicUser.notification_levels[:tracking],
        )

        updated = true
      end

      if params[:unwatch_category] && topic.category_id
        TopicUser
          .joins(:topic)
          .where(user: key_owner, notification_level: TopicUser.notification_levels[:watching])
          .where(topics: { category_id: topic.category_id })
          .update_all(notification_level: TopicUser.notification_levels[:tracking])

        CategoryUser.where(
          user_id: key_owner.id,
          category_id: topic.category_id,
          notification_level: CategoryUser.watching_levels,
        ).destroy_all

        updated = true
      end

      if params[:mute_topic]
        TopicUser.where(topic_id: topic.id, user_id: key_owner.id).update_all(
          notification_level: TopicUser.notification_levels[:muted],
        )

        updated = true
      end

      updated
    end
  end
end
