from __future__ import annotations

import numpy as np
import pandas as pd
import pytest

from indicators.macd import calculate_ema, calculate_macd


def make_close(n: int = 100, seed: int = 42) -> pd.Series:
    rng = np.random.default_rng(seed)
    prices = 60000 + np.cumsum(rng.normal(0, 100, n))
    return pd.Series(prices, dtype=float)


def test_ema_length_matches_input():
    close = make_close(50)
    ema = calculate_ema(close, 12)
    assert len(ema) == len(close)


def test_macd_columns_exist():
    close = make_close(100)
    result = calculate_macd(close)
    assert set(result.columns) == {"macd", "signal", "histogram"}


def test_macd_length_matches_input():
    close = make_close(100)
    result = calculate_macd(close)
    assert len(result) == len(close)


def test_histogram_equals_macd_minus_signal():
    close = make_close(100)
    result = calculate_macd(close)
    diff = (result["macd"] - result["signal"] - result["histogram"]).abs()
    assert diff.max() < 1e-8


def test_macd_no_nan_after_warmup():
    """بعد شمعة slow+signal كافية لا يوجد NaN."""
    close = make_close(200)
    result = calculate_macd(close, fast=12, slow=26, signal=9)
    # بعد الشمعة 26+9=35
    tail = result.iloc[40:]
    assert not tail.isnull().any().any()


def test_ema_converges():
    """EMA يتقارب نحو القيمة الثابتة."""
    close = pd.Series([100.0] * 200)
    ema = calculate_ema(close, 12)
    assert abs(float(ema.iloc[-1]) - 100.0) < 0.01
