#!  /usr/bin/perl

use strict;
use warnings;

# because of https
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

use Data::ICal;
use Data::ICal::DateTime;
use DateTime;
use HTTP::DAV;
use Digest::MD5 qw(md5_hex);
use Getopt::Long;

my ($doit,$verbose,$user,$pass,$base,$calendar);

use constant USAGEMSG =>  <<USAGE;
Usage: sup-double.pl --user <username> --pwd <password>  --base <base> [--doit|--verbose]
        --user  <username>   Login name for calendar account (required)
        --pwd   <password>   Password for account (required)
        --url   <base>       base url, ie https://sogo/SOGo
        --cal   <calendar>   name of calendar, default to personal
        --doit  <# of days>  do the job
        --v     be verbose
USAGE

die USAGEMSG unless GetOptions('user=s' => \$user,
                               'pwd=s'  => \$pass,
                               'url=s'  => \$base,
                               'cal=s'  => \$calendar,
										 'doit'   => \$doit,
									    'v'      => \$verbose);

# Check we have all the required values...
die USAGEMSG unless ($base && $user && $pass) ;

# without doit or verbose, do nothing, so exit now
die USAGEMSG unless ($doit || $verbose) ;

$calendar = 'personal' unless $calendar;

my ($url, $d, $cal, $calcontent);

$url = "$base/dav/$user/Calendar";

$d = new HTTP::DAV();

$d->credentials( -user=>$user, -pass =>$pass, -url => $url);
if (! $d->open( -url=> $url )) {
	print " erreur : " . $d->message . "\n";
	die;
}

if (! $d->get(-url => "$calendar.ics", -to => \$calcontent)) {
	print $d->message . "\n";
	die;
}

$cal = Data::ICal->new(data => $calcontent);
my @events = $cal->events();

my @liste;
my $i = 0;

foreach my $event (@events) {

	my ($sum, $dts, $dte, $uid);

	# Check if it's a double :same start date, end date end summary
	# Is it enough ?
	$sum = defined($event->property('summary')) ? $event->property('summary')->[0]->value : "";
	($dts = $event->property('dtstart')->[0]->value) =~ s/Z//;
	($dte = $event->property('dtend')->[0]->value) =~ s/Z//;
	$uid = $event->property('uid')->[0]->value;

	# Store a md5, it's ligther
	my $h_md5 = md5_hex($sum . $dts . $dte);

	#print $h_md5 . " ==> " if $verbose;

	if (grep (/$h_md5/, @liste)) {
		if ( $doit) {
			if ( !$d->delete(-url => "$calendar/" . $event->property('uid')->[0]->value)) {
				print $d->message . "\n";
			}
		}
		print "delete : " . $sum . " - " . $dts . " - " . $dte . " - " . $uid . "\n" if $verbose;
	}
	else {
		$liste[$i++] = $h_md5;
		#print "premier : " . $sum . " - " . $dts . " - " . $dte . " - " . $uid . "\n" if $verbose;
	}

}

