#!/usr/bin/perl

use 5.008;
use strict;
use warnings;
use Params::Util qw{
	_IDENTIFIER
	_INSTANCE
};
use Win32::Env::Path ();

use vars qw{$VERSION};
BEGIN {
	$|       = 1;
	$VERSION = '0.01';
}

exit( main(@ARGV) );





#####################################################################
# Main Functions

sub main {
	my $cmd = shift @_;
	return usage(@_)  unless defined $cmd;
	return clean(@_)  if $cmd eq 'clean';
	return push(@_)   if $cmd eq 'push';
	return remove(@_) if $cmd eq 'remove';
	return error("Unknown command '$cmd'");
}

sub usage {
	print "\n";
	print "win32envpath $VERSION - Copright 2008 Adam Kennedy\n";
	print "Usage:\n";
	print "  win32envpath PATH clean\n";
	print "  win32envpath PATH add\n";
	print "\n";
	return 0;
}

sub clean {
	my $path = path(shift);
	unless ( $path->clean ) {
		my $name = $path->name;
		error("Failed to clean the '$name' path");
	}
	return 0;
}

sub push {
	my $path = path(shift);
	my $name = $path->name;
	my $dir  = shift;
	unless ( defined $dir and -d $dir ) {
		error("Missing or invalid directory to add to '$name'");
	}
	unless ( 0 ) {
		error("Failed to push directory onto '$name'");
	}
	return 0;
}

sub remove {
	my $path = path(shift);
	my $name = $path->name;
	my $dir  = shift;
	unless ( defined $dir and -d $dir ) {
		error("Missing or invalid directory to add to '$name'");
	}
	unless ( $path->remove($dir) ) {
		error("Failed to push directory onto '$name'");
	}
	return 0;
}

sub error {
	my $msg = shift;
	chomp $msg;
	print "\n";
	print "  $msg\n";
	print "\n";
	return 255;
}

sub path {
	my $path = shift;
	unless ( _IDENTIFIER($path) ) {
		error("Missing or invalid path name");
	}
	my $rv = Win32::Env::Path->new(
		name     => $path,
		autosave => 1,
	);
	unless ( _INSTANCE($rv, 'Win32::Env::Path') ) {
		error("Failed to create Win32::Env::Path for path '$path'");
	}
	return $rv;
}
