from datetime import datetime
from typing import Tuple

import pytest

from t_tech.invest import CandleInterval
from t_tech.invest.utils import round_datetime_range


@pytest.mark.parametrize(
    ("interval", "date_range", "expected_range"),
    [
        (
            CandleInterval.CANDLE_INTERVAL_1_MIN,
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=1, microsecond=1
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=1, second=1, microsecond=1
                ),
            ),
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=0, microsecond=0
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=2, second=0, microsecond=0
                ),
            ),
        ),
        (
            CandleInterval.CANDLE_INTERVAL_HOUR,
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=1, microsecond=1
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=1, second=1, microsecond=1
                ),
            ),
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=0, second=0, microsecond=0
                ),
                datetime(
                    year=2023, month=1, day=2, hour=2, minute=0, second=0, microsecond=0
                ),
            ),
        ),
        (
            CandleInterval.CANDLE_INTERVAL_DAY,
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=1, microsecond=1
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=1, second=1, microsecond=1
                ),
            ),
            (
                datetime(
                    year=2023, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
                ),
                datetime(
                    year=2023, month=1, day=3, hour=0, minute=0, second=0, microsecond=0
                ),
            ),
        ),
        (
            CandleInterval.CANDLE_INTERVAL_WEEK,
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=1, microsecond=1
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=1, second=1, microsecond=1
                ),
            ),
            (
                datetime(
                    year=2023, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
                ),
                datetime(
                    year=2023, month=1, day=9, hour=0, minute=0, second=0, microsecond=0
                ),
            ),
        ),
        (
            CandleInterval.CANDLE_INTERVAL_MONTH,
            (
                datetime(
                    year=2023, month=1, day=1, hour=1, minute=1, second=1, microsecond=1
                ),
                datetime(
                    year=2023, month=1, day=2, hour=1, minute=1, second=1, microsecond=1
                ),
            ),
            (
                datetime(
                    year=2023, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
                ),
                datetime(
                    year=2023, month=2, day=1, hour=0, minute=0, second=0, microsecond=0
                ),
            ),
        ),
    ],
)
def test_round_datetime_range(
    interval: CandleInterval,
    date_range: Tuple[datetime, datetime],
    expected_range: Tuple[datetime, datetime],
):
    actual_range = round_datetime_range(
        date_range=date_range,
        interval=interval,
    )

    assert actual_range == expected_range
