﻿# -*- coding: utf-8 -*-

# Latvijas svētku dienu un atzīmējamo un atceres dienu iCalendar formāta kalendāru ģenerators
# Nododu šo kodu publiskā lietošanā (public domain), Edgars Jēkabsons, 2008

# http://www.likumi.lv/doc.php?id=72608 
# 03.10.1990. likums "Par svētku un atceres dienām" (Ziņotājs, 42, 18.10.1990.) [spēkā ar 03.10.1990.] ar grozījumiem 
# pēdējie grozījumi 24.05.2007

import vobject
import datetime
from dateutil import rrule
import dateutil.easter as easter
from dateutil.relativedelta import *



# Atzīmējamās dienas
atz_days={
    (2,20)  : u'1991. gada barikāžu aizstāvju atceres diena',
    (2,26)  : u'LR starptautiskās (de jure) atzīšanas diena',
    (3,8)   : u'Starptautiskā sieviešu diena',
    (3,25)  : u'Komunistiskā genocīda upuru piemiņas diena',
    (5,8)   : u'Nacisma sagrāves dienu un Otrā pasaules kara upuru piemiņas diena',
    (5,9)   : u'Eiropas diena',
    (5,15)  : u'Starptautiskā ģimenes diena',
    (6,1)   : u'Starptautiskā bērnu aizsardzības diena',
    (6,14)  : u'Komunistiskā genocīda upuru piemiņas diena',
    (6,17)  : u'Latvijas Republikas okupācijas diena',
    (6,22)  : u'Varoņu piemiņas diena (Cēsu kaujas atceres diena)',
    (7,4)   : u'Ebreju tautas genocīda upuru piemiņas diena',
    (8,11)  : u'Latvijas brīvības cīnītāju piemiņas diena',
    (8,21)  : u'Konstitucionālā likuma "Par Latvijas Republikas valstisko statusu" pieņemšanas un Latvijas Republikas faktiskās neatkarības atjaunošanas diena',
    (9,1)   : u'Zinību diena',
    (9,22)  : u'Baltu vienības diena',
    (11,11) : u'Lāčplēša diena'
}

# Svētku dienas
holidays={
    (1,1)   : u'Jaungada diena',
    (5,1)   : u'Darba svētki, LR Satversmes sapulces sasaukšanas diena',
    (5,4)   : u'LR Neatkarības deklarācijas pasludināšanas diena',
    (6,23)  : u'Līgo diena',
    (6,24)  : u'Jāņu diena (vasaras saulgrieži)',
    (11,18) : u'LR Proklamēšanas diena',
    (12,31) : u'Vecgada diena'
}



def add_repeatable_events(startyear,days,cal):
    yearrule = rrule.rruleset()
    yearrule.rrule(rrule.rrule(rrule.YEARLY))
    for (date, summary) in days.items():
        vevent = cal.add('vevent')
        vevent.add('summary').value = summary
        month, day = date
        vevent.add('dtstart').value = datetime.date(startyear, month, day)
        vevent.rruleset = yearrule
    

