import pytest
import datetime

@pytest.mark.parametrize('field, expected_value', [
    ('PRODID', '-//Plönë.org//NONSGML plone.app.event//EN'),
    ('X-WR-CALDESC', 'test non ascii: äöü ÄÖÜ €'),
])
def test_calendar_from_ical_respects_unicode(field, expected_value, calendars):
    cal = calendars.calendar_with_unicode
    assert cal[field].to_ical().decode('utf-8') == expected_value

@pytest.mark.parametrize('test_input, field, expected_value', [
    ('event_with_unicode_fields', 'SUMMARY', 'Non-ASCII Test: ÄÖÜ äöü €'),
    ('event_with_unicode_fields', 'DESCRIPTION', 'icalendar should be able to handle non-ascii: €äüöÄÜÖ.'),
    ('event_with_unicode_fields', 'LOCATION', 'Tribstrül'),
    # Non-unicode characters in summary
    # https://github.com/collective/icalendar/issues/64
    ('issue_64_event_with_non_ascii_summary', 'SUMMARY', 'åäö'),
    # Unicode characters in summary
    ('issue_64_event_with_ascii_summary', 'SUMMARY', 'abcdef'),
])
def test_event_from_ical_respects_unicode(test_input, field, expected_value, events):
    event = events[test_input]
    assert event[field].to_ical().decode('utf-8') == expected_value

@pytest.mark.parametrize('test_input, expected_output', [
    # chokes on umlauts in ORGANIZER
    # https://github.com/collective/icalendar/issues/101
    ('issue_101_icalendar_chokes_on_umlauts_in_organizer', 'acme, ädmin'),
    ('event_with_unicode_organizer', 'Джон Доу'),
])
def test_events_parameter_unicoded(events, test_input, expected_output):
    assert events[test_input]['ORGANIZER'].params['CN'] == expected_output

def test_parses_event_with_non_ascii_tzid_issue_237(calendars, in_timezone):
    """Issue #237 - Fail to parse timezone with non-ascii TZID
    see https://github.com/collective/icalendar/issues/237
    """
    start = calendars.issue_237_fail_to_parse_timezone_with_non_ascii_tzid.walk('VEVENT')[0].decoded('DTSTART')
    expected = in_timezone(datetime.datetime(2017, 5, 11, 13, 30), 'America/Sao_Paulo')
    assert not calendars.issue_237_fail_to_parse_timezone_with_non_ascii_tzid.errors
    assert start == expected

def test_parses_timezone_with_non_ascii_tzid_issue_237(timezones):
    """Issue #237 - Fail to parse timezone with non-ascii TZID
    see https://github.com/collective/icalendar/issues/237
    """
    assert timezones.issue_237_brazilia_standard['tzid'] == '(UTC-03:00) Brasília'

@pytest.mark.parametrize('timezone_name', ['standard', 'daylight'])
def test_parses_timezone_with_non_ascii_tzname_issue_273(timezones, timezone_name):
    """Issue #237 - Fail to parse timezone with non-ascii TZID
    see https://github.com/collective/icalendar/issues/237
    """
    assert timezones.issue_237_brazilia_standard.walk(timezone_name)[0]['TZNAME'] == f'Brasília {timezone_name}'

def test_broken_property(calendars):
    """
    Test if error messages are encoded properly.
    """
    for event in calendars.broken_ical.walk('vevent'):
        assert len(event.errors) == 1, 'Not the right amount of errors.'
        error = event.errors[0][1]
        assert error.startswith('Content line could not be parsed into parts')

def test_apple_xlocation(calendars):
    """
    Test if we support base64 encoded binary data in parameter values.
    """
    for event in calendars.x_location.walk('vevent'):
        assert len(event.errors) == 0, 'Got too many errors'
