from datetime import date
from pathlib import Path

import pandas as pd
import pytest

from psx_signal.data.normalization import normalize_equities
from psx_signal.data.providers.base import MarketDataArtifact


def test_psx_daily_columns_normalize_with_provenance(tmp_path: Path) -> None:
    source = tmp_path / "market_2026-08-18.csv"
    source.write_text(
        "SCRIP,LDCP,OPEN,HIGH,LOW,CURRENT,VOLUME\n sys ,100,101,105,99,104,12,000\n",
        encoding="utf-8",
    )
    # Use an unambiguous valid row; malformed numeric field parsing is checked separately.
    source.write_text("SCRIP,LDCP,OPEN,HIGH,LOW,CURRENT,VOLUME\n sys ,100,101,105,99,104,12000\n")
    artifact = MarketDataArtifact(source, "equities", "official-file.csv", date(2026, 8, 18), "psx")
    result = normalize_equities(artifact, "raw/psx/equities/hash.csv")
    row = result.iloc[0]
    assert row["symbol"] == "SYS"
    assert row["date"] == pd.Timestamp("2026-08-18")
    assert row["close"] == 104
    assert row["previous_close"] == 100
    assert row["is_adjusted"] == False
    assert row["source_reference"] == "official-file.csv"
    assert row["raw_artifact"] == "raw/psx/equities/hash.csv"


def test_missing_required_source_column_is_rejected(tmp_path: Path) -> None:
    source = tmp_path / "market_2026-08-18.csv"
    source.write_text("SCRIP,OPEN,HIGH,LOW,CURRENT\nSYS,100,101,99,100\n")
    artifact = MarketDataArtifact(source, "equities", source.name, date(2026, 8, 18), "psx")
    with pytest.raises(ValueError, match="volume"):
        normalize_equities(artifact, "raw/file.csv")


def test_malformed_numbers_remain_missing_for_validation(tmp_path: Path) -> None:
    source = tmp_path / "market_2026-08-18.csv"
    source.write_text("SCRIP,OPEN,HIGH,LOW,CURRENT,VOLUME\nSYS,bad,101,99,100,bad\n")
    artifact = MarketDataArtifact(source, "equities", source.name, date(2026, 8, 18), "psx")
    result = normalize_equities(artifact, "raw/file.csv")
    assert pd.isna(result.iloc[0]["open"])
    assert pd.isna(result.iloc[0]["volume"])

