"""iCalendar export"""

import datetime as dt

from PyQt5 import QtCore

from .exceptions import ICSExportError


class ICSExport(QtCore.QObject):
    """iCalendar export"""

    def __init__(self, settings):
        super().__init__()
        self.settings = settings

    def write(self, birthdates):
        """Write iCalendar file"""

        self.settings.beginGroup('ics_export')
        conf_filepath = self.settings.value(
            'filepath', type=str)
        conf_alarm = self.settings.value(
            'alarm', type=bool)
        conf_alarm_days = self.settings.value(
            'alarm_days', type=int)
        conf_custom_properties = self.settings.value(
            'custom_properties', type=str)
        conf_alarm_custom_properties = self.settings.value(
            'alarm_custom_properties', type=str)
        self.settings.endGroup()

        try:
            with open(conf_filepath, 'w') as ics_file:
                now = dt.datetime.now().strftime('%Y%m%dT%H%M%SZ')
                ics_file.write('BEGIN:VCALENDAR\n')
                ics_file.write('VERSION:2.0\n')
                ics_file.write('PRODID:-//qbirthday//EN\n')
                for index, bday in enumerate(birthdates):
                    ics_file.write('BEGIN:VEVENT\n')
                    ics_file.write('UID:{}-{}@qbirthday\n'.format(now, index))
                    ics_file.write('CREATED:{}\n'.format(now))
                    ics_file.write('LAST-MODIFIED:{}\n'.format(now))
                    ics_file.write('DTSTAMP:{}\n'.format(now))
                    ics_file.write('DTSTART:{}\n'.format(
                        bday.strftime('%Y%m%d')))
                    ics_file.write('DURATION:PT0S\n')
                    ics_file.write('CATEGORIES:{}\n'.format(
                        self.tr("Birthday")))
                    ics_file.write('SUMMARY:{}{}\n'.format(
                        self.tr("Birthday: "), birthdates[bday][0]))
                    ics_file.write('CLASS:PRIVATE\n')
                    ics_file.write('TRANSP:TRANSPARENT\n')
                    ics_file.write('RRULE:FREQ=YEARLY\n')
                    if conf_alarm:
                        ics_file.write('BEGIN:VALARM\n')
                        ics_file.write('ACTION:DISPLAY\n')
                        ics_file.write('TRIGGER;VALUE=DURATION:-P{}D\n'.format(
                            conf_alarm_days))
                        ics_file.write('DESCRIPTION:{}{}\n'.format(
                            self.tr("Birthday: "), birthdates[bday][0]))
                        if conf_alarm_custom_properties != '':
                            ics_file.write(conf_alarm_custom_properties)
                            ics_file.write('\n')
                        ics_file.write("END:VALARM\n")
                    if conf_custom_properties != '':
                        ics_file.write(conf_custom_properties)
                        ics_file.write('\n')
                    ics_file.write("END:VEVENT\n")
                ics_file.write("END:VCALENDAR")
        except IOError:
            raise ICSExportError(
                self.tr("Can't write iCalendar file: {}".format(
                    conf_filepath)))
