#!perl

# Test that we can read a JCMT catalog that is not rigid about its
# columns. Test simply creates a catalog with random junk attached
# and then reads it in and compares target values.

use strict;
use Test::More tests => 13;

require_ok('Astro::Coords');
require_ok('Astro::Catalog::Item');
require_ok('Astro::Catalog');

# test sources
my @input = (
    {
        ra => '03:25:27.1',
        dec => '30:45:11',
        type => 'j2000',
        name => 'a space',
        comment => 'with comment'
    },
    {
        ra => '13:25:27.1',
        dec => '-30:45:11',
        type => 'b1950',
        name => 'test',
    },
    {
        long => '03:26:30.0',
        lat => '-1:45:0',
        type => 'galactic',
        name => 'gal 2',
    },
);

# Start by having some test coordinates
# convert test sources to Astro::Coords and randomly
my @ref = map {
    new Astro::Coords(units => 'sex', %$_);
} @input;

# Make sure we have constructed objects
for (@ref) {
    isa_ok($_, "Astro::Coords::Equatorial");
}

# Generate a catalog manually
my @lines = ("* a comment\n");
for my $c (@ref) {
    my $line = $c->name;
    my $ra = $c->ra(format => 's');
    my $dec = $c->dec( format => 's');
    $ra =~ s/:/ /g;
    $dec =~ s/:/ /g;

    $line .= "$ra $dec ";

    # Always RJ
    $line .= "rj ";

    if (rand(1) < 0.5) {
        # add some extra stuff
        my $vel = (rand(1)<0.5 ? "- 35." : "N/A");
        my $flux = (rand(1)<0.5 ? "42.4" : "n/a");
        my $range = 'n/a';
        my $frame = "LSR";
        my $veldef = "RADIO";
        my $comment = ($c->comment ? $c->comment : "ooh");

        $line .= " $vel $flux $range $frame $veldef $comment";
    }
    $line .= "\n";

    push(@lines, $line);
}

# Read the data array
my $cat = new Astro::Catalog(Format => 'JCMT', Data => \@lines);

# Get the source list and remove planets
my @sources = $cat->stars;
my @filter = grep {$_->coords->isa("Astro::Coords::Equatorial")} @sources;

is($#filter, $#ref, "Compare size");

# Now compare
for my $i (0..$#ref) {
    is($filter[$i]->id, $ref[$i]->name, "Compare names");
    ok($ref[$i]->distance( $filter[$i]->coords) < 0.1, "Compare distance");
}

# Write catalog to array so we can prepend test output with a #
my @output;
$cat->write_catalog(Format => 'JCMT', File => \@output);
print "# " . join("\n# ", @output) ."\n";
