#!/usr/bin/env perl

# vim: tabstop=4 expandtab

=head1 NAME

cli-driver-sharedir-example.pl - a CLI::Driver example with File::ShareDir

Quickstart:  
  - cd to your project dir (typically where the Makefile.PL lives)
  - create bin/ dir
  - copy this to bin/<yournewcliname.pl> 
  - create 'share/' dir
  - create 'share/cli-driver.yml' file (you can use the cli-driver.yml example
    included with this distro)
  - find the TODO(s) in this file and update those section(s) appropriately
  
  - Dist::Zilla users:
    - add [ExecDir] to your dist.ini (assuming you want to bundle your new cli)
    - add [ShareDir] to your dist.ini
    
  - ExtUtils::MakeMaker users:
    - add EXE_FILES => ['bin/yournewcliname.pl'] to your Makefile.PL
    - refer to File::ShareDir docs for remaining config

=cut

###### PACKAGES ######

use Modern::Perl;
use Data::Printer alias => 'pdump';
use CLI::Driver;
use File::ShareDir 'dist_file';
use File::Basename;
use Getopt::Long;
Getopt::Long::Configure('no_ignore_case');
Getopt::Long::Configure('pass_through');
Getopt::Long::Configure('no_auto_abbrev');

###### CONSTANTS ######

# TODO: change to your distribution name (using hyphens)
use constant DIST_NAME => 'CLI-DRIVER';

# TODO: change to your cli-driver filename IF it differs
use constant CLI_DRIVER_FILE => 'cli-driver.yml';

###### GLOBALS ######

use vars qw(
  $Action
  $CliDriver
);

###### MAIN ######

$| = 1;

$CliDriver = CLI::Driver->new( path => get_cli_driver_path() );

parse_cmd_line();

my $action = $CliDriver->get_action( name => $Action );

if ($action) {
	$action->do;
}
else {
	$CliDriver->fatal("failed to find action in config file");
}

###### END MAIN ######

sub get_repo_dir {
	
	my $bindir = dirname $0;
	my $devdir = dirname $bindir;		
	
	return $devdir;
}

sub get_cli_driver_path {

	#
	# first attempt to find the driver file in the git repo location
	#
	my $sharedir = sprintf "%s/share", get_repo_dir();
	if ( -f sprintf "%s/%s", $sharedir, CLI_DRIVER_FILE() ) {
		# local development location
		return $sharedir;
	}

	#
	# try the File::ShareDir install location
	#
	my $file = dist_file( DIST_NAME(), CLI_DRIVER_FILE());

	return dirname $file;
}

sub check_required {
	my $opt = shift;
	my $arg = shift;

	print_usage("missing arg $opt") if !$arg;
}

sub parse_cmd_line {

	my $help;
	GetOptions( "help|?" => \$help );

	if ( !@ARGV ) {
		print_usage();
	}
	elsif (@ARGV) {
		$Action = shift @ARGV;
	}

	if ($help) {
		if ($Action) {
			help_action();
		}
		else {
			print_usage();
		}
	}
}

sub help_action {

	my $action = $CliDriver->get_action( name => $Action );
	$action->usage;
}

sub print_actions {

	my $actions = $CliDriver->get_actions;
	my @list;

	foreach my $action (@$actions) {

		next if $action->name =~ /dummy/i;
		my $display = $action->name;

		if ( $action->is_deprecated ) {
			$display .= " (deprecated)";
		}

		push @list, $display;
	}

	say "\tACTIONS:";

	foreach my $action ( sort @list ) {
		print "\t\t$action\n";
	}
}

sub print_usage {
	print STDERR "@_\n\n" if @_;

	my $basename = basename($0);

	printf "\nusage: %s <action> [opts] [-?]\n\n", basename($0);
	print_actions();
	print "\n";

	exit 1;
}