#!/usr/bin/perl -w

use strict;

use Test::More tests => 9;

use DateTime;
use DateTime::SpanSet;
use DateTime::Event::Recurrence;

sub str { ref($_[0]) ? $_[0]->datetime : $_[0] }
sub span_str { str($_[0]->min) . '..' . str($_[0]->max) }

{
    # INTERSECTION

    my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
                           hour => 12, minute => 10, second => 45,
                           nanosecond => 123456,
                           time_zone => 'UTC' );

    my $r1 = yearly DateTime::Event::Recurrence ( 
        months =>  [ 10, 14 ],
        days =>    [ 15 ],
        hours =>   [ 14 ],
        minutes => [ 15 ] );
    my $r2 = daily DateTime::Event::Recurrence (
        hours =>   [ 10, 14 ],
        minutes => [ 15 ] );

    my $dt;

    my $r = $r1->intersection( $r2 );

    $dt = $r->next( $dt1 );
    is ( $dt->datetime, '2003-10-15T14:15:00', 'next intersection' );
    $dt = $r->next( $dt );
    is ( $dt->datetime, '2004-10-15T14:15:00', 'next intersection' );
    $dt = $r->next( $dt );
    is ( $dt->datetime, '2005-10-15T14:15:00', 'next intersection' );
}

{
    # NO-INTERSECTION

    my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
                           hour => 12, minute => 10, second => 45,
                           nanosecond => 123456,
                           time_zone => 'UTC' );

    my $r1 = yearly DateTime::Event::Recurrence (
        months =>  [ 10, 14 ],
        days =>    [ 15 ],
        hours =>   [ 14 ],
        minutes => [ 15 ] );

    my $r2 = daily DateTime::Event::Recurrence (
        hours =>   [ 11, 15 ],
        minutes => [ 15 ] );

    my $dt;

    my $r = $r1->intersection( $r2 );

    $dt = $r->next( $dt1 );
    is ( $dt, undef, 'next no-intersection' );
}


{
    # BUILD SPAN-SET

    my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
                           hour => 12, minute => 10, second => 45,
                           nanosecond => 123456,
                           time_zone => 'UTC' );

    my $r1 = yearly DateTime::Event::Recurrence (
        months =>  [ 9, 11 ],
        days =>    [ 15 ],
        hours =>   [ 14 ] );

    my $r = DateTime::SpanSet->from_set_and_duration(
          set => $r1,
          hours => 1,
       );

    my $span;
    my $s;

    # test Set
    my $iterator =
        $r1->intersection( DateTime::Span->new( after => $dt1 ) )
          ->iterator;
    $span = $iterator->next;
    $s = str( $span );
    is ( $s, '2003-09-15T14:00:00', 'next set' );
    $span = $iterator->next;
    $s = str( $span );
    is ( $s, '2003-11-15T14:00:00', 'next set' );

    # test SpanSet
    $iterator = 
        $r->intersection( DateTime::Span->new( after => $dt1 ) )
          ->iterator;
    $span = $iterator->next;
    $s = span_str( $span );  
    is ( $s, '2003-09-15T14:00:00..2003-09-15T15:00:00', 'next span-set' );
    $span = $iterator->next;
    $s = span_str( $span );
    is ( $s, '2003-11-15T14:00:00..2003-11-15T15:00:00', 'next span-set' );

}

{
    # INTERSECTION TO SPAN-SET

    my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
                           hour => 12, minute => 10, second => 45,
                           nanosecond => 123456,
                           time_zone => 'UTC' );

    my $r1 = yearly DateTime::Event::Recurrence (
        months =>  [ 10, 14 ],
        days =>    [ 15 ],
        hours =>   [ 14 ] );

    my $rs1 = DateTime::SpanSet->from_set_and_duration( 
          set => $r1,
          hours => 1, 
       );

    my $r2 = daily DateTime::Event::Recurrence (
        minutes => [ 15 ] );

    my $dt;

    my $r = $r2->intersection( $rs1 );

    $dt = $r->next( $dt1 );
    is ( $dt, undef, 'next intersection to span-set' );
}