package Pod::HtmlPsPdf::Config;

use strict;
use Carp;

# META: probably move FindBin here
use File::Basename ();

# passed only once and then cached 
use vars qw($config_file);

# called in BEGIN block before the rest of the code
####################
sub set_config_file{
    $config_file = shift || '';

    croak "Configuration file $config_file is not readable: $!" 
	unless -r $config_file;

} # end of sub set_config_file

########
sub new{
    my ($class) = shift;

    my $self = bless {}, ref($class)||$class;
    $self->_init(@_);

    return $self;
} # end of sub new

########## 
sub _init{ 
    my $self = shift;
    my $new_config_file = shift || '';

    set_config_file($new_config_file) if $new_config_file;

    croak "Configuration file is not specified" 
	unless $config_file;
 

    # The root directory of the project 
    my $root      = File::Basename::dirname $config_file;
    $self->{root} = $root;

    # do all the work from the base directory
    chdir $root;
    
    # process user's configuration file
    require $config_file;
    use vars qw(%c);
    local *c = \%Pod::HtmlPsPdf::Config::Local::c;

    # dirs (will be mostly created dynamically
    $self->{src_root}   = $c{dir}{src}        || cnf_err('$c{dir}{src}');
    $self->{ps_root}    = $c{dir}{rel_ps}     || cnf_err('$c{dir}{rel_ps}');
    $self->{rel_root}   = $c{dir}{rel_html}   || cnf_err('$c{dir}{rel_html}');
    $self->{split_root} = $c{dir}{split_html} || cnf_err('$c{dir}{split_html}');
    $self->{out_dir}    = $c{dir}{out}        || cnf_err('$c{dir}{out}');

    # setting the filenames to process and checking their existance
    $self->{pod_files}    = $c{ordered_pod_files} || cnf_err('$c{ordered_pod_files}');
    $self->{nonpod_files} = $c{non_pod_files}     || cnf_err('$c{non_pod_files}');
    for (@{$self->{pod_files}}, @{$self->{nonpod_files}}) {
	croak "Can't find @{[$self->{src_root}]}/$_: $!" 
	    unless -r $self->{src_root}."/$_";
    }

    # set and check that we can read the template files
    my @tmpl_files = qw(index_html index_ps page_html page_ps page_split_html);
    for (@tmpl_files) {
	$self->{'tmpl_'.$_} = $c{tmpl}{$_} || cnf_err('$c{tmpl}{'.$_.'}');
	croak "Can't find @{[$self->{'tmpl_'.$_}]}: $!" 
	    unless -r $self->{'tmpl_'.$_};
    }

    $self->{out_name} = $c{out_name} || cnf_err('$c{out_name}');

    $self->{last_modified} = $c{file}{last_modified} || cnf_err('$c{file}{last_modified}');
    $self->{toc_file} = $c{file}{toc_file}           || cnf_err('$c{file}{toc_file}');
    
    $self->{version_file} = $c{file}{version_file}   || cnf_err('$c{file}{version_file}');
    $self->{package_name} = $c{package_name}         || cnf_err('$c{package_name}');

    $self->{html2ps_conf} = $c{file}{html2ps_conf}   || cnf_err('$c{file}{html2ps_conf}');

    $self->{dir_mode} = $c{mode}{dir}     || cnf_err('$c{mode}{dir}');
    $self->{html2ps_exec} = `which html2ps`; 
    chomp $self->{html2ps_exec};
    
    return $self;
    
} # end of sub _init

# user configuration parsing errors reporter
############
sub cnf_err{
    croak "$_[0] from package Pod::HtmlPsPdf::Config::Local is not
    defined\n";
}# end of sub cnf_err


# you can only retrieve data from this class, you cannot modify it.
##############
sub get_param{
  my $self = shift;

  return () unless @_;
  return unless defined wantarray;	
  my @values = map {defined $self->{$_} ? $self->{$_} : ''} @_;

  return wantarray ? @values : $values[0];

} # end of sub get_param


1;
__END__
