import pytest

from freqtrade.exceptions import OperationalException
from freqtrade.leverage import interest
from freqtrade.util import FtPrecise


ten_mins = FtPrecise(1 / 6)
five_hours = FtPrecise(5.0)
twentyfive_hours = FtPrecise(25.0)


@pytest.mark.parametrize(
    "exchange,interest_rate,hours,expected",
    [
        ("binance", 0.0005, ten_mins, 0.00125),
        ("binance", 0.00025, ten_mins, 0.000625),
        ("binance", 0.00025, five_hours, 0.003125),
        ("binance", 0.00025, twentyfive_hours, 0.015625),
        # Kraken
        ("kraken", 0.0005, ten_mins, 0.06),
        ("kraken", 0.00025, ten_mins, 0.03),
        ("kraken", 0.00025, five_hours, 0.045),
        ("kraken", 0.00025, twentyfive_hours, 0.12),
    ],
)
def test_interest(exchange, interest_rate, hours, expected):
    borrowed = FtPrecise(60.0)

    assert (
        pytest.approx(
            float(
                interest(
                    exchange_name=exchange,
                    borrowed=borrowed,
                    rate=FtPrecise(interest_rate),
                    hours=hours,
                )
            )
        )
        == expected
    )


def test_interest_exception():
    with pytest.raises(OperationalException, match=r"Leverage not available on .* with freqtrade"):
        interest(
            exchange_name="bitmex", borrowed=FtPrecise(60.0), rate=FtPrecise(0.0005), hours=ten_mins
        )