#!/usr/bin/env perl

#
# Copy stack inputs to the current directory
#

use warnings;
use strict;

use DBI;
use constant DB_SOCKET => '/var/run/mysqld/mysqld.sock'; # Socket for mysql

# Extensions of the path_base to grab
use constant EXTENSIONS => { 'IMAGE' => '.fits', # Image
                             'MASK' => '.mask.fits', # Mask
                             'VARIANCE' => '.wt.fits', # Variance
                             'SOURCES' => '.cmf', # Sources
                             'PSF' => '.psf', # PSF
                         };

use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );

my ($db_host, $db_name, $db_user, $db_pw); # Database details
my ($stack_id);                 # Stack of interest
my ($input);                    # Input list
my ($muggle);                   # No magicked inputs?

GetOptions(
           'dbhost=s' => \$db_host, # Database host name
           'dbname=s' => \$db_name, # Database name
           'dbuser=s' => \$db_user, # Database user
           'dbpass=s' => \$db_pw, # Database p/w
           'stack_id=s' => \$stack_id, # Stack identifier
           'input=s'  => \$input, # Input list to generate
           'muggle'   => \$muggle, # No magicked inputs?
           ) or die "Unable to parse arguments.\n";
die "Unknown option: @ARGV\n" if @ARGV;
die "Required options: --dbhost --dbname --dbuser --dbpass --stack_id\n"
    unless defined $db_host
    and defined $db_name
    and defined $db_user
    and defined $db_pw
    and defined $stack_id;

# Database connection
my $db = DBI->connect( "DBI:mysql:database=$db_name;host=$db_host;mysql_socket=" . DB_SOCKET(),
                       $db_user,
                       $db_pw,
                       { RaiseError => 1, AutoCommit => 1 }
                       ) or die "Unable to connect to database: $DBI::errstr";

# Query to run
my $sql = "SELECT warpSkyfile.path_base" .
    " FROM stackRun" .
    " JOIN stackInputSkyfile USING(stack_id)" .
    " JOIN warpSkyfile USING(warp_id, skycell_id)" .
    " WHERE stack_id = $stack_id";

# List of warps
my $warps = $db->selectcol_arrayref( $sql,
                                     { Columns => [1] }
                                     ) or die "Unable to execute SQL: $DBI::errstr";
$db->disconnect;

my $list;                       # List of inputs
if (defined $input) {
    open $list, "> $input";
    print $list "INPUT MULTI\n\n";
}

foreach my $warp_path ( @$warps ) {
    print $list "INPUT METADATA\n" if defined $input;
    foreach my $type ( keys %{EXTENSIONS()} ) {
        my $path = $warp_path;
        if (defined $muggle and $type ne "PSF") {
            my @warp = split /\//, $warp_path;
            my $last = pop @warp;
            push @warp, "SR_$last";
            $path = join '/', @warp;
        }
        my $ext = ${EXTENSIONS()}{$type}; # Extension
        my $file = "$path$ext"; # File
        my $source = `ipp_datapath.pl $file` or die "Unable to locate $file\n"; # Resolved file name
        chomp $source;
        my ($target) = $source =~ m|^.*[:/](.*)|; # Target name
        !system "cp $source $target" or die "Unable to copy $source\n";
        print $list "\t$type\tSTR\t$target\n" if defined $input;
    }
    print $list "\tWEIGHTING\tF32\t1.0\nEND\n\n" if defined $input;
}

