import shutil
from pathlib import Path

import pytest

from freqtrade.persistence import Trade
from freqtrade.util.binance_mig import migrate_binance_futures_data, migrate_binance_futures_names
from tests.conftest import create_mock_trades_usdt, log_has


def test_binance_mig_data_conversion(default_conf_usdt, tmpdir, testdatadir):

    # call doing nothing (spot mode)
    migrate_binance_futures_data(default_conf_usdt)
    default_conf_usdt['trading_mode'] = 'futures'
    pair_old = 'XRP_USDT'
    pair_unified = 'XRP_USDT_USDT'
    futures_src = testdatadir / 'futures'
    futures_dst = tmpdir / 'futures'
    futures_dst.mkdir()
    files = [
        '-1h-mark.json',
        '-1h-futures.json',
        '-8h-funding_rate.json',
        '-8h-mark.json',
    ]

    # Copy files to tmpdir and rename to old naming
    for file in files:
        fn_after = futures_dst / f'{pair_old}{file}'
        shutil.copy(futures_src / f'{pair_unified}{file}', fn_after)

    default_conf_usdt['datadir'] = Path(tmpdir)
    # Migrate files to unified namings
    migrate_binance_futures_data(default_conf_usdt)

    for file in files:
        fn_after = futures_dst / f'{pair_unified}{file}'
        assert fn_after.exists()


@pytest.mark.usefixtures("init_persistence")
def test_binance_mig_db_conversion(default_conf_usdt, fee, caplog):
    # Does nothing in spot mode
    migrate_binance_futures_names(default_conf_usdt)

    create_mock_trades_usdt(fee, None)

    for t in Trade.get_trades():
        t.trading_mode = 'FUTURES'
        t.exchange = 'binance'
    Trade.commit()

    default_conf_usdt['datadir'] = Path(default_conf_usdt['datadir'])
    default_conf_usdt['trading_mode'] = 'futures'
    migrate_binance_futures_names(default_conf_usdt)
    assert log_has('Migrating binance futures pairs in database.', caplog)