#!/usr/bin/env perl

use strict;

use Test::More tests => 2 + 6;

use Astro::Coords;
use Astro::Coords::Offset;
use Astro::PAL;
use Starlink::AST;

our $plot = 0; # Plot for debugging purposes.

use_ok('Starlink::ATL::Region');


# Set up test scenario.

my $skyframe = Starlink::AST::SkyFrame->new('SYSTEM=FK5');
my $basepos = Astro::Coords->new(
    ra => '14:30:00', dec => '+36:15:00',
    type => 'J2000', units => 'sexagesimal');

prepare_plot() if $plot;


# Construct 3 regions and merge them.

my @regions;
foreach my $off ([0, 0], [60, 0], [0, 60]) {
    my $coord = $basepos->apply_offset(Astro::Coords::Offset->new(
        @$off,
        'system' => 'J2000',
        projection =>'TAN'));
    push @regions, Starlink::AST::Circle->new(
        $skyframe, 1,
        [map {$_->radians()} $coord->radec2000()],
        [Astro::PAL::DAS2R * 60], undef, '');
}

my $merged = Starlink::ATL::Region::merge_regions(\@regions);

ok('Starlink::AST::CmpRegion' eq ref $merged);

plot_region($merged, 4) if $plot;


# Check a series of points are inside/outside the merged region.

my %title = (1 => 'no overlap with region', 2 => 'inside region');

foreach ([0, 0, 2], [60, 0, 2], [0, 60, 2],
        [-80, 0, 1], [0, -80, 1], [80, 80, 1]) {
    my @off = @$_;
    my $coord = $basepos->apply_offset(Astro::Coords::Offset->new(
        @off[0, 1],
        'system' => 'J2000',
        projection =>'TAN'));

    my $region = Starlink::AST::Circle->new(
        $skyframe, 1,
        [map {$_->radians()} $coord->radec2000()],
        [Astro::PAL::DAS2R * 10], undef, '');

    plot_region($region, 1) if $plot;

    is($region->Overlap($merged), $off[2], 'position ' . join(', ', @off[0, 1]) .
            ' ' . $title{$off[2]});
}


# Prepare a PGPLOT display.

sub prepare_plot {
    my $fchan = Starlink::AST::FitsChan->new();
    foreach (
            'NAXIS1  = 1000',
            'NAXIS2  = 1000 ',
            'CRPIX1  = 500 ',
            'CRPIX2  = 500',
            'CRVAL1  = ' . $basepos->ra(format => 'deg'),
            'CRVAL2  = ' . $basepos->dec(format => 'deg'),
            'CTYPE1  = \'RA---TAN\'',
            'CTYPE2  = \'DEC--TAN\'',
            'CD1_1   = ' . 360 * Astro::PAL::DAS2R * Astro::PAL::DR2D / 1000,
            'CD2_2   = ' . 360 * Astro::PAL::DAS2R * Astro::PAL::DR2D / 1000,
            'RADESYS = \'FK5\'',
            ) {$fchan->PutFits($_, 0);}
    $fchan->Clear('Card');
    my $wcs = $fchan->Read();
    require PGPLOT;
    require Starlink::AST::PGPLOT;

    my $pgdev = PGPLOT::pgopen('/xserve');
    PGPLOT::pgwnad(0, 1, 0, 1);
    PGPLOT::pgqwin(my $x1, my $y1, my $x2, my $y2);

    $plot = Starlink::AST::Plot->new(
        $wcs, [0.0, 0.0, 1.0, 1.0],
        [0.5, 0.5, 1000.5, 1000.5],
        'Grid=1,tickall=0,border=1,tol=0.001'
        . ',colour(border)=4,colour(grid)=3,colour(ticks)=3'
        . ',colour(numlab)=5,colour(axes)=3');
    $plot->pgplot();
    $plot->Grid();
    $plot->Set('System=FK5');

    return $plot;
}


# Plot a given region.

sub plot_region {
    my ($region, $color) = @_;

    my $fitswcsb = $plot->Get('Base');
    my $fitswcsc = $plot->Get('Current');

    my $fs = $plot->Convert($region, '');
    $plot->Set('Base='.$fitswcsb);
    my $map = $fs->GetMapping(
        Starlink::AST::AST__BASE(),
        Starlink::AST::AST__CURRENT());
    $plot->AddFrame(Starlink::AST::AST__CURRENT(), $map, $region);
    $plot->Set('colour(border)=' . $color);
    $plot->Border();

    my $current = $plot->Get('Current');
    $plot->RemoveFrame($current);
    $plot->Set('Current='.$fitswcsc);
}
