import datetime
from decimal import Decimal

import pytest
from agenda import (
    get_gbpusd,
    get_next_bank_holiday,
    get_next_timezone_transition,
    next_economist,
    next_uk_fathers_day,
    next_uk_mothers_day,
    timedelta_display,
    uk_financial_year_end,
    xmas_day,
)


@pytest.fixture
def mock_today():
    # Mock the current date for testing purposes
    return datetime.date(2023, 10, 5)


@pytest.fixture
def mock_now():
    # Mock the current date and time for testing purposes
    return datetime.datetime(2023, 10, 5, 12, 0, 0)


def test_next_uk_mothers_day(mock_today):
    # Test next_uk_mothers_day function
    next_mothers_day = next_uk_mothers_day(mock_today)
    assert next_mothers_day == datetime.date(2024, 4, 21)


def test_next_uk_fathers_day(mock_today):
    # Test next_uk_fathers_day function
    next_fathers_day = next_uk_fathers_day(mock_today)
    assert next_fathers_day == datetime.date(2024, 6, 21)


def test_get_next_timezone_transition(mock_now) -> None:
    # Test get_next_timezone_transition function
    next_transition = get_next_timezone_transition(mock_now, "Europe/London")
    assert next_transition == datetime.date(2023, 10, 29)


def test_get_next_bank_holiday(mock_today) -> None:
    # Test get_next_bank_holiday function
    next_holiday = get_next_bank_holiday(mock_today)
    assert next_holiday["date"] == datetime.date(2023, 12, 25)
    assert next_holiday["title"] == "Christmas Day"


def test_get_gbpusd(mock_now):
    # Test get_gbpusd function
    gbpusd = get_gbpusd(mock_now)
    assert isinstance(gbpusd, Decimal)
    # You can add more assertions based on your specific use case.


def test_next_economist(mock_today):
    # Test next_economist function
    next_publication = next_economist(mock_today)
    assert next_publication == datetime.date(2023, 10, 5)


def test_xmas_day():
    # Test xmas_day function
    christmas = xmas_day(datetime.date(2023, 12, 25))
    assert christmas == datetime.date(2023, 12, 25)


def test_uk_financial_year_end():
    # Test uk_financial_year_end function
    financial_year_end = uk_financial_year_end(datetime.date(2023, 4, 1))
    assert financial_year_end == datetime.date(2023, 4, 5)


def test_timedelta_display():
    # Test timedelta_display function
    delta = datetime.timedelta(days=2, hours=5, minutes=30)
    display = timedelta_display(delta)
    assert display == "  2 days   5 hrs  30 mins"


# You can add more test cases for other functions as needed.