#!/usr/local/bin/perl

use warnings;
use strict;
use File::Copy qw/mv/;

sub get_og_files
{
	my @og_files;

	opendir(DIR, '.') or die $!;
	while (readdir(DIR)) {
		next if ($_ =~ m/^\./);
		push @og_files, $_;
	}
	closedir(DIR);
	return @og_files;
}

sub get_new_files
{
	my @og_files = @_;
	my @new_files;

	foreach (@og_files) {
		$_ =~ s/\ -\ /-_/g;
		$_ =~ s/\_-\_/-_/g;
		$_ =~ s/['"]+/_/g;
		$_ =~ s/\ /_/g;
		$_ =~ s/[\$#@~!&*%()\[\];,:?^`\\\/<>|]+/-/g;
		$_ = lc($_);
		push @new_files, $_;
	}
	return @new_files;
}

sub main
{
	my @og_files;
	my @new_files;
	my @files;

	@og_files = get_og_files();
	@new_files = get_new_files(@og_files);
	while (@og_files || @new_files) {
		$files[0] = shift @og_files;
		$files[1] = shift @new_files;
		if (@ARGV == 1 && $ARGV[0] eq '-R' && -d $files[0]) {
			chdir($files[0]) or die $!;
			main();
			chdir('../');
		}
		next if (-e $files[1]);
		mv($files[0], $files[1]) or print STDERR $! . "\n";
		print "'". $files[0] . "' -> '" . $files[1] . "'\n";
	}
	return;
}

main();

__END__