#!perl

# Test that we can read a JCMT catalogue that is not rigid about its
# columns. Test simply creates a catalogue 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::Star' );
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 catalogue 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";