#! /usr/bin/env perl

# $Id$

#use lib '/home/yamada/prj/panstarrs/mops/src';

use warnings;
use strict;

use Getopt::Long;
use Pod::Usage;
use FileHandle;

use PS::MOPS::DET::table;
use PS::MOPS::DET::util;
use PS::MOPS::Lib qw(:all);
use PS::MOPS::DC::Field;

my $help;
my $force = 0;
my $source_suffix = '.txt';
my $target_suffix = '.fits';
my $source_prefix = '';
my $target_prefix = '';
my $obscode = '568';
my $limiting_mag = 24.0;
my $mjd;

GetOptions(
	force => \$force,
    help => \$help,
	'source_prefix=s' => \$source_prefix,
	'source_suffix=s' => \$source_suffix,
	'prefix=s' => \$target_prefix,
	'suffix=s' => \$target_suffix,
    'obscode=s' => \$obscode,
    'limiting_mag=f' => \$limiting_mag,
    'mjd=f' => \$mjd,
) or pod2usage(2);                      # opts parse error
pod2usage(-verbose => 3) if $help;      # user asked for help

if ( $#ARGV < 0 ) {
	pod2usage(2);
	exit
}

#
# Read the field file, and store the value in a hash, using the
# column title as a key.
#

sub rdfield
{
}


#
# Open a detections file, and read the first line, which is expected to
# be a field description.
#

sub openfield
{
    # Return a list of all obs records that match our selectors, sorted by
    # expMJD.  First line of the file should be a header line, which we'll use
    # to create hash keys.
	my ($detfile ) = @_;
    my $fh = new FileHandle $detfile or die "Cannot open $detfile";
    my @fields;
    my $line;

    # First line contains tab-delimited mysql fields.
	my $fields_line = <$fh>;
    chomp $fields_line;
    my @field_names = split /\s+/, $fields_line;

    while (defined($line = <$fh>)) {
        chomp $line;
        my @vals = split /\s+/, $line;
        my %cols;
        @cols{@field_names} = @vals;

        next if $cols{expTime} > 60;            # skip if large exposure time (medium-deep field)

        if (!defined($mjd) or $mjd == int($cols{expMJD})) {
            push @fields, {
                field_id => $cols{obsHistID}, 
                epoch_mjd => $cols{expMJD}, 
                ra_deg => $cols{fieldRA}, 
                dec_deg => $cols{fieldDec}, 
                survey_mode => $cols{'drm'}, 
                time_start => $cols{expMJD} - $cols{expTime} / 86400 / 2,
                time_stop => $cols{expMJD} + $cols{expTime} / 86400 / 2, 
                filter_id => $cols{filter}, 
                limiting_mag => $limiting_mag,
                ra_sigma_deg => 0,
                dec_sigma_deg => 0,
                obscode => $obscode, 
                de1 => 0,
                de2 => 0,
                de3 => 0,
                de4 => 0,
                de5 => 0,
                de6 => 0,
                de7 => 0,
                de8 => 0,
                de9 => 0,
                de10 => 0,
                ocnum => mopslib_mjd2ocnum($cols{expMJD}), 
                status => $FIELD_STATUS_FALSEDETECTIONS,
            };
        }   # if
    }   # while
    close $fh;
    printf STDERR "Found %d matching fields.\n", scalar @fields;
    return sort { $a->{epoch_mjd} <=> $b->{epoch_mjd} } @fields;
}

#
# Read a single line from a detections file, and return an array of
# values.
#

