require 'rake'

namespace :data do

def apply_single_migration(direction, version)
  raise 'VERSION is required' unless version
  RailsDataMigrations::Migrator.run_migration(
    direction,
    RailsDataMigrations::Migrator.migrations_path,
    version.to_i
  )
end

task init_migration: :environment do
  RailsDataMigrations::LogEntry.create_table
end

desc 'Apply pending data migrations'
task migrate: :init_migration do
  RailsDataMigrations::Migrator.list_pending_migrations.sort_by(&:version).each do |m|
    apply_single_migration(:up, m.version)
  end
end

desc 'Mark all pending data migrations complete'
task reset: :init_migration do
  RailsDataMigrations::Migrator.list_pending_migrations.each do |m|
    RailsDataMigrations::LogEntry.create!(version: m.version.to_s)
  end
end

namespace :migrate do
  desc 'Apply single data migration using VERSION'
  task up: :init_migration do
    apply_single_migration(:up, ENV['VERSION'])
  end

  desc 'Revert single data migration using VERSION'
  task down: :init_migration do
    apply_single_migration(:down, ENV['VERSION'])
  end

  desc 'Skip single data migration using VERSION'
  task skip: :init_migration do
    version = ENV['VERSION'].to_i
    raise 'VERSION is required' unless version > 0
    if RailsDataMigrations::LogEntry.where(version: version).any?
      puts "data migration #{version} was already applied."
    else
      RailsDataMigrations::LogEntry.create!(version: version)
      puts "data migration #{version} was skipped."
    end
  end

  desc 'List pending migrations'
  task pending: :init_migration do
    puts "#{format('% 16s', 'Migration ID')}  Migration Name"
    puts '--------------------------------------------------'
    RailsDataMigrations::Migrator.list_pending_migrations.each do |m|
      puts "#{format('% 16i', m.version)}  #{m.name.to_s.titleize}"
    end
  end
end

end