from pathlib import Path

import pandas as pd
import pytest

from psx_signal.data.storage import DataConflictError, DatasetStore


def _row(close: float) -> pd.DataFrame:
    return pd.DataFrame({
        "symbol": ["SYS"], "date": pd.to_datetime(["2026-08-18"]),
        "open": [100.0], "high": [105.0], "low": [99.0], "close": [close], "volume": [1000.0],
    })


def test_upsert_is_idempotent_and_refuses_history_rewrite(tmp_path: Path) -> None:
    store = DatasetStore(tmp_path)
    _, first_added = store.upsert(_row(104), store.equities_path, ["symbol", "date"], ["open", "high", "low", "close", "volume"])
    second, second_added = store.upsert(_row(104), store.equities_path, ["symbol", "date"], ["open", "high", "low", "close", "volume"])
    assert first_added == 1
    assert second_added == 0
    assert len(second) == 1
    with pytest.raises(DataConflictError, match="Refusing to overwrite"):
        store.upsert(_row(103), store.equities_path, ["symbol", "date"], ["open", "high", "low", "close", "volume"])

