package Ocsinventory::Agent::Config;

use strict;
use Getopt::Long;

our $VERSION = '2.10.0';

my $basedir = '';
my $default = {
    'daemon'    =>  0,
    'debug'     =>  0,
    'devlib'    =>  0,
    'force'     =>  0,
    'help'      =>  0,
    'info'      =>  1,
    'lazy'      =>  0,
    'local'     =>  '',
#   'logger'    =>  'Syslog,File,Stderr',
    'logger'    =>  'Stderr',
    'logfacility' => 'LOG_USER',
    'logfile'   =>  '',
    'password'  =>  '',
    'proxy'     =>  '',
    'realm'     =>  '',
    'remotedir' =>  '/ocsinventory', # deprecated, give a complete URL to
                                     # --server instead
    'server'    =>  'http://ocsinventory-ng/ocsinventory',
    'stdout'    =>  0,
    'tag'       =>  '',
    'user'      =>  '',
    'version'   =>  0,
    'wait'      =>  '',
#   'xml'       =>  0,
    'nosoftware'=>  0,
    'delaytime' =>  '3600', # max delay time (seconds)
    'backendCollectTimeout'   => '600',   # timeOut of process : see Backend.pm
    'scanhomedirs' => 0,
    'ssl' => 1,
    'ca' => '',
    'snmp' => 0,
    'snmptimeout' => 3,
    'snmpretry' => 2,

    # Other values that can't be changed with the
    # CLI parameters
    'version'   => $VERSION,
    'deviceid'  => '',
    'basevardir'=>  $basedir.'/var/lib/ocsinventory-agent',
    'logdir'    =>  $basedir.'/var/log/ocsinventory-agent',
#   'pidfile'   =>  $basedir.'/var/run/ocsinventory-agent.pid',
};


sub new {
	my (undef, $params) = @_;


	my $self = {};

	bless $self;
	$self->{file} = $params->{file};

	$self->{config} = $default;
	$self->loadFromCfgFile();

	return $self;
}

sub loadFromCfgFile {
    my $self = shift;

    my $config;

    $self->{config}{etcdir} = [];

    push (@{$self->{config}{etcdir}}, '/etc/ocsinventory');
    push (@{$self->{config}{etcdir}}, '/usr/local/etc/ocsinventory');
    push (@{$self->{config}{etcdir}}, '/etc/ocsinventory-agent');
    push (@{$self->{config}{etcdir}}, $ENV{HOME}.'/.ocsinventory'); # Should I?

    my $file;
    if (!$file || !-f $file) {
        foreach (@{$self->{config}{etcdir}}) {
            $file = $_.'/ocsinventory-agent.cfg';
            last if -f $file;
        }
        return $config unless -f $file;
    }

    $self->{configfile} = $file;

    if (!open (CONFIG, '<'.$file)) {
        print(STDERR "Config: Failed to open $file\n");
	    return $config;
    }

    foreach (<CONFIG>) {
        s/^#.+//;
        if (/(\w+)\s*=\s*(.+)/) {
            my $key = $1;
            my $val = $2;
            # Remove the quotes
            $val =~ s/\s+$//;
            $val =~ s/^'(.*)'$/$1/;
            $val =~ s/^"(.*)"$/$1/;
            $self->{config}{lc($key)} = $val;
        }
    }
    close CONFIG;
}

sub loadUserParams {
	my $self = shift;
	my %options = (
		"backend-collect-timeout=s"  =>   \$self->{config}{backendCollectTimeout},
		"basevardir=s"    =>   \$self->{config}{basevardir},
		"d|daemon"        =>   \$self->{config}{daemon},
		"debug"           =>   \$self->{config}{debug},
		"devlib"          =>   \$self->{config}{devlib},
		"f|force"         =>   \$self->{config}{force},
		"h|help"          =>   \$self->{config}{help},
		"i|info"          =>   \$self->{config}{info},
		"lazy"            =>   \$self->{config}{lazy},
		"l|local=s"       =>   \$self->{config}{local},
		"logfile=s"       =>   \$self->{config}{logfile},
		"nosoftware"      =>   \$self->{config}{nosoftware},
		"p|password=s"    =>   \$self->{config}{password},
		"P|proxy=s"       =>   \$self->{config}{proxy},
		"r|realm=s"       =>   \$self->{config}{realm},
		"R|remotedir=s"   =>   \$self->{config}{remotedir},
		"s|server=s"      =>   \$self->{config}{server},
		"stdout"          =>   \$self->{config}{stdout},
		"t|tag=s"         =>   \$self->{config}{tag},
		"u|user=s"        =>   \$self->{config}{user},
		"version"         =>   \$self->{config}{version},
		"w|wait=s"        =>   \$self->{config}{wait},
#       "x|xml"          =>   \$self->{config}{xml},
		"delaytime"       =>   \$self->{config}{delaytime},
		"scan-homedirs"   =>   \$self->{config}{scanhomedirs},
		"nolocal"        =>   \$self->{config}{nolocal},
		"ssl=s"            =>   \$self->{config}{ssl},
		"ca=s"            =>   \$self->{config}{ca},
        "snmp=s"            =>   \$self->{config}{snmp},
        "snmptimeout=s"   =>   \$self->{config}{snmptimeout},
        "snmpretry=s"     =>   \$self->{config}{snmpretry},
	);

	$self->help() if (!GetOptions(%options) || $self->{config}{help});
	$self->version() if $self->{config}{version} eq 1;
}


