from datetime import date

from advent22_api.core.helpers import EventDates


def test_get_before():
    today = date(2023, 11, 30)

    ed = EventDates(
        today=today,
        begin_month=12,
        begin_day=1,
        events=list(range(1, 25)),
        close_after=5,
    )

    assert ed.first == date(2023, 12, 1)
    assert ed.get_next(today=today) == date(2023, 12, 1)
    assert ed.last == date(2023, 12, 24)
    assert ed.end == date(2023, 12, 29)


def test_get_after():
    today = date(2023, 12, 30)

    ed = EventDates(
        today=today,
        begin_month=12,
        begin_day=1,
        events=list(range(1, 25)),
        close_after=5,
    )

    assert ed.first == date(2024, 12, 1)
    assert ed.get_next(today=today) == date(2024, 12, 1)
    assert ed.last == date(2024, 12, 24)
    assert ed.end == date(2024, 12, 29)


def test_get_during_events():
    today = date(2023, 12, 10)

    ed = EventDates(
        today=today,
        begin_month=12,
        begin_day=1,
        events=list(range(1, 25)),
        close_after=5,
    )

    assert ed.first == date(2023, 12, 1)
    assert ed.get_next(today=today) == date(2023, 12, 11)
    assert ed.last == date(2023, 12, 24)
    assert ed.end == date(2023, 12, 29)


def test_get_during_closing():
    today = date(2023, 12, 29)

    ed = EventDates(
        today=today,
        begin_month=12,
        begin_day=1,
        events=list(range(1, 25)),
        close_after=5,
    )

    assert ed.first == date(2023, 12, 1)
    assert ed.get_next(today=today) is None
    assert ed.last == date(2023, 12, 24)
    assert ed.end == date(2023, 12, 29)


def test_get_during_wrap():
    today = date(2024, 1, 1)

    ed = EventDates(
        today=today,
        begin_month=12,
        begin_day=1,
        events=list(range(1, 25)),
        close_after=8,
    )

    assert ed.first == date(2023, 12, 1)
    assert ed.get_next(today=today) is None
    assert ed.last == date(2023, 12, 24)
    assert ed.end == date(2024, 1, 1)
