The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use 5.012000;
use warnings;

use Data::Dumper;
use Getopt::Long qw(GetOptions);
use Pod::Usage   qw(pod2usage);

use Dwimmer::Client;


my %opt;
GetOptions(\%opt,
	'version',
	'url=s',
	'username=s',
	'password=s',
) or pod2usage();

if ($opt{version}) {
	say "Dwimmer Client: v$Dwimmer::Client::VERSION";
	exit;
}

$opt{username} ||= 'admin';
pod2usage() if not $opt{url} or not $opt{username} or not $opt{password};

$opt{url} =~ s{/+$}{};

my %commands = (
	add_user        =>  [qw(uname email password)],
	list_users      =>  [],
	change_password =>  [qw(name password)],
);

my $cmd = shift;

pod2usage() if not $cmd or $cmd eq 'help';

pod2usage() if not $commands{$cmd};

my %data;
my @fields = @{ $commands{$cmd} };

# TODO check the validity of the parameters too
if (@ARGV != @fields) {
	die "Invalid number of arguments. Needed: @{ $commands{$cmd} }\n";
}
@data{ @fields } = @ARGV;

my $dw = Dwimmer::Client->new( host => $opt{url} );
my $login = $dw->login( username => $opt{username}, password => $opt{password} );
given ($login->{error}) {
	when (undef) {}
	when ('invalid_password') {
		die "Invalid password\n";
	}
	when ('not_logged_in') {
		die "Could not login\n";
		# maybe some error in the routing? e.g. multiple /-es somewhere?
	}
	default {
		die "Unhandled error: " . Dumper $login;
	}
}
#print Dumper $login;

given ($cmd) {
	when ('add_user') {
		$data{verify} = 'verified';
		$data{pw1} = $data{pw2} = delete $data{password};
	}
	when ('change_password') {
		$data{new_password} = delete $data{password};
		$data{admin_password} = $opt{password};
	}
}

my $r = $dw->$cmd(%data);


given ($cmd) {
	when ('list_users' ) {
		print "Users: \n\n";
		foreach my $u ( sort { $a->{name} cmp $b->{name} } @{ $r->{users} } ) {
			say $u->{name};
		}
	}
	when ('add_user') {
		if ($r->{success}) {
			say 'Success';
		}
		given ($r->{error}) {
			when (undef) {}
			when ('username_taken') {
				die "The username '$data{uname}' is already in use\n";
			}
			when ('email_used') {
				die "The email '$data{email}' is already in use\n";
			}
			default {
				die 'Unrecognized error: ' . Dumper $r;
			}
		}
	}
	when ('change_password') {
		if ($r->{success}) {
			say 'Success. Password changed';
		} else {
			die Dumper $r;
		}
	}
	default {
		print Dumper $r;
	}
}

exit;

=head1 NAME

dwimmer - command line client to interact with a Dwimmer server

=head1 SYNOPSIS

OPTIONAL PARAMETER:

   --username  OF_ADMINISTRATOR    (admin by default)

   --version                  to show the version number of the Dwimmer

REQUIRED PARAMETERS:

   --password  OF_ADMINISTRATOR
   --url       OF_DWIMMER_SITE


Commands:

   add_user USERNAME EMAIL PASSWORD
   list_users
   change_password USERNAME PASSWORD 


For example if you would like to add a user called 'foo' with a password 'secret'
to the system you run

 dwimmer --url http://mycompany.com/ --password ADMIN_PASSWORD add_user foo foo@mycompany.com secret

If you'd like to list all the users run

 dwimmer --url http://mycompany.com/ --password ADMIN_PASSWORD list_users

=cut