package LiCoM::Config;

use strict;
use warnings;

use Exporter;

@LiCoM::Config::EXPORT_OK = ('get_config read_config');
@LiCoM::Config::ISA = ('Exporter');

our $Config = {};

return (1);

=head1 STATIC FUNCTIONS

=over 4

=item LiCoM::Config-E<gt>B<get_config> (I<$key>)

Returns the value for I<$key> or undef if it's unknown.

=cut

sub get_config
{
	my $pkg = shift;
	my $key = shift;

	if (!%$Config)
	{
		read_config ();
	}

	return ($Config->{$key});
}

=item LiCoM::Config-E<gt>B<set_config> (I<$key>, I<$value>)

Sets the value of I<$key> to I<$value>.

=cut

sub set_config
{
	my $pkg = shift;
	my $key = shift;
	my $val = shift;

	$Config->{$key} = $val;
}

=item LiCoM::Config-E<gt>B<read_config> ([I<@files>])

Read the config from the files given or F</etc/licom/licom.conf> and
F<~/.licomrc> if no files were given.

=cut

sub read_config
{
	my @files = ('/etc/licom/licom.conf');

	if (@_)
	{
		@files = @_;
	}
	elsif (defined ($ENV{'HOME'}) and (-d $ENV{'HOME'}))
	{
		push (@files, $ENV{'HOME'} . '/.licomrc');
	}

	for (@files)
	{
		my $file = $_;
		next unless (-r $file);

		read_file ($file, $config);
	}

	return ($config);
}

sub read_file
{
	my $file   = @_ ? shift : '/etc/licom/licom.conf';
	my $config = @_ ? shift : {};
	my $fh;

	open ($fh, "< $file") or die ("open ($file): $!");
	for (<$fh>)
	{
		chomp;
		my $line = $_;

		if ($line =~ m/^(\w+):\s*"(.+)"\s*$/)
		{
			my $key = lc ($1);
			my $val = $2;

			$config->{$key} = $val;
		}
	}

	close ($fh);

	return ($config);
}

=back

=head1 AUTHOR

Florian octo Forster E<lt>octo at verplant.orgE<gt>

=cut
