package Blast::Client_Config;
use DictyBaseConfig;
use SOAP::Lite;

use lib "/usr/local/dicty/lib";
use Bio::SearchIO::Writer::HTMLResultWriter;


use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase/Objects";
use ConfigURLdictyBase;
use ConfigPathdictyBase;

use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase";
#
# had to move printStartPage calls to here to prevent top of page printing
#  way before rest of page on large reports
#
use dictyBaseCentralMod;

use FormatdictyBase;


#####################  edit these for blast client #############################
#
#  eventuallly we will have a separate config file
#


my $e_values = [
   qw /1000 500 100 10 1 0.1 0.001 1e-5 1e-25 1e-50 1e-100/
];

my $word_sizes = [
   qw /0 15 14 13 12 11 10 9 8 7 6 5 4 3 2/
];

my $num_alignments = [
   qw /0 5 25 50 100 250 500 750 1000/
];

my %default_options = (
#   p    => 'blastn',
#   d    => 'dictyCoding',
   e    => '0.1',
   M    => 'BLOSUM62',
   F    => 'T',
   g    => 'T',
   b    => '50'
);

my $blast_host = $ENV{'BLAST_SERVER'};
$blast_host    .= ":".$ENV{'BLAST_PORT'} if $ENV{'BLAST_PORT'};
my $blast_server = SOAP::Lite
      -> ns('http://dictyBase.org/Blast')
      -> proxy("http://$blast_host/cgi-bin/blast.pl");

#my $writer    = new Bio::SearchIO::Writer::HTMLResultWriter_dicty(
#         -nucleotide_url => '/db/cgi-bin/gene_page.pl?dictybaseid=%s',
#         -protein_url    => '/db/cgi-bin/gene_page.pl?dictybaseid=%s'
#);

my $writer    = new Bio::SearchIO::Writer::HTMLResultWriter(
         -nucleotide_url => '/db/cgi-bin/feature_page.pl?dictybaseid=%s',
         -protein_url    => '/db/cgi-bin/feature_page.pl?dictybaseid=%s'
);

$writer->title( sub {}  );

my $email    = 'dictyBase@northwestern.edu';

#############################################
#
# large reports do not get sent by soap (takes too long)
#  they get ftp'd to the tmp directory for the user
#  to download
#
#############################################

my $configURL  = ConfigURLdictyBase->new;
my $configPath = ConfigPathdictyBase->new;

my $tmp_dir  = $configPath->tmpDir;

my $tmp_url  = $configURL->dictyBaseHtmlTmp;

my $sftp_user = "_ejust";
my $sftp_pw   = "live_at_leeds";

my $ncbi_link = "/db/cgi-bin/dictyBase/go_to_ncbi_blast.pl";



sub page_header {
   dictyBaseCentralMod::printStartPage("dictyBase", "Blast Server","blast.html");


   my $database_help_link = FormatdictyBase::help_url("blast.html#databases");

   print qq `

   In order to provide a more complete data set to our user community we have changed the blast
   databases available on this site.  Please click on the help link or <a href="$database_help_link">here</a>
   for a full description.  In addition, you can download any of the databases!  Click <a href="/db/cgi-bin/dictyBase/download/blast_databases.pl">here to download a database (FASTA file).</a>
   <br/><br/>


   <script language="Javascript">

      function validate_blast_form (element) {
          var form = document.forms['blast_form'];
          if (form.program.options[form.program.selectedIndex].value == 'unselected') {
             alert('Please select a program to run');
             form.program.focus();
          }
          else if (form.database.options[form.database.selectedIndex].value == 'unselected') {
             alert('Please select a database to BLAST against');
             form.database.focus();
          }
          else if (form.query.value == '') {
             alert('Please type or paste a query sequence');
             form.query.focus();
          }
          else {
             form.run_blast.value = 1;
             form.submit();
          }
      }

      function blast_at_ncbi () {

          var form1 = document.forms['blast_form'];
          var form2 = document.forms['ncbi_blast_form'];

          if (form1.program.options[form1.program.selectedIndex].value == 'unselected') {
             alert('Please select a program to run');
             form1.program.focus();
          }

          else if (form1.query.value == '') {
             alert('Please type or paste a query sequence');
             form.query.focus();
          }

          var program = form1.program.options[form1.program.selectedIndex].value;
          var query   = form1.query.value;

          form2.program.value = program;
          form2.query.value   = query

          NewWindow('about:blank','Popup', '800', '650', 'center','front');

          form2.target = 'Popup';
          form2.submit();

      }

   </script>
   `

}
sub page_footer { dictyBaseCentralMod::printEndPage();                              }

##############################################################################


#
# set config object properties
#
sub new {
   my $self = {};
   bless $self, shift;


   $self->options        ( \%default_options );
   $self->num_alignments ( $num_alignments   );
   $self->word_sizes     ( $word_sizes       );
   $self->e_values       ( $e_values         );

   $self->report_writer  ( $writer           );

   $self->blast_server   ( $blast_server     );
   $self->blast_host     ( $blast_host       );
   $self->email          ( $email            );

   $self->sftp_user      ( $sftp_user        );
   $self->sftp_pw        ( $sftp_pw          );

   $self->tmp_dir        ( $tmp_dir          );
   $self->tmp_url        ( $tmp_url          );
   $self->ncbi_link      ( $ncbi_link        );

   return $self;

}

#
# expose properties with accessors
#
sub programs {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{programs} = $obj;
   }
   return $self->{programs};
}

sub databases {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{databases} = $obj;
   }
   return $self->{databases};
}

sub matrices {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{matrices} = $obj;
   }
   return $self->{matrices};
}

sub options {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{options} = $obj;
   }
   return $self->{options};
}

sub num_alignments {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{num_alignments} = $obj;
   }
   return $self->{num_alignments};
}

sub word_sizes {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{word_sizes} = $obj;
   }
   return $self->{word_sizes};
}

sub e_values {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{e_value} = $obj;
   }
   return $self->{e_value};
}

sub report_writer {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{report_writer} = $obj;
   }
   return $self->{report_writer};
}

sub blast_server {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{blast_server} = $obj;

     #
     # get config objects from server
     #  these tell what programs and databases are available
     #
      my ( $programs, $databases, $matrices );

      eval {
         ( $programs, $databases, $matrices ) = @{ $self->blast_server->config->result };
      };
      if ($@) {
         print STDERR $@;
         $self->server_down(1);
      }
      $self->programs       ( $programs         );
      $self->databases      ( $databases        );
      $self->matrices       ( $matrices         );
   }
   return $self->{blast_server};
}

sub blast_host {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{blast_host} = $obj;
   }
   return $self->{blast_host};
}

sub tmp_url {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{tmp_url} = $obj;
   }
   return $self->{tmp_url};
}

sub tmp_dir {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{tmp_dir} = $obj;
   }
   return $self->{tmp_dir};
}
sub email {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{email} = $obj;
   }
   return $self->{email};
}


sub sftp_user {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{sftp_user} = $obj;
   }
   return $self->{sftp_user};
}

sub sftp_pw {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{sftp_pw} = $obj;
   }
   return $self->{sftp_pw};
}

sub server_down {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{server_down} = $obj;
   }
   return $self->{server_down};
}

sub ncbi_link {
   my ($self, $obj) = @_;
   if( $obj ) {
      $self->{ncbi_link} = $obj;
   }
   return $self->{ncbi_link};
}
1;
