from dataclasses import replace
from pathlib import Path

import pandas as pd

from psx_signal.config import DataConfig, load_settings
from psx_signal.pipelines.data_sync import DataSyncService


def _write_daily(path: Path, day: str, sys_close: int, index_close: int) -> None:
    target = path / f"market_{day}.csv"
    target.parent.mkdir(parents=True, exist_ok=True)
    target.write_text(
        "SCRIP,OPEN,HIGH,LOW,CURRENT,VOLUME\n"
        f"SYS,{sys_close-1},{sys_close+1},{sys_close-2},{sys_close},10000\n"
        f"KSE100,{index_close-10},{index_close+10},{index_close-20},{index_close},20000\n"
    )


def test_incremental_sync_adds_only_missing_sessions_and_preserves_raw(tmp_path: Path) -> None:
    inbox, root = tmp_path / "inbox", tmp_path / "data"
    _write_daily(inbox, "2026-08-14", 100, 150000)
    base = load_settings()
    settings = replace(base, minimum_history=0, data=DataConfig(root=str(root), inbox=str(inbox)))
    service = DataSyncService(settings)
    first = service.sync()
    second = service.sync()
    _write_daily(inbox, "2026-08-18", 102, 151000)
    third = service.sync()
    equities = pd.read_parquet(root / "normalized/equities/eod.parquet")
    index = pd.read_parquet(root / "normalized/indices/KSE100.parquet")
    assert first.rows_added == 1 and first.index_rows_added == 1
    assert second.rows_added == 0 and second.index_rows_added == 0
    assert third.rows_added == 1 and third.index_rows_added == 1
    assert len(equities) == 2 and len(index) == 2
    raw_files = [path for path in (root / "raw/psx/equities").rglob("*.csv")]
    assert len(raw_files) == 2
    assert all(path.stat().st_mode & 0o222 == 0 for path in raw_files)
