from __future__ import annotations

import json
from pathlib import Path

from src.ctb_copy.collectors.hyperliquid_vault_collector import HyperliquidVaultCollector
from src.ctb_copy.runtime_paths import CopyResearchPaths, ensure_runtime_dirs


class FakeVaultTransport:
    def post(self, url: str, payload: dict[str, object], timeout: int = 10):
        assert payload == {"type": "vaultSummaries"}
        return [{"name": "Vault A", "vaultAddress": "0xabc"}]


def test_copy_research_paths_are_outside_repo_by_default() -> None:
    paths = CopyResearchPaths()
    assert str(paths.root) == "/home/agent/.local/state/CryptoTradingBot/copy_research"
    assert "Crypto_Agent" not in str(paths.root)
    assert paths.snapshot_file("vaults", "2026-06-14").as_posix().endswith("snapshots/vaults/2026-06-14/snapshots.jsonl")
    assert paths.daily_report_file("2026-06-14").as_posix().endswith("reports/daily/2026-06-14.md")


def test_snapshot_jsonl_write_uses_runtime_path_without_repo_pollution(tmp_path) -> None:
    paths = CopyResearchPaths(tmp_path / "copy_research")
    ensure_runtime_dirs(paths, "2026-06-14")
    snapshots = HyperliquidVaultCollector(transport=FakeVaultTransport()).collect_vault_summaries(observed_at_ms=123)

    target = HyperliquidVaultCollector(transport=FakeVaultTransport()).write_jsonl(snapshots, paths.snapshot_file("vaults", "2026-06-14"))

    assert target == tmp_path / "copy_research" / "snapshots" / "vaults" / "2026-06-14" / "snapshots.jsonl"
    rows = [json.loads(line) for line in target.read_text().splitlines()]
    assert rows[0]["vault_id"] == "0xabc"
    assert not Path("runtime/copy_research").exists()