sub help {
    my ($self, $error) = @_;
    if ($error) {
        chomp $error;
        print "ERROR: $error\n\n";
    }

    if ($self->{configfile}) {
        print STDERR "Setting initialised with values retrieved from ".
        "the config found at ".$self->{configfile}."\n";
    }

    print STDERR "\n";
    print STDERR "Usage:\n";
    print STDERR "\t--backend-collect-timeout set a max delay time of one action (search package id, ...) is set (".$self->{config}{backendCollectTimeout}.")\n";
    print STDERR "\t--basevardir=/path  indicate the directory where should the agent store its files (".$self->{config}{basevardir}.")\n";
    print STDERR "\t-d  --daemon        detach the agent in background (".$self->{config}{daemon}.")\n";
    print STDERR "\t    --debug         debug mode (".$self->{config}{debug}.")\n";
    print STDERR "\t    --devlib        search for Backend mod in ./lib only (".$self->{config}{devlib}.")\n";
    print STDERR "\t-f --force          always send data to server (Don't ask before) (".$self->{config}{force}.")\n";
    print STDERR "\t-i --info           verbose mode (".$self->{config}{info}.")\n";
    print STDERR "\t--lazy              do not contact the server more than one time during the PROLOG_FREQ (".$self->{config}{lazy}.")\n";
    print STDERR "\t-l --local=DIR      do not contact server but write inventory in DIR directory in XML (".$self->{config}{local}.")\n";
    print STDERR "\t   --logfile=FILE   log message in FILE (".$self->{config}{logfile}.")\n";
    print STDERR "\t-p --password=PWD   password for server auth\n";
    print STDERR "\t-P --proxy=PROXY    proxy address. e.g: http://user:pass\@proxy:port (".$self->{config}{proxy}.")\n";
    print STDERR "\t-r --realm=REALM    realm for server auth. e.g: 'Restricted Area' (".$self->{config}{realm}.")\n";
    print STDERR "\t-s --server=uri     server uri (".$self->{config}{server}.")\n";
    print STDERR "\t   --stdout         do not write or post the inventory but print it on STDOUT\n";
    print STDERR "\t-t --tag=TAG        use TAG as tag (".$self->{config}{tag}."). Will be ignored by server if a value already exists.\n";
    print STDERR "\t-u --user=USER      user for server auth (".$self->{config}{user}.")\n";
    print STDERR "\t   --version        print the version\n";
    print STDERR "\t-w --wait=seconds   wait a random period before contacting server like --daemon does (".$self->{config}{wait}.")\n";
#   print STDERR "\t-x --xml            write output in a xml file ($self->{config}{xml})\n";
    print STDERR "\t--nosoftware        do not return installed software list (".$self->{config}{nosoftware}.")\n";
    print STDERR "\t--delaytime	      set a max delay time (in second) if no PROLOG_FREQ is set (".$self->{config}{delaytime}.")\n";
    print STDERR "\t--scan-homedirs     permit to scan home user directories (".$self->{config}{scanhomedirs}.")\n" ;
    print STDERR "\t--ssl=0|1           disable or enable SSL communications check (".$self->{config}{ssl}.")\n" ;
    print STDERR "\t--ca=FILE           path to CA certificates file in PEM format (".$self->{config}{ca}.")\n" ;

    print STDERR "\n";
    print STDERR "Manpage:\n";
    print STDERR "\tSee man ocsinventory-agent\n";

    print STDERR "\n";
    print STDERR "Ocsinventory-Agent is released under GNU GPL 2 license\n";
    exit 1;
}

sub version {
    print "Ocsinventory unified agent for UNIX, Linux and MacOSX (".$VERSION.")\n";
    exit 0;
}


1;
