package Autocache::Config;

use strict;
use warnings;

use base 'Autocache::Config::Node';

use Carp;
use IO::File;
use Data::Dumper;

sub new
{
    my ($class,$filename) = @_;
    my $self = $class->SUPER::new( '' );

    if( $filename )
    {
        confess "configuration file supplied cannot be found/read"
            unless _file_good( $filename );
        $self->_load_config_file( $filename );
    }
    else
    {
        $filename = _locate_config_file();
        $self->_load_config_file( $filename )
            if defined $filename;
    }


    return $self;
}

sub _load_config_file
{
    my ($self,$filename) = @_;

    my $fh = IO::File->new( $filename, 'r' )
        or confess "cannot open file for reading '$filename'";

    while( my $line = <$fh> )
    {
        next if $line =~ /^\s*$/;
        next if $line =~ /^#/;
        next unless $line =~ /^autocache./;
        $line =~ s/^autocache.//;
        chomp $line;
        my ( $key, $value ) = split /\s+=\s+/, $line, 2;
        $self->get_node( $key )->value( $value );
    }

    $fh->close;
    return 1;
}

sub _locate_config_file
{
    my $filename = sprintf '%s/etc/autocache.conf', $ENV{HOME};

    if( _file_good( $filename ) )
    {
        return $filename;
    }

    $filename = '/etc/autocache.conf';

    if( _file_good( $filename ) )
    {
        return $filename;
    }

    return undef;
}

sub _file_good
{
    return ( -e $_[0] && -r _ );
}

1;