import numpy as np
import pandas as pd

import tools.run_mlp_deep_sweep as sweep


def test_evaluation_preserves_history_and_complete_end_dates(monkeypatch):
    frame = pd.DataFrame(dict(time=pd.to_datetime([
        '2020-12-31 18:00', '2021-01-01 00:00', '2021-01-01 06:00',
        '2021-01-02 00:00', '2021-01-02 18:00']),
        close=[100., 110., 121., 100., 110.], high=[100.,110.,121.,100.,110.],
        position=[1,1,1,1,1], execute_entry=[True,False,False,False,False],
        execute_exit=[False]*5, activation_score=[0.]*5))
    monkeypatch.setattr(sweep, 'SCORE_START', '2020-12-31')
    monkeypatch.setattr(sweep, 'TRAIN_END', '2021-01-02')
    monkeypatch.setattr(sweep, 'SUBPERIOD_SPLIT', '2021-01-01')
    monkeypatch.setattr(sweep, 'OOS_START', '2021-01-03')
    monkeypatch.setattr(sweep, 'WFO_FOLDS', [('2020-12-31', '2021-01-01', '2021-01-01')])
    monkeypatch.setattr(sweep, 'PARAM_COLS', [])
    monkeypatch.setattr(sweep, '_score_to_signals', lambda scored, *args: scored)
    monkeypatch.setattr(sweep, 'fragile_count', lambda *args: 0)
    calls = []
    real = sweep.calculate_metrics
    def capture(df, **kwargs):
        calls.append((df.copy(), kwargs))
        return real(df, **kwargs)
    monkeypatch.setattr(sweep, 'calculate_metrics', capture)
    sweep.evaluate('4H', {'mlp_weights_file': 'fake'}, {'fake': (frame,None,None,None)})
    assert calls[0][0].time.iloc[-1] == pd.Timestamp('2021-01-02 18:00')
    assert calls[1][0].time.iloc[-1] < pd.Timestamp('2021-01-01')
    assert calls[2][0].time.iloc[0] == pd.Timestamp('2020-12-31 18:00')
    assert calls[2][1]['score_start'] == '2021-01-01'
    assert calls[3][0].time.iloc[-1] == pd.Timestamp('2021-01-01 06:00')


def test_loader_interprets_numeric_time_as_seconds(tmp_path, monkeypatch):
    path = tmp_path / 'bars.csv'
    pd.DataFrame({'time':[1609459200,1609480800], 'close':[100,101], 'high':[100,101]}).to_csv(path,index=False)
    monkeypatch.setattr(sweep, 'data_path', lambda tf: path)
    monkeypatch.setattr(sweep, 'load_mlp_artifact', lambda path: {'feature_cols':[], 'layers':[]})
    monkeypatch.setattr(sweep, '_prepare_features', lambda frame, cols: np.zeros((len(frame),10)))
    monkeypatch.setattr(sweep, 'mlp_forward', lambda features, layers: np.zeros(len(features)))
    frame, *_ = sweep.load_scored_frame('4H','fake')
    assert len(frame) == 2
    assert frame.time.iloc[0] == pd.Timestamp('2021-01-01')
