# frozen_string_literal: true

class UpdatePostReplyIndexes < ActiveRecord::Migration[6.0]
  # Adding and removing indexes concurrently doesn't work within transaction.
  # It also needs existence checks for indexes in case the migration fails and needs to run again.
  disable_ddl_transaction!

  def up
    if !index_exists?(:post_replies, [:post_id, :reply_post_id])
      add_index :post_replies, [:post_id, :reply_post_id], unique: true, algorithm: :concurrently
    end

    if !index_exists?(:post_replies, [:reply_post_id])
      add_index :post_replies, [:reply_post_id], algorithm: :concurrently
    end

    if index_exists?(:post_replies, [:post_id, :reply_id])
      remove_index :post_replies, column: [:post_id, :reply_id], algorithm: :concurrently
    end

    if index_exists?(:post_replies, [:reply_id])
      remove_index :post_replies, column: [:reply_id], algorithm: :concurrently
    end
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end