#!/usr/bin/perl
# Silly script to manage files on DAP
# Right now just removes .zips
use strict;
use warnings;
use Getopt::Long;

##
# Note for M11:
# jmtpfs /mnt/android/ ## Mount
# fusermount -u /mnt/android ## Umount
##

my %args;
GetOptions(
\%args,
'source-path=s',
'clean-zips',
'dest-path=s',
'exclude-zips',
'sync'
);

sub yn_prompt {

print "Proceed? [y/n]: ";
my $input = <STDIN>;
chomp $input;
if ( $input !~ m/^y|^Y/g ) {
print "Aborting\n";
exit 0;
}

}

sub print_help {

my $help = <<EOF
dac-tool
Usage:
--source-path [Required]
Path to search for music directories

--dest-path
Path to copy music directories to

--clean-zips
Search source-path for .zip files and rm the files

--sync
Copy all files from source-path to dest-path

--exclude-zips
Exclude copying .zip files when used with --sync
EOF
;
print "$help\n";

}

sub check_args {

if ( ! defined $args{'source-path'} || $args{'source-path'} eq "" ) {
print_help();
exit 1;
}

if ( defined $args{'sync'} ) {
if ( ! defined $args{'dest-path'} ) {
print "--sync requires --source-path and --dest-path\n";
exit 1;
}
}

}

sub get_source_used($) {

my $path = shift;
my $used = `df -h $path | tail -n1 | awk '{print \$3}'`;
chomp $used;
$used =~ s/G//g;
return $used;

}

sub clean_zips($) {

# Probably a better way to do this but
# `find` is still reasonably fast at ~75G of files
my $path = shift;
my $start_size = get_source_used($path);
my @zips = split("\n", `find $path | grep .zip`);
my $count = scalar @zips;
if ( $count == 0 ) {
print "Found no zips to clean in $path\n";
exit 0;
}
print "Found $count zip files in $path\n";
print "Delete $count zip files in $path?\n";
yn_prompt();

system("find $path -name '*.zip' -exec rm {} \\\;") == 0
or die print "Find cmd failed : $?\n";

my $end_size = get_source_used($path);
my $diff = $start_size - $end_size;
print "Cleaned up $diff (GB) of zip files\n";

}

sub sync($$) {

my $source_path = shift;
my $dest_path = shift;
my $opts = "";
if ( defined $args{'exclude-zips'} ) {
$opts = $opts . "--exclude \'*.zip\'";
}

#print "rsync -avP $opts $source_path/* $dest_path\n"
system("rsync -avP $opts $source_path/* $dest_path") == 0
or die print "Rsync failed : $?\n";

}

# Main
check_args();
if ( defined $args{'clean-zips'} ) {
clean_zips($args{'source-path'});
} elsif ( defined $args{'sync'} ) {
sync($args{'source-path'}, $args{'dest-path'});
}