# bundle exec rake rename_class

desc 'Rename a rails class to another' task :rename_class, [:source, :target, :db] => :environment do |t, args|

unless args.source.present? && args.target.present?
  puts 'usage: rake rename_class[account,team] (or rake rename_class[account,team,skipdb] to skip database migrations)' and exit
end

source = args.source.to_s.downcase.singularize
target = args.target.to_s.downcase.singularize

puts "=== Renaming class '#{source.classify}' to '#{target.classify}'"

whitelist = ['app/', 'config/routes.rb', 'config/locales/', 'db/', 'lib/', 'test/'].compact
blacklist = ['db/schema.rb', ('db/migrate' if args.db == 'skipdb')].compact

# Rename any directories in the app
Dir.glob('**/*').each do |path|
  next unless whitelist.any? { |ok| path.start_with?(ok) }
  next if blacklist.any? { |nope| path.start_with?(nope) }
  next unless File.directory?(path)

  changed = path.gsub(source.pluralize, target.pluralize).gsub(source, target)

  if path != changed
    File.rename(path, changed)
    puts "renamed: #{path} => #{changed}"
  end
end

# Rename any files in the app
Dir.glob('**/*.*').each do |path|
  next unless whitelist.any? { |ok| path.start_with?(ok) }
  next if blacklist.any? { |nope| path.start_with?(nope) }

  changed = path.gsub(source.pluralize, target.pluralize).gsub(source, target)

  if path != changed
    File.rename(path, changed)
    puts "renamed: #{path} => #{changed}"
  end
end

# Search and replace in all files
subs = {
  source.classify.pluralize => target.classify.pluralize,
  source.classify => target.classify,
  source.pluralize => target.pluralize,
  source => target
}

if source.include?('_')
  subs[source.gsub('_', '-')] ||= target
end

Dir.glob('**/*.*').each do |path|
  next unless whitelist.any? { |ok| path.start_with?(ok) }
  next if blacklist.any? { |nope| path.start_with?(nope) }

  writer = Effective::CodeWriter.new(path) do |w|
    subs.each { |k, v| w.gsub!(k, v) }
  end

  puts "updated: #{path}" if writer.changed?
end

end

desc 'Rename a rails attribute to another' task :rename_attribute, [:source, :target, :db] => :environment do |t, args|

unless args.source.present? && args.target.present?
  puts 'usage: rake attribute[expire,expire_after] (or rake attribute[expire,expire_after,skipdb] to skip database migrations)' and exit
end

source = args.source.to_s.downcase
target = args.target.to_s.downcase

puts "=== Renaming attribute '#{source}' to '#{target}'"

whitelist = ['app/', 'config/locales/', 'db/', 'lib/', 'test/'].compact
blacklist = ['db/schema.rb', ('db/migrate' if args.db == 'skipdb')].compact

# Search and replace in all files
subs = {
  source.classify.pluralize => target.classify.pluralize,
  source.classify => target.classify,
  source => target
}

if source.include?('_')
  subs[source.gsub('_', '-')] ||= target
end

Dir.glob('**/*.*').each do |path|
  next unless whitelist.any? { |ok| path.start_with?(ok) }
  next if blacklist.any? { |nope| path.start_with?(nope) }

  writer = Effective::CodeWriter.new(path) do |w|
    subs.each { |k, v| w.gsub!(k, v) }
  end

  puts "updated: #{path}" if writer.changed?
end

end