import pytest

from gcal_sync import CalendarConverter

ics_empty = """BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//test//test//ES
CALSCALE:GREGORIAN
METHOD:PUBLISH
END:VCALENDAR
"""

ics_empty_event = """BEGIN:VCALENDAR
BEGIN:VEVENT
END:VEVENT
END:VCALENDAR
"""

ics_event_no_end = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART;VALUE=DATE:20180215
END:VEVENT
END:VCALENDAR
"""

ics_event_date_val = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART;VALUE=DATE:20180215
DTEND;VALUE=DATE:20180217
END:VEVENT
END:VCALENDAR
"""

ics_event_date_duration = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART;VALUE=DATE:20180215
DURATION:P2D
END:VEVENT
END:VCALENDAR
"""

ics_event_datetime_utc_val = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART;VALUE=DATE-TIME:20180319T092001Z
DTEND:20180321T102501Z
END:VEVENT
END:VCALENDAR
"""

ics_event_datetime_utc_duration = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART;VALUE=DATE-TIME:20180319T092001Z
DURATION:P2DT1H5M
END:VEVENT
END:VCALENDAR
"""

ics_event_created_updated = """BEGIN:VCALENDAR
BEGIN:VEVENT
UID:uisgtr8tre93wewe0yr8wqy@test.com
DTSTART:20180215
DTEND:20180217
CREATED:20180320T071155Z
LAST-MODIFIED:20180326T120235Z
END:VEVENT
END:VCALENDAR
"""


def test_empty_calendar():
    converter = CalendarConverter()
    converter.loads(ics_empty)
    evnts = converter.events_to_gcal()
    assert evnts == []


def test_empty_event():
    converter = CalendarConverter()
    converter.loads(ics_empty_event)
    with pytest.raises(KeyError):
        converter.events_to_gcal()


def test_event_no_end():
    converter = CalendarConverter()
    converter.loads(ics_event_no_end)
    with pytest.raises(ValueError):
        converter.events_to_gcal()

@pytest.fixture(params=[
("date", ics_event_date_val, '2018-02-15', '2018-02-17'),
("date", ics_event_date_duration, '2018-02-15', '2018-02-17'),
("dateTime", ics_event_datetime_utc_val, '2018-03-19T09:20:01.000001Z', '2018-03-21T10:25:01.000001Z'),
("dateTime", ics_event_datetime_utc_duration, '2018-03-19T09:20:01.000001Z', '2018-03-21T10:25:01.000001Z')],
ids=['date values', 'date duration', 'datetime utc values', 'datetime utc duration']
)
def param_events_start_end(request):
    return request.param

def test_event_start_end(param_events_start_end):
    (date_type, ics_str, start, end) = param_events_start_end
    converter = CalendarConverter()
    converter.loads(ics_str)
    events = converter.events_to_gcal()
    assert len(events) == 1
    event = events[0]
    assert event['start'] == {
        date_type: start
    }
    assert event['end'] == {
        date_type: end
    }

def test_event_created_updated():
    converter = CalendarConverter()
    converter.loads(ics_event_created_updated)
    events = converter.events_to_gcal()
    assert len(events) == 1
    event = events[0]
    assert event['created'] == '2018-03-20T07:11:55.000001Z'
    assert event['updated'] == '2018-03-26T12:02:35.000001Z'