from datetime import date
from pathlib import Path

import pandas as pd

from psx_signal.config import DataConfig
from psx_signal.data.providers.yahoo_provider import YahooFinanceProvider


def _raw_frame() -> pd.DataFrame:
    index = pd.DatetimeIndex([
        "2026-08-17 00:00:00+05:00", "2026-08-18 00:00:00+05:00"
    ], name="Date")
    return pd.DataFrame({
        "Open": [100.0, 51.0], "High": [104.0, 53.0], "Low": [99.0, 50.0],
        "Close": [102.0, 52.0], "Adj Close": [51.0, 52.0], "Volume": [1000, 1200],
        "Dividends": [0.0, 2.0], "Stock Splits": [2.0, 0.0],
    }, index=index)


def test_symbol_resolution_honours_manual_override(tmp_path: Path) -> None:
    mapping = tmp_path / "map.csv"
    mapping.write_text(
        "psx_symbol,yahoo_symbol,status,verified_at,notes\nABC,ABC-ALT.KA,SUCCESS,2026-08-18,manual\n"
    )
    provider = YahooFinanceProvider(DataConfig(yahoo_symbol_map=str(mapping)))
    assert provider.resolve_symbol("abc") == "ABC-ALT.KA"
    assert provider.resolve_symbol("SYS") == "SYS.KA"
    assert provider.resolve_symbol("KSE100") == "^KSE"


def test_raw_and_adjusted_prices_and_actions_are_distinct(monkeypatch, tmp_path: Path) -> None:
    provider = YahooFinanceProvider(DataConfig(
        yahoo_symbol_map=str(tmp_path / "map.csv"), yahoo_rate_limit_seconds=0,
        yahoo_retry_backoff_seconds=0,
    ))
    monkeypatch.setattr(provider, "_download_raw", lambda symbol, start, end: (_raw_frame(), 1))
    history = provider.get_history("SYS", date(2026, 8, 17), date(2026, 8, 18))
    actions = provider.get_actions("SYS", date(2026, 8, 17), date(2026, 8, 18))
    assert history["date"].dt.strftime("%Y-%m-%d").tolist() == ["2026-08-17", "2026-08-18"]
    assert history.loc[0, "close"] == 102.0
    assert history.loc[0, "adjusted_close"] == 51.0
    assert history.loc[0, "adjusted_open"] == 50.0
    assert set(actions["action_type"]) == {"CASH_DIVIDEND", "STOCK_SPLIT"}
    assert set(actions["provider"]) == {"yahoo_finance"}

