use 5.006;

use strict;
use warnings;

use Module::Build;
use File::Basename;
use Carp;

print "\n";

my $llt = 0;
my ($cpath,  $spath,  $tpath) =  (       q{},                 q{},        q{});
my ($dcpath, $dspath, $dtpath) = ('/etc/GeneDesign/', '/usr/local/bin', '/tmp');
my ($g, $dg) =  ( 0,   q{Y});

my $check = eval
{
  require Bio::GeneDesign::ConfigData;
};
if ($check)
{
  $dcpath = Bio::GeneDesign::ConfigData->config('conf_path')        || $dcpath;
  $dtpath = Bio::GeneDesign::ConfigData->config('tmp_path')         || $dtpath;
  $dspath = Bio::GeneDesign::ConfigData->config('script_path')      || $dspath;
  $dg =     Bio::GeneDesign::ConfigData->config('graphing_support') || $dg;
}

my $GDB = Module::Build->new
(
    module_name         => 'Bio::GeneDesign',
    license             => 'bsd',
    dist_author         => q{Sarah Richardson <SMRichardson@lbl.gov>},
    dist_version        => '5.50',
    dist_abstract       => 'Functions for the design of synthetic genes',
    add_to_cleanup      => [ 'Bio::GeneDesign-*' ],
    create_makefile_pl  => 'traditional',
    build_requires      =>
    {
        'Test::More'      => 0.8,
        'Test::Deep'      => 0.1,
    },
    requires            =>
    {
        'perl'                => 5.006,
        'List::Util'          => 1.22,
        'Math::Combinatorics' => 0.09,
        'Text::Wrap'          => 2009.0305,
        'Exception::Class'    => 0,
        'Bio::Root::Root'     => 0
    },
    configure_requires  =>
    {
      'Module::Build'     => 0.38
    },
    auto_features       =>
    {
      graphing =>
      {
        description => 'Use GD::Graphics to draw graphs',
        requires    =>
        {
          'GD::Graph::lines'  => 1.15,
          'GD::Graph::colour' => 1.10,
          'GD::Image'         => 0
        }
      },
    },
    script_files =>
    [
      'bin/GD_Filter_Enzymes.pl',
      'bin/GD_Generate_RSCU_Table.pl',
      'bin/GD_Graph_Dotplot.pl',
      'bin/GD_Juggle_Codons.pl',
      'bin/GD_Reverse_Translate.pl',
      'bin/GD_Sequence_Subtraction.pl',
      'bin/GD_Graph_RSCU_Values.pl'
    ],
    get_options =>
    {
      like_last_time =>
      {
        store => \$llt,
        default => 0,
      },
      conf_path =>
      {
        store => \$cpath,
        type => '=s',
      },
      script_path =>
      {
        store => \$spath,
        type => '=s',
      },
      tmp_path =>
      {
        store => \$tpath,
        type => '=s',
      },
      graphing_support =>
      {
        store => \$g,
        type => '=s',
      },
    }
);

if ($llt == 0)
{
  if (! $cpath)
  {
    $cpath = prompt('Where should configuration files be installed?', $dcpath);
  }
  if (! $spath)
  {
    $spath = prompt('Where should scripts be installed?', $dspath);
  }
  if (! $tpath)
  {
    $tpath = prompt('Where should GeneDesign write tmp files?', $dtpath);
  }
  if (! $g && $GDB->feature('graphing'))
  {
    $g = y_n('Enable GD::Graphics support?', $dg);
  }
}
else
{
  $cpath = $cpath || $dcpath;
  $tpath = $tpath || $dtpath;
  $spath = $spath || $dspath;
  $g = $g || $dg;
}

$GDB->config_data(conf_path => $cpath);
$GDB->config_data(tmp_path => $tpath);
$GDB->config_data(script_path => $spath);
$GDB->config_data(graphing_support => $g) if ($GDB->feature('graphing'));

#Prepare configuration directory
my $tcp = $GDB->config_data('conf_path');
$GDB->config_data(conf_path => $tcp);
my $confs =
[
  'codon_tables/arabidopsis_thaliana.rscu',
  'codon_tables/Bacillus_subtilis.rscu',
  'codon_tables/Caenorhabditis_elegans.rscu',
  'codon_tables/Cglut.rscu',
  'codon_tables/Deinococcus_radiodurans.rscu',
  'codon_tables/Drosophila_melanogaster.rscu',
  'codon_tables/Escherichia_coli.rscu',
  'codon_tables/Flat.rscu',
  'codon_tables/Homo_sapiens.rscu',
  'codon_tables/Mycoplasma_genitalium.ct',
  'codon_tables/Mycoplasma_genitalium.rscu',
  'codon_tables/oryza_sativa.rscu',
  'codon_tables/Saccharomyces_cerevisiae.rscu',
  'codon_tables/Standard.ct',
  'codon_tables/yeast.rscu',
  'enzymes/all_enzymes',
  'enzymes/blunts',
  'enzymes/IIB',
  'enzymes/nonpal',
  'enzymes/nonpal_short',
  'enzymes/nonpal_and_IIB',
  'enzymes/outside',
  'enzymes/standard',
  'enzymes/standard_and_IIB',
  'enzymes/test',
];
$GDB->add_build_element('GeneDesign');
process_conf_files($GDB, $confs);
$GDB->install_path(GeneDesign => $GDB->config_data('conf_path'));
print 'Configuration files will be in ', $GDB->config_data('conf_path'), "\n";

$GDB->install_path(script => $GDB->config_data('script_path'));
print 'Scripts will be in ', $GDB->config_data('script_path'), "\n";

print 'Temporary files will be written to ', $GDB->config_data('tmp_path'), "\n";

print "\n";

$GDB->create_build_script();

print "\n";

sub process_conf_files
{
  my $build = shift;
  my $files = shift;
  return unless $files;

  my $conf_dir = File::Spec->catdir($build->blib, 'GeneDesign');
  File::Path::mkpath( $conf_dir );

  foreach my $file (@{$files})
  {
    my $result = $build->copy_if_modified($file, $conf_dir) or next;
    $build->fix_shebang_line($result) unless $build->is_vmsish;
  }
  return;
}

sub y_n
{
  my ($mess, $def) = @_;
  croak "Invalid default value: y_n() default must be 'y' or 'n'"
    if $def && $def !~ m{^[yn]}msix;

  my $answer;
  while (1)
  {
    $answer = prompt($mess, $def);
    return 'Y' if $answer =~ m{^y}msix;
    return 'N' if $answer =~ m{^n}msix;
    local $| = 1;
    print "\t _ Please answer 'Y' or 'N'. _ \n";
  }
  return;
}

sub prompt
{
  my ($mess, $d) = @_;
  croak 'prompt() called without a prompt message' unless ($mess);

  # use a list to distinguish a default of undef() from no default
  my @def = $d  ? ($d) : ();
  # use dispdef for output
  my @dispdef = scalar(@def) ?
    ('[ ', (defined $def[0] ? $def[0] . q{ } : q{}), ']') :
    (q{ }, q{});

  local $| = 1;
  print "$mess ", @dispdef, q{ };

  my $ans = <STDIN>;
  chomp $ans if defined $ans;
    #  Ctrl-D or unattended   User hit return
  if ( ! defined $ans || ! length $ans )
  {
    $ans = scalar(@def) ? $def[0] : q{};
  }

  return $ans;
}
