#!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - /opt/cpanel-ccs/bin/test_add_ccs_cal_event
#                                                   Copyright 2019 cPanel, L.L.C.
#                                                            All rights Reserved.
# copyright@cpanel.net                                          http://cpanel.net
# This code is subject to the cPanel license.  Unauthorized copying is prohibited

use strict;
use warnings;

use Getopt::Long ();
use Cpanel::UUID ();
use HTTP::Request;
use HTTP::Headers;
use LWP::UserAgent;

use IO::Socket::SSL;

use lib '/var/cpanel/perl';
use Cpanel::CCS::Userdata ();

sub usage {
    my ($msg) = @_;

    print "Error: $msg\n" if defined $msg;
    print "usage: add_ccs_cal_event.pl --date=seconds_in_future --event=title --user=user_email_address --password=password --calendar_base_url=https://myccs.tld:2080\n";
    return 1 if defined $msg;
    return 0;
}

sub get_timestamp {
    my ($time) = @_;

    my ( $s_sec, $s_min, $s_hour, $s_mday, $s_mon, $s_year, $s_wday, $s_yday, $s_isdst ) = localtime($time);
    $s_mon++;
    $s_year += 1900;

    my $s_date = sprintf(
        "%04d%02d%02dT%02d%02d%02d",
        $s_year, $s_mon, $s_mday, $s_hour, $s_min, $s_sec
    );

    return $s_date;
}

sub script {
    my (@argv) = @_;

    local $| = 1;

    my $date;
    my $event;
    my $user;
    my $calendar_base_url;
    my $password;
    my $help;

    my $opts = Getopt::Long::GetOptionsFromArray(
        \@argv,
        'date=n'              => \$date,
        'event=s'             => \$event,
        'user=s'              => \$user,
        'password=s'          => \$password,
        'calendar_base_url=s' => \$calendar_base_url,
        'help'                => \$help,
    ) or return ( usage("Invalid parameters") );

    if ( defined $help ) {
        return ( usage() );
    }

    return usage("need date")              if !defined $date;
    return usage("need event")             if !defined $event;
    return usage("need user")              if !defined $user;
    return usage("need password")          if !defined $password;
    return usage("need calendar_base_url") if !defined $calendar_base_url;

    my $users = Cpanel::CCS::Userdata::get_users();

    my $nowtime       = time();
    my $s_timestamp   = get_timestamp( $nowtime + $date );
    my $e_timestamp   = get_timestamp( $nowtime + $date + 3600 );
    my $c_timestamp   = get_timestamp($nowtime);
    my $c_timestamp_z = get_timestamp($nowtime) . 'Z';

    my $user_uuid = $users->{$user}->{'uuid'};
    my $ics_uuid  = Cpanel::UUID::random_uuid();

    my $template = qq{
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CPANEL.NET//NONSGML Version 1//EN
BEGIN:VEVENT
UID:$ics_uuid
DTSTART;TZID=America/Chicago:$s_timestamp
DTEND;TZID=America/Chicago:$e_timestamp
DTSTAMP:$c_timestamp_z
CREATED:$c_timestamp_z
SUMMARY:$event
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
};

    my $url = $calendar_base_url . "/calendars/__uids__/$user_uuid/calendar/$ics_uuid.ics";
    print $template . "\n";
    print $url . "\n";

    my $ret;

    my $h = HTTP::Headers->new();
    $h->header( 'Content-Type' => 'text/calendar; charset=utf-8' );

    my $request = HTTP::Request->new( 'PUT', $url, $h, $template );
    $request->authorization_basic( $user, $password );

    my $ua = LWP::UserAgent->new(
        ssl_opts => {
            verify_hostname => 0,
            SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
        },
    );
    my $response = $ua->request($request);

    my $code    = $response->code;
    my $content = $response->content;

    print "CODE :$code:\n$content\n";

    return 0;
}

exit( script(@ARGV) ) unless caller();

1;

