#!/usr/bin/perl

# The home directory on the pgN machines
#$HOME="/san_solar/disk2/home/sbukeis";
#$WORK="/san_solar/disk3/work/eis";

# 20080821 mcrw - changed for new machine
#$HOME="/home/sbukeis";
#$WORK="/nasA_solar1/work/eis";

# 20130902 mcrw - changed for rfsb1
#$HOME="/nasA_solar1/home/sbukeis";
$HOME="/home/sbukeis";
$HOME_BIN = "$HOME" . "/bin";
$HOME_TMP = "$HOME" . "/tmp";

#$WORK="/nasA_solar1/work/eis";
$WORK="$HOME" . "/work";

# Local stuff
###$eis_local    = "$HOME/work";
$eis_local    = "$WORK";

# Root local telemetry directory
$sdtp = "$eis_local" . "/localdata/sdtp";

# The directory where telemetry files got by daily_merge.pl are temporarily written
$merge_dir = "$sdtp" . "/merge";

# Pipeline log
#$pipeline_log = "$eis_local/localdata/log/pipeline/pipeline_log.txt";
$pipeline_log = "$eis_local" . "/localdata/log/pipeline";

# Shutter open/close log
$shutter_log = "$eis_local" . "/localdata/log/shutter/shutter.txt";

# Pipeline directories
$eis_pipeline = "$eis_local" . "/localdata/pipeline";
$temp_fits    = "$eis_pipeline" . "/fits";
$temp_idl     = "$eis_pipeline" . "/idl";
$temp_plots   = "$eis_pipeline" . "/plots";
$temp_temp_fits  = "$eis_pipeline" . "/temp_fits";
$temp_temp_fits1 = "$eis_pipeline" . "/temp_fits1";

# Split file check
$split_file_check = "$HOME_BIN" . "/ccsds_merge_md_split_check";
$split_file_check_files = "$merge_dir" . "md_split_check.txt";

# Mission join directory
$mission_join_directory = "$HOME_TMP" . "/join";
$join = "$HOME_BIN" . "/md_join_merge.py";
$joined_files = "$merge_dir" . "/joined_files.txt";

# Mission header dump
$md_hdr_dump = "$HOME_BIN" . "/pipeline_md_hdr_dump";
$md_hdr_check = "$merge_dir" . "/md_hdr_check.txt";

# Ccsds check
$ccsds_check = "$HOME_BIN" . "/pipeline_ccsds_check";
$ccsds_check_file = "$merge_dir" . "ccsds_hdr_check.txt";

# Missing packets file
$missing_packets = "$merge_dir" . "/missing_packets.txt";

# Headless packets
$headless_packets = "$merge_dir" . "headless_packets.txt";

# Incomplete files
$incomplete_packets = "$merge_dir" . "/incomplete_packets.txt";
$incomplete = "$merge_dir" . "/incomplete";
$nursery = "$merge_dir" . "/nursery";

# Sequence counts file
$sequence_counts = "$merge_dir" . "/sequence_counts.txt";

# Pass list directory
$pass_list_dir = "$eis_local" . "/pass_list";

# Orl list directory
$orl_dir = "$eis_local" . "/orl_list";

$drl_dir = "$eis_local" . "/dr_list";

# Orbit events list directory
$obev_dir = "$eis_local" . "/orbit_events";

# Status pending file
$status_pending = "$HOME" . "/track/status_pending.txt";

# Last status reformat file
$status_reformat_date = "$HOME" . "/track/latest_status_reformat.txt";

# Mission pending file
$mission_pending = "$HOME" . "/track/mission_pending.txt";

# List of received files
$received_files = "$merge_dir" . "/received_files.txt";

# Where sswidl is on the pgN machines
$sswidl = "/san_darts/solar/ssw/gen/setup/ssw_idl";
$ssw_idl = "$HOME/ssw_idl";

# Local idl routines
$local_idl = "$eis_local" . "/idl";

# Quicklook area on pg4
$ql_mission      = "$sdtp" . "/md";
$ql_status       = "$sdtp" . "/status";
$ql_mission_fits = "$sdtp" . "/fits/mission";
$ql_status_fits  = "$sdtp" . "/fits/status";
$ql_status_plots = "$sdtp" . "/plots";

# The directory where rescued incomplete files are put
$rescue_dir = "$merge_dir" . "/rescue";

# Orphans
$orphans_dir = "$merge_dir" . "/orphans";

# The DARTS root directory
$darts   = "$HOME" . "/data";
$staging = "$darts" . "/staging";

# The logs directory
$logs_directory = "$staging" . "/logs";

# Quicklook area on DARTS
$darts_quicklook  = "$darts" . "/quicklook";
$darts_mission_ql = "$darts_quicklook" . "/mission";
$darts_status_ql  = "$darts_quicklook" . "/status";

# The mission branch
$darts_mission = "$darts" . "/mission";

# The status branch
$darts_status = "$darts" . "/status";

# The staging area
$darts_staging = "$darts" . "/staging";

# The new merge telemetry DARTS area
$soda_darts = "/soda/hinode/eis";

# The new mission branch
$soda_darts_mission = "$soda_darts" . "/level0";

# The new status branch
$soda_darts_status = "$soda_darts" . "/status";

# Scratch area for spliced md archives (created by ccsds_md_splice)
$splice_dir = "$sdtp" . "/md/scratch";

# Decompression directory
$decompression_directory = "$merge_dir" . "/decompressed";

# Decompression track
# Decompression directory
$pd_decompression_dir = "$eis_local" . "/localdata/log/decompression";

