# frozen_string_literal: true

class MigrateInteractionSettingsToPolicy < ActiveRecord::Migration[7.1]
  disable_ddl_transaction!

  # Dummy classes, to make migration possible across version changes
  class User < ApplicationRecord
    belongs_to :notification_policy, foreign_key: 'account_id', primary_key: 'account_id', optional: true, inverse_of: false
  end

  class NotificationPolicy < ApplicationRecord; end

  def up
    User.includes(:notification_policy).in_batches do |users|
      NotificationPolicy.upsert_all(users.filter_map { |user| policy_for_user(user) })
    end
  end

  def down; end

  private

  def policy_for_user(user)
    deserialized_settings = Oj.load(user.attributes_before_type_cast['settings'])
    return if deserialized_settings.nil?

    requires_new_policy = false

    policy = {
      account_id: user.account_id,
      filter_not_followers: false,
      filter_not_following: false,
      filter_private_mentions: true,
    }

    if deserialized_settings['interactions.must_be_follower']
      policy[:filter_not_followers] = true
      requires_new_policy = true
    end

    if deserialized_settings['interactions.must_be_following']
      policy[:filter_not_following] = true
      requires_new_policy = true
    end

    unless deserialized_settings['interactions.must_be_following_dm']
      policy[:filter_private_mentions] = false
      requires_new_policy = true
    end

    policy if requires_new_policy
  end
end