from datetime import datetime

import pytest

from icalendar.prop import vDatetime


def test_to_ical():
    assert vDatetime(datetime(2001, 1, 1, 12, 30, 0)).to_ical() == b"20010101T123000"


def test_from_ical():
    assert vDatetime.from_ical("20000101T120000") == datetime(2000, 1, 1, 12, 0)
    assert vDatetime.from_ical("20010101T000000") == datetime(2001, 1, 1, 0, 0)


def test_to_ical_utc(tzp):
    dutc = tzp.localize_utc(datetime(2001, 1, 1, 12, 30, 0))
    assert vDatetime(dutc).to_ical() == b"20010101T123000Z"


def test_to_ical_utc_1899(tzp):
    dutc = tzp.localize_utc(datetime(1899, 1, 1, 12, 30, 0))
    assert vDatetime(dutc).to_ical() == b"18990101T123000Z"


def test_bad_ical():
    with pytest.raises(ValueError):
        vDatetime.from_ical("20010101T000000A")


def test_from_ical_form_3():
    # TZID=America/New_York:19980119T020000
    dt = vDatetime.from_ical("TZID=America/New_York:19980119T020000")
    assert dt == datetime(1998, 1, 19, 2, 0, 0)


def test_from_ical_no_t():
    with pytest.raises(ValueError, match="Wrong datetime format: 20010101-000000"):
        vDatetime.from_ical("20010101-000000")


def test_from_ical_wrong_t_position():
    # T is at index 9 instead of 8
    with pytest.raises(ValueError, match="Wrong datetime format: 200101011T00000"):
        vDatetime.from_ical("200101011T00000")


def test_roundtrip():
    utc = vDatetime.from_ical("20010101T000000Z")
    assert vDatetime(utc).to_ical() == b"20010101T000000Z"


def test_transition(tzp):
    # 1 minute before transition to DST
    dat = vDatetime.from_ical("20120311T015959", "America/Denver")
    assert dat.strftime("%Y%m%d%H%M%S %z") == "20120311015959 -0700"

    # After transition to DST
    dat = vDatetime.from_ical("20120311T030000", "America/Denver")
    assert dat.strftime("%Y%m%d%H%M%S %z") == "20120311030000 -0600"

    dat = vDatetime.from_ical("20101010T000000", "Europe/Vienna")
    assert vDatetime(dat).to_ical() == b"20101010T000000"