def generate_holidays_ical(startyear, endyear, filename):
    cal = vobject.iCalendar()
    cal.add('method').value = 'PUBLISH'  #  vajadzīgs IE/Outlook
    add_repeatable_events(startyear, holidays, cal)
    
    vevent = cal.add('vevent')
    vevent.add('summary').value = u'Ziemassvētki (ziemas saulgrieži)' 
    vevent.add('dtstart').value = datetime.date(startyear, 12, 24)
    vevent.add('dtend').value = datetime.date(startyear, 12, 27)
    ruleset = rrule.rruleset()
    ruleset.rrule(rrule.rrule(rrule.YEARLY))
    vevent.rruleset = ruleset
    
    vevent = cal.add('vevent')
    vevent.add('summary').value =u'Mātes diena'
    vevent.add('dtstart').value = datetime.date(startyear,5,1) + relativedelta(weekday=SU(+2))
    ruleset = rrule.rruleset()
    ruleset.rrule(rrule.rrule(rrule.YEARLY,bymonth=5,byweekday=rrule.SU(2)))
    vevent.rruleset = ruleset

    for year in range(startyear, endyear):
    	# Lieldienas
    	easterdate = easter.easter(year)
    	vevent = cal.add('vevent')
    	vevent.add('summary').value =u'Lielā Piektdiena'
    	vevent.add('dtstart').value = easterdate - datetime.timedelta(days=2)
    	vevent = cal.add('vevent')
    	vevent.add('summary').value =u'Pirmās Lieldienas'
    	vevent.add('dtstart').value = easterdate
    	vevent = cal.add('vevent')
    	vevent.add('summary').value =u'Otrās Lieldienas'
    	vevent.add('dtstart').value = easterdate + datetime.timedelta(days=1)
    	
    	# papildus brīvdiena 4.maijam
    	if year>2007 and datetime.date(year,5,4).isoweekday()>5:
    		vevent = cal.add('vevent')
    		vevent.add('summary').value =u'Papildus brīvdiena 4. maijam'
    		vevent.add('dtstart').value = datetime.date(year,5,4+8-(datetime.date(year,5,4).isoweekday()))
    	
    	# Vasarsvētki
    	vevent = cal.add('vevent')
    	vevent.add('summary').value =u'Vasarsvētki'
    	vevent.add('dtstart').value = easterdate + datetime.timedelta(days=49)
    	
    	# papildus brīvdiena 18.novembrim
    	if year>2007 and datetime.date(year,11,18).isoweekday()>5:
    		vevent = cal.add('vevent')
    		vevent.add('summary').value =u'Papildus brīvdiena 18. novembrim'
    		vevent.add('dtstart').value = datetime.date(year,11,18+8-(datetime.date(year,11,18).isoweekday()))    

    out = file(filename,'wb')
    out.write(cal.serialize())
    out.close()

    
def generate_atz_ical(startyear, endyear, filename):
    cal = vobject.iCalendar()
    cal.add('method').value = 'PUBLISH'  #  vajadzīgs IE/Outlook
    add_repeatable_events(startyear, atz_days, cal)
    
    # Jūras svētki
    vevent = cal.add('vevent')
    vevent.add('summary').value =u'Jūras svētku diena'
    vevent.add('dtstart').value = datetime.date(startyear,7,1) + relativedelta(weekday=SA(+2))
    ruleset = rrule.rruleset()
    ruleset.rrule(rrule.rrule(rrule.YEARLY,bymonth=7,byweekday=rrule.SA(2)))
    vevent.rruleset=ruleset
    
    # Skolotāju diena
    vevent = cal.add('vevent')
    vevent.add('summary').value =u'Skolotāju diena'
    vevent.add('dtstart').value = datetime.date(startyear,10,1) + relativedelta(weekday=SU(+1))
    ruleset = rrule.rruleset()
    ruleset.rrule(rrule.rrule(rrule.YEARLY,bymonth=10,byweekday=rrule.SU(1)))
    vevent.rruleset=ruleset


    #  Komunistiskā režīma genocīda upuru piemiņas diena
    vevent = cal.add('vevent')
    vevent.add('summary').value =u'Pret latviešu tautu vērstā totalitārā komunistiskā režīma genocīda upuru piemiņas diena'
    vevent.add('dtstart').value = datetime.date(startyear,12,1) + relativedelta(weekday=SU(+1))
    ruleset = rrule.rruleset()
    ruleset.rrule(rrule.rrule(rrule.YEARLY,bymonth=12,byweekday=rrule.SU(1)))
    vevent.rruleset=ruleset
    
    out = file(filename,'wb')
    out.write(cal.serialize())
    out.close()


generate_atz_ical(2000, 2050, 'atzimejamas_dienas.ics')    
generate_holidays_ical(2000, 2050, 'svetku_dienas.ics')

