#!/usr/bin/env perl

use strict;
use warnings;
use File::Spec;

use MYDan::Node;
use MYDan::Util::OptConf;
use MYDan::Agent::Client;
use MYDan::VSSH::Print;

$| ++;

$MYDan::Util::OptConf::THIS = 'agent';
$MYDan::Util::OptConf::ARGC = -1;
@MYDan::Util::OptConf::CONF = qw( no_ignore_case pass_through ); 

=head1 SYNOPSIS

 $0 -r range [--sudo sudoer ] [--verbose] cmd ..

     [--user username (default `id -un`)]
     [--timeout seconds (default 500)] 
     [--max number ( default 128 )]
     [--port number ( default from .config )]
     [--env "A=123;B=abc" ]
     [--version]
     [--secret "x=1;xx=2" ]

=cut
my $option = MYDan::Util::OptConf->load();
my %o = $option->get(
     qw( range=s sudo=s timeout=i max=i verbose env=s user=s port=s version secret=s )
)->dump();

$option->assert( 'range' );
$o{verbose} = 1;

my $code = shift;

$o{version} = 1 if $code eq 'version';

$o{user} = `id -un` and chop $o{user} unless $o{user};

my %query = ( code => $code, argv => argv( $code ), map{ $_ => $o{$_} }qw( user sudo ) );

map{ 
    $query{"__$1"} = $2 if $_ =~ /^([^=]+)=(.+)$/  
}split /;/, delete $o{secret} if $o{secret};

if( $o{env} )
{
    my %env;
    map{ my @env = split /=/, $_; $env{$env[0]} = $env[1] if 2 == @env }split /;/, $o{env};
    $query{env} = \%env if %env;
}

$query{sudo} = delete $o{sudo} if $o{sudo};

my $range = MYDan::Node->new( $option->dump( 'range' ) );

my %result = MYDan::Agent::Client->new( 
    $range->load( delete $o{range} )->list
)->run( %o, query => \%query ); 

MYDan::VSSH::Print::result( 'rcal' => %result );

exit 0;

sub argv
{
    my $code = File::Spec->join( $o{argv}, shift );
    return -f $code && ( $code = do $code ) && ref $code eq 'CODE'
        ? &$code( @ARGV ) : \@ARGV;
}
