class NotificationMultiplePeople < ActiveRecord::Migration
  def self.up
    create_table :notification_actors do |t|
        t.integer :notification_id
      t.integer :person_id
      t.timestamps
    end

    add_index :notification_actors, :notification_id
    add_index :notification_actors, [:notification_id, :person_id] , :unique => true
    add_index :notification_actors, :person_id  ## if i am not mistaken we don't need this one because we won't query person.notifications

    note_ids = execute('select id from notifications').to_a
    unless note_ids.empty?
      #make the notification actors table
      execute "INSERT INTO notification_actors (notification_id, person_id) " +
        " SELECT id , actor_id " +
        " FROM notifications"

      #update the notifications to reference the post
      execute "UPDATE notifications, comments " +
                "SET notifications.target_id = comments.post_id, " +
                  "target_type = 'Post' " +
                "WHERE (notifications.target_id = comments.id " +
                  "AND (notifications.action = 'comment_on_post' " +
                  "OR notifications.action = 'also_commented'))"

      #select all the notifications to keep
      execute "CREATE TEMPORARY TABLE keep_table " +
                 "(SELECT id as keep_id, actor_id , target_type , target_id , recipient_id , action " +
                 "FROM notifications WHERE action = 'comment_on_post' OR action = 'also_commented' " +
                 "GROUP BY target_type , target_id , recipient_id , action) "

      #get a table of with ids of the notifications that need to be deleted and with the ones that need
      #to replace them
      execute "CREATE TEMPORARY TABLE keep_delete " +
        "( SELECT n1.keep_id, n2.id as delete_id, " +
          "n2.actor_id, n1.target_type, n1.target_id, n1.recipient_id, n1.action " +
        "FROM keep_table n1, notifications n2 " +
        "WHERE n1.keep_id != n2.id " +
          "AND n1.actor_id != n2.actor_id "+
          "AND n1.target_type = n2.target_type AND n1.target_id = n2.target_id " +
          "AND n1.recipient_id = n2.recipient_id AND n1.action = n2.action " +
          "AND (n1.action = 'comment_on_post' OR n1.action = 'also_commented') "+
          "GROUP BY n2.actor_id , n2.target_type , n2.target_id , n2.recipient_id , n2.action)"

      #have the notifications actors reference the notifications that need to be kept
      execute "UPDATE notification_actors, keep_delete "+
                "SET notification_actors.notification_id = keep_delete.keep_id "+
                "WHERE notification_actors.notification_id = keep_delete.delete_id"

      #delete all the notifications that need to be deleted
      execute "DELETE notifications.* " +
                "FROM notifications, keep_delete " +
                "WHERE notifications.id != keep_delete.keep_id AND "+
                       "notifications.target_type = keep_delete.target_type AND "+
                       "notifications.target_id = keep_delete.target_id AND "+
                       "notifications.recipient_id = keep_delete.recipient_id AND "+
                       "notifications.action = keep_delete.action"
    end


    remove_column :notifications, :actor_id
  end

  def self.down
    raise ActiveRecord::IrreversibleMigration.new
  end
end
