#!/usr/pkg/bin/python3.12

"""Parse a vcard file given via stdin and output some details.
Currently the following details are displayed if present:

- start date and time
- the summary information of the event
- a list of attendees
- the description of the event

Please note: if multiple events are included in the data then only the
first one will be parsed and displayed!

REQUIREMENTS:
- Python 3
- Python 3 - vobject library

To use as a filter in aerc, add the following line to your aerc.config:
text/calendar=show-ics-details.py
"""

import re
import sys

import vobject


def remove_mailto(message: str) -> str:
    """Remove a possible existing 'mailto:' from the given message.

    Keyword arguments:
    message -- A message string.
    """
    return re.sub(r'^mailto:', '', message, flags=re.IGNORECASE)

def extract_field(cal: vobject.icalendar.VCalendar2_0, name: str) -> str:
    """Extract the desired field from the given calendar object.

    Keyword arguments:
    cal -- A VCalendar 2.0 object.
    name -- The field name.
    """
    try:
        name = name.strip()
        if name == 'attendees':
            attendees = []
            for attendee in cal.vevent.attendee_list:
                attendees.append(remove_mailto(attendee.valueRepr()).strip())
            return ', '.join(attendees)
        elif name == 'description':
            return cal.vevent.description.valueRepr().strip()
        elif name == 'dtstart':
            return str(cal.vevent.dtstart.valueRepr()).strip()
        elif name == 'organizer':
            return remove_mailto(cal.vevent.organizer.valueRepr()).strip()
        elif name == 'summary':
            return cal.vevent.summary.valueRepr().strip()
        else:
            return ''
    except AttributeError:
        return ''

attendees   = ''
description = ''
dtstart     = ''
error       = ''
organizer   = ''
summary     = ''

try:
    cal         = vobject.readOne(sys.stdin)
    attendees   = extract_field(cal, 'attendees')
    description = extract_field(cal, 'description')
    dtstart     = extract_field(cal, 'dtstart')
    organizer   = extract_field(cal, 'organizer')
    summary     = extract_field(cal, 'summary')
except vobject.base.ParseError:
    error = '**Sorry, but we could not parse the calendar!**'

if error:
    print(error)
    print("")

print(f"Date/Time : {dtstart}")
print(f"Summary   : {summary}")
print(f"Organizer : {organizer}")
print(f"Attendees : {attendees}")
print("")
print(description)