# Monthly records
$pd_monthly_records = "$pd_decompression_dir" . "/monthly/records";

# Monthly track
$pd_monthly_tracks = "$pd_decompression_dir" . "/monthly/track";

# Running average
$pd_type_average = "$pd_decompression_dir" . "/factors";

# Decompression record
$pd_record_name = "merge_decomp_record";

# Add text argument
sub pipeline_exit {
    my $pipeline = shift;
    my $exit_code = shift;

    print LOG "\n Exiting with code: $exit_code ---------\n\n";
    close LOG;
 
    print MLOG scalar(localtime), " (JST) finished (code: $exit_code).\n";
    print MLOG "---------\n\n";
    close MLOG;

    system("/bin/cp $pipeline_log/pipeline_log.txt $staging/logs/")        if(($pipeline eq "mission") || ($pipeline eq "status"));
    system("/bin/cp $pipeline_log/pipeline_log_rescue.txt $staging/logs/") if($pipeline eq "rescue");
#    system("/bin/cp $pipeline_status_log $staging/logs/pipeline_status")   if($pipeline eq "status");
#    system("/bin/cp $pipeline_mission_log $staging/logs/pipeline_mission") if($pipeline eq "mission");
    system("/bin/mv $pipeline_status_log $staging/logs/pipeline_status")   if($pipeline eq "status");
    system("/bin/mv $pipeline_mission_log $staging/logs/pipeline_mission") if($pipeline eq "mission");
    system("/bin/cp $pipeline_mission_rescue_log $staging/logs/pipeline_mission/rescue") if($pipeline eq "rescue");

    exit $exit_code;
}

sub pipeline_die {
    my $pipeline = shift;
    my $code = shift;
    my $str = shift;

    print MLOG "$str\n";
    pipeline_exit($pipeline, $code);
}

sub date_to_natural_lang {
    my $year = shift;
    my $month = shift;

    my @months = ('','January','February','March','April','May','June','July','August','September','October','November','December');

    return "$months[$month] " . "$year";
}

sub stage_title {
    my $fh  = shift;
    my $int = shift;
    my $str = shift;
    my $ct  = scalar(localtime);
    my $cts = "$ct (JST) - ";

    print STDOUT "$cts" . "$str\n" if $int eq "interactive";
    print $fh    "\n$cts" . "$str\n";
}

sub perform {
    my $fh  = shift;
    my $int = shift;
    my $str = shift;

    log_msg($fh, $int, $str);
    system("$str");
}

sub log_msg {
    my $fh   = shift;
    my $mode = shift;
    my $msg  = shift;

    print STDOUT "$msg\n" if $mode eq "interactive";
    print $fh  "\t$msg\n";
}

sub gen_fh {
    my $fh = shift;
    return sub { $fh; };
}

sub logger {
    my $stdout = shift;
    my $fh = shift;
    if($stdout == 1) {
	return sub {
	    my $msg = shift;
	    print STDOUT "$msg\n";
	    print $fh "$msg\n";
	};
    }
    return sub {
	my $msg = shift;
	print $fh "$msg\n";
    };
}

# Return the (log, perform, title) functions for interactive or cron modes
#sub init_logger {
sub init_log_and_perform {
    my $filehandle = shift;
    my $state      = shift;
    my $fh = gen_fh($filehandle);
    my $out_fh = ($state eq "interactive") ? 1 : 0;
    my $log_it = logger($out_fh, $filehandle);
    return ( 
	     sub {
		 my $msg = shift;
		 &$log_it("\t" . $msg);
	     },
	     sub {
		 my $cmd = shift;
		 &$log_it("\t" . $cmd);
		 system($cmd);
	     },
	     sub {
		 my $title = shift;
		 &$log_it($title);
	     });
}

sub eng_path {
    my $type = shift;

    return "/cal/dark/long/"        if $type eq "Long Darks";
    return "/cal/dark/short/"       if $type eq "Short Darks";
    return "/cal/flat/long/"        if $type eq "Long Flats";
    return "/cal/flat/short/"       if $type eq "Short Flats";
    return "/cal/flat/EUV/"         if $type eq "EUV";
    return "/cal/adc/"              if $type eq "ADC Offset";
    return "/cal/intensity/"        if $type eq "Intensity Calibration";
    return "/cal/dark/bottom_100s/"      if $type eq "Dark Bottom";
    return "/cal/dark/top_100s/"         if $type eq "Dark Top";
    return "/cal/dark/bottom_0s/"      if $type eq "Dark Bottom 0s";
    return "/cal/dark/top_0s/"         if $type eq "Dark Top 0s";
    return "/cal/flat/overscan/"    if $type eq "Flat Oscn";
#    return "/cal/alignment/"	    if $type eq "Pointing and Alignment";
    return "/cal/dark/reduced_long/" if $type eq "Reduced Long";
    return "/cal/dark/prescan/"      if $type eq "Dark Prescan";
    return "/cal/dark/0s_100s/"	     if $type eq "Dark Daily";
    return "/cal/flat/1exp_100ms/"    if $type eq "1exp_100ms";
    return "/cal/flat/2exps_80ms/"    if $type eq "2exps_80ms";
    return "/unknown/";
}

sub html_header {
    my $title = shift;

    my $hdr;

    $hdr = <<HERE;
    <!--
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    -->
      
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      
    <head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="stripe.js"></script>

    <title>
    $title
    </title>

    </head>
HERE
return $hdr;
}

sub html_end {
    print "</body>\n</html>\n";
}

1;
