#!/usr/bin/perl

use strict;
use warnings;

use DateTime;
use DateTime::Set;
use Data::ICal::DateTime;
use DateTime::Event::Recurrence;
use LWP::Simple;
use Data::Dumper;

my $daycount = 12;

my $min = DateTime->now->truncate( to => 'year' )->subtract( years => 1 );
my $max = $min->clone->add( years => 3 );

# Used a recurrence rather than this .. so we can set the start and end
#my $every_day = DateTime::Event::Recurrence->daily;

my $every_day = DateTime::Set->from_recurrence(
	recurrence => sub {
		return $_[0] if $_[0]->is_infinite;
		return $_[0]->truncate( to => 'day' )->add( days => 1 )
	},
	span => DateTime::Span->from_datetimes( start => $min, end => $max )
);

my $weekends  = DateTime::Event::Recurrence->weekly(
	days => [6,7]
);


my $public_holiday_ical = Data::ICal->new(
	# Melbourne public holidays
	data => get('http://www.google.com/calendar/ical/5be1qvd6221bpn0jknc1210qe4%40group.calendar.google.com/public/basic.ics')
);
my @events = $public_holiday_ical->events();

my $public_holidays = DateTime::Set->from_datetimes(
	dates => [
		map { $_->start }
		# We only want those that are actually public holidays
		grep { $_->property('description')->[0]->value eq 'Public Holiday' }
		@events
	]
);

my $business_days = $every_day->complement( $public_holidays );
$business_days = $business_days->complement( $weekends );

my $dt = DateTime->now;
for( 1 .. $daycount ){
	$dt = $business_days->next( $dt );
	print "$_ business days from now is $dt\n";
}

