from math import ceil

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


one = FtPrecise(1.0)
four = FtPrecise(4.0)
twenty_four = FtPrecise(24.0)


def interest(
    exchange_name: str,
    borrowed: FtPrecise,
    rate: FtPrecise,
    hours: FtPrecise
) -> FtPrecise:
    """
    Equation to calculate interest on margin trades

    :param exchange_name: The exchanged being trading on
    :param borrowed: The amount of currency being borrowed
    :param rate: The rate of interest (i.e daily interest rate)
    :param hours: The time in hours that the currency has been borrowed for

    Raises:
        OperationalException: Raised if freqtrade does
        not support margin trading for this exchange

    Returns: The amount of interest owed (currency matches borrowed)
    """
    exchange_name = exchange_name.lower()
    if exchange_name == "binance":
        return borrowed * rate * FtPrecise(ceil(hours)) / twenty_four
    elif exchange_name == "kraken":
        # Rounded based on https://kraken-fees-calculator.github.io/
        return borrowed * rate * (one + FtPrecise(ceil(hours / four)))
    elif exchange_name == "ftx":
        # As Explained under #Interest rates section in
        # https://help.ftx.com/hc/en-us/articles/360053007671-Spot-Margin-Trading-Explainer
        return borrowed * rate * FtPrecise(ceil(hours)) / twenty_four
    else:
        raise OperationalException(f"Leverage not available on {exchange_name} with freqtrade")
