package BLAST::Config;
BEGIN{ push(@INC, $ENV{LOCAL_PERL_MODULES}); }
use Carp;
use warnings;
use strict;
use BLAST::Program;
use BLAST::Format;


###################################################
sub new {
    my $pkg = shift;
    bless {
	program     => BLAST::Program->new(), 
	format      => BLAST::Format->new(), 
	queryFile   => undef, 
	subjectFile => undef, 
        outputFile  => undef, 
        maxEvalue   => undef, 
        numCPUs     => 1
    }, $pkg;
}


###################################################
sub parse {
    my $self     = shift;
    my $filename = shift or croak "Config file name is not defined.";
    open IN, $filename or croak "$filename is not defined.";
    my $params   = {};
    while(<IN>){
	chomp;
	my @cols = split("=", $_);
	if( @cols == 2 ){
	    my ($key, $val) = @cols;
	    $params->{$key} = $val;
	}
    }
    $self->setAll( $params );
    close IN;
}

###################################################
sub setAll {
    my $self = shift;
    my $params = shift;
    foreach my $key (keys %$params){
	my $val = $params->{$key};
	if( $key eq 'programName' ){
	    $self->setProgram($val);
	} elsif( $key eq 'formatCode' ){
	    $self->setFormat($val);
	} elsif( $key eq 'queryFile' ){
	    $self->setQueryFile($val);
	} elsif( $key eq 'subjectFile' ){
	    $self->setSubjectFile($val);
	} elsif( $key eq 'outputFile' ){
	    $self->setOutputFile($val);
	} elsif( $key eq 'maxEvalue' ){
	    $self->setMaxEvalue($val);
	} elsif( $key eq 'numCPUs' ){
	    $self->setNumCPUs($val);
	}
    }
}

###################################################
sub setProgram {
    my $self = shift;
    my $programName = shift or croak "Program name is not defined.";
    $self->getProgram()->setName( $programName );
}


###################################################
sub setFormat {
    my $self = shift;
    my $formatCode = shift;
    $self->getFormat()->setCode( $formatCode );
}


###################################################
sub setQueryFile {
    my $self = shift;
    my $queryFile = shift or croak "Query file name is not defined.";
    $self->{queryFile} = $queryFile;
}


###################################################
sub setSubjectFile {
    my $self = shift;
    my $subjectFile = shift or croak "Subject file name is not defined.";
    $self->{subjectFile} = $subjectFile;
}


###################################################
sub setOutputFile {
    my $self = shift;
    my $outputFile = shift or croak "Output file name is not defined.";
    $self->{outputFile} = $outputFile;
}

###################################################
sub setMaxEvalue {
    my $self = shift;
    my $maxEvalue = shift or croak "Maximum E-value is not defined.";
    $self->{maxEvalue} = $maxEvalue;
}   

###################################################
sub setNumCPUs {
    my $self = shift;
    my $numCPUs = shift or croak "Number of CPUs available is not defined.";
    $self->{numCPUs} = $numCPUs;
}

###################################################
sub getProgram {
    my $self= shift;
    return $self->{program};
}


###################################################
sub getProgramName {
    my $self = shift;
    return $self->getProgram()->getName();
}


###################################################
sub getFormat {
    my $self = shift;
    return $self->{format};
}


###################################################
sub getFormatCode {
    my $self = shift;
    return $self->getFormat()->getCode();
}


###################################################
sub getQueryFile {
    my $self = shift;
    return $self->{queryFile};
}


###################################################
sub getSubjectFile {
    my $self = shift;
    return $self->{subjectFile};
}


###################################################
sub getOutputFile {
    my $self = shift;
    return $self->{outputFile};
}

###################################################
sub getMaxEvalue {
    my $self = shift;
    return $self->{maxEvalue};
}

###################################################
sub getNumCPUs {
    my $self = shift;
    return $self->{numCPUs};
}

###################################################
sub getDBFiles {
    my $self = shift;
    if( $self->getProgram()->getDBType() eq 'dna' ){
	return $self->getDnaTypeDBFiles();
    } else {
	return $self->getPeptideTypeDBFiles();
    }
}


###################################################
sub getDnaTypeDBFiles {
    my $self = shift;
    my $dbFiles = [];
    push( @$dbFiles, $self->getSubjectFile().'.nin' );
    push( @$dbFiles, $self->getSubjectFile().'.nhr' );
    push( @$dbFiles, $self->getSubjectFile().'.nsq' );
    return $dbFiles;
}


###################################################
sub getPeptideTypeDBFiles {
    my $self = shift;
    my $dbFiles = [];
    push( @$dbFiles, $self->getSubjectFile().'.pin' );
    push( @$dbFiles, $self->getSubjectFile().'.phr' );
    push( @$dbFiles, $self->getSubjectFile().'.psq' );
    return $dbFiles;
}


###################################################
sub getDBType {
    my $self = shift;
    return $self->getProgram()->getDBType();
}


1;
