#!/usr/bin/perl
use File::Copy;
use Data::Dumper;
use warnings;
use strict;
sub try_move {
	my ($f1,$f2) = @_;
	if ( -f $f2 ) {
		die "$f2: destination exists";
	}
	if (! -f $f1) {
		die "$f1: origin ! exists";
	}
	print "move($f1,$f2)\n";
	move($f1,$f2) or die "move($f1,$f2): $!";
}

sub usage {
	die "$0 usage:\n $0 [from] [to]\n";
}

# MAIN
my $DEBUG = 1;

my ($from_dir,$to_dir);
if(@ARGV != 2) {
	usage;
} else {
	$from_dir = $ARGV[0];	
	$to_dir = $ARGV[1];	
	if( ! -d $from_dir || ! -d $to_dir ) {
		usage;
	}
}


my (%FROM,%TO);
opendir(TO,$to_dir) or die "opendir $to_dir: $!";
opendir(FROM,$from_dir) or die "opendir $from_dir: $!";
while( my $file = readdir(FROM) ) {
	next if ( -d $file);
	if ( -f $from_dir."/".$file ) {
		$FROM{$file} = 1;
	}
}
while( my $file = readdir(TO) ) {
	next if ( -d $file);
	if ( -f $to_dir."/".$file ) {
		$TO{$file} = 1;
	}
}
foreach my $from (keys %FROM) {
	if ( $from =~ m/^(\d{3})\.part$/io ) {
		my $fileno = $1;
		my $done=0;
		while(!$done) {
			if (-f $to_dir."/".$fileno."\.part") {
				$fileno++;
			} else {
				# mv $fileno.part* $to_dir
				my @match;
				if(!(@match = grep { m/^$from/i } keys %FROM)) {print "regex fail\n";next;}
				foreach my $all_match (@match) {
					my $destination = $all_match;
					if( $destination =~ s/^$from/$fileno\.part/ ) {
						try_move($from_dir."/".$all_match,$to_dir."/".$destination);
					} else {
						die "regex problem\n";
					}
				}
				$done=1;
			}
		}
	}
}	