sub rddet
{
	my ( $fh ) = @_;

	my $input_line = <$fh>;
	unless (defined $input_line) {
		return;
	}

	chomp $input_line;
	my ($det_id, $field_id, $ra_deg, $dec_deg, $epoch_mjd, $mag, $ref_mag, 
		$flux, $filter, $s2n, $ra_sigma_deg, $dec_sigma_deg, $mag_sigma,
		$flux_sigma, $orient_deg, $orient_sigma_deg,
		$length_deg, $length_sigma_deg,
		$object_name, $obscode, $is_synthetic,
		$status) = split(/\s+/, $input_line);

	return (
		det_id => $det_id,
		field_id => $field_id,
		ra_deg => $ra_deg,
		dec_deg => $dec_deg,
		epoch_mjd => $epoch_mjd,
		mag => $mag,
		ref_mag => $ref_mag,
		flux => $flux,
		filter => $filter,
		s2n => $s2n,
		ra_sigma_deg => $ra_sigma_deg,
		dec_sigma_deg => $dec_sigma_deg,
		flux_sigma => $flux_sigma,
		orient_deg => $orient_deg,
		orient_sigma_deg => $orient_sigma_deg,
		length_deg => $length_deg,
		length_sigma_deg => $length_sigma_deg,
		object_name => $object_name,
		obscode => $obscode,
		is_synthetic => $is_synthetic,
		status => $status,
	);
}

#
# Close a detections file.
#

sub closedet
{
	my ( $fh ) = @_;

	close($fh);
}

sub process
{
	my ($src) = @_;
	print STDERR "Reading all fields from $src.\n";
	my @fields = openfield($src);

    foreach my $field (@fields) {
        my $id = $field->{field_id};
        my $dest = (sprintf "%012d", $field->{field_id}) . ".fits";
        my $p = new PS::MOPS::DET::table;
        my $epoch = ($field->{'time_start'} + $field->{'time_stop'}) / 2.0; 
        $p->createfile($dest, $force,
            'FPA_ID' => $field->{'field_id'},
            'MJD-OBS' => $epoch,
            'RA' => PS::MOPS::DET::util::DDtoHMS($field->{'ra_deg'}),
            'DEC' => PS::MOPS::DET::util::DDtoDMS($field->{'dec_deg'}),
            'EXPTIME' => $field->{'time_stop'} - $field->{'time_start'},
            'ROTANGLE' => 0.0,
            'FILTER' => $field->{'filter_id'},
            'STARPSF' => 0.0,
            'LIMITMAG' => $field->{'limiting_mag'},
            'DE1' => $field->{'de1'},
            'DE2' => $field->{'de2'},
            'DE3' => $field->{'de3'},
            'DE4' => $field->{'de4'},
            'DE5' => $field->{'de5'},
            'DE6' => $field->{'de6'},
            'DE7' => $field->{'de7'},
            'DE8' => $field->{'de8'},
            'DE9' => $field->{'de9'},
            'DE10' => $field->{'de10'},
            'OBSCODE' => $field->{'obscode'},
            'TEL_ALT' => 0.0,
            'TEL_AZ' => 0.0);

        $p->closefile();
        print STDERR "wrote $dest ($epoch).\n";
    }
}

process($_) foreach @ARGV;
exit;

__END__

=head1 NAME

rawToDetectionsFile - Convert text detections file to FITS format

=head1 SYNOPSIS

rawToDetectionsFile RAWFILE [RAWFILE [...]]

=head1 OPTIONS

=over 4

=item --force

Overwrite existing files.

=item --prefix=PREFIX

Used to generate the output file name from an input file name.  The
prefix is prepended to the file name.  The default value is an empty
string.

=item --source_prefix=SOURCEPREFIX

Used to generate the output file name from an input file name.  The
source prefix is removed from the input file name.  The default value
is an empty string.
 
=item --suffix=SUFFIX

Used to generate the output file name from an input file name.  The
suffix is appended to the file name.  The default value is ".fits".

=item --source_suffix=SOURCE_SUFFIX

Used to generate the output file name from an input file name.  The
source suffix is removed from the input file name.  The default value
is ".txt".

=back

=head1 ARGUMENTS

=over 4

=item RAWFILE

Input data file.

=item FITSFILE

Output fits file.

=back

=head1 DESCRIPTION

Convert a raw text description of a detection file (as generated by
createFalseRaw) and convert it to a FITS table file, appropriate for
submitting to the data store.

=head1 ENVIRONMENT VARIABLES

=head1 TO DO

=head1 BUGS

=cut
