#!/usr/bin/env perl
#
#  create_newcase: Script to create a new case directory and run case script
#                  to configure, build, and run CLM.
# 
## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
## NOTE: FOR PRODUCTION RUNS -- USE THE create_newcase SCRIPT in ../../../../scripts!!!
## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
#
use strict;
use Cwd;
use English;
use Getopt::Long;
use IO::File;
use FileHandle;

my $cwd = getcwd();             # current working directory
my $ProgName;
($ProgName = $0) =~ s!(.*)/!!;  # name of program
my $ProgDir = $1;               # name of directory where program lives

my $script_template= "run-ibm.csh";
my $account    = " 93300006";

my $cfgdir;
if ($ProgDir) { 
    $cfgdir = $ProgDir;
} else {
    $cfgdir = $cwd;
}


my %opts = (
            case             => "clmrun",
            clmroot          => "$cfgdir/..",
            account          => "$account",
            script_template  => "$cfgdir/$script_template",
            dirofcases       => "$cfgdir",
            wrkdir           => undef,
            );

#-----------------------------------------------------------------------------------------------

sub usage {
    die <<EOF;
SYNOPSIS
     $ProgName [options]
OPTIONS
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   NOTE:   THIS SCRIPT IS DEPRECATED.
           FOR PRODUCTION RUNS -- USE THE create_newcase SCRIPT in ../../../../scripts!!!
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

     User supplied values are denoted in angle brackets (<>).  Any value that contains
     white-space must be quoted.  Single letter options may NOT be bundled.

     -case <casename>              Casename for this simulation. 
                                   (default $opts{case})
     -script_template <scriptname> Base script to use as template. 
                                   (default $opts{script_template})
     -dirofcases <directory>       Directory to create case directories under. 
                                   (default $opts{dirofcases})
     -wrkdir <directory>           Directory to put case run directories under.
                                   (default use setting from inside script_template)
     -account <account-number>     Job account number (for NCAR supercomputers). 
                                   (default $opts{account})
     -help                         Display help (this message)

EOF
}

#-----------------------------------------------------------------------------------------------



my $help = 0;

GetOptions(
    "account=s"                 => \$opts{'account'}, 
    "case=s"                    => \$opts{'case'}, 
    "script_template=s"         => \$opts{'script_template'}, 
    "dirofcases=s"              => \$opts{'dirofcases'}, 
    "wrkdir=s"                  => \$opts{'wrkdir'}, 
    "h|help"                    => \$help,
) or usage();

# Give usage message.
usage() if $help;

# Check for unparsed argumentss
if (@ARGV) {
    print "ERROR: unrecognized arguments: @ARGV\n";
    usage();
}

#
# Create the case directory, determine the script file name that will go there
#
my $casedir = "$opts{dirofcases}/$opts{case}";

if ( -d $casedir ) {
   print "Case directory $casedir already exists\n";
} else {
  if (! mkdir($casedir, 0777) ) {
    die <<"EOF";
** Could not create the specified case script directory: $casedir
EOF
  }
  print "Created case directory $casedir\n";
}

#
# Now create the script
#
my $infile  = "$opts{script_template}";
my $outfile = "$casedir/$opts{case}.csh";

my $infilename = $infile;
$infilename  =~ s!(.*)/!!;  # name of input script template file
print "Convert $infile script template\nTo case script: $outfile\n";

my   $infh = new IO::File;
my  $outfh = new IO::File;
  
$infh->open("<$infile")   or die "** can't open file: $infile\n";
$outfh->open(">$outfile") or die "** can't open file: $outfile\n";

while( $_ = <$infh> ) {
  # Account number
  if ( /(^.+) xxxxxxxx (.+$)/ ) {
    my $account = $opts{account};
    print $outfh "$1 $account # Project number to charge to\n";
  } elsif ( /set clmroot[ ]+ = / ) {
    my $clmroot = $opts{clmroot};
    print $outfh "set clmroot = $clmroot\n";
  } elsif ( /set case[ ]+ = / ) {
    my $case = $opts{case};
    print $outfh "set case = $case\n";
  } elsif ( defined($opts{wrkdir}) && /set wrkdir[ ]+ = / ) {
    my $wrkdir = $opts{wrkdir};
    print $outfh "set wrkdir  = $wrkdir\n";
  } elsif ( /set casdir[ ]+ = / ) {
    print $outfh "set casdir  = $casedir\n";
  } elsif ( /^(.*)$infilename(.*)$/ ) {
    while ( /^(.*)$infilename(.*)$/ ) {
       my $front = $1;
       my $back  = $2;
       my $outfilename = $outfile;
       $outfilename  =~ s!(.*)/!!;  # name of output file
       $_ = "${front}${outfilename}${back}";
    }
    print $outfh "$_\n";
  } else {
    print $outfh $_;
  }
}

$infh->close;
$outfh->close;

system( "chmod +x $outfile" );
print "Created $outfile\n";
print "\n\n\n$ProgName was successful. Edit $outfile as needed to customize case\n";
