from __future__ import annotations

import json
from pathlib import Path

from src.ctb_copy.reports.phase7_scorecard import build_phase7_scorecard, format_phase7_scorecard
from src.ctb_copy.runtime_paths import CopyResearchPaths, ensure_runtime_dirs


def test_phase7_scorecard_is_research_only_and_reports_missing_evidence(tmp_path: Path) -> None:
    paths = CopyResearchPaths(tmp_path)
    ensure_runtime_dirs(paths, "2026-06-30")

    scorecard = build_phase7_scorecard(paths, "2026-06-30")

    assert scorecard["version"] == "copytrading_research.v1"
    assert scorecard["status"] == "closed_v1_collecting_evidence"
    assert scorecard["research_only"] is True
    assert scorecard["copy_permission"] is False
    assert scorecard["live_copy_allowed"] is False
    assert scorecard["vault_deposits_allowed"] is False
    assert scorecard["wallet_execution_allowed"] is False
    assert scorecard["mainnet_signed_action"] is False
    assert "no_enabled_copy_watchlist_entries" in scorecard["blockers"]
    assert "no_shadow_position_deltas_yet" in scorecard["blockers"]

    line = format_phase7_scorecard(scorecard)
    assert "Copytrading Research v1:" in line
    assert "mode=research_only" in line
    assert "live_copy=nein" in line


def test_phase7_scorecard_counts_runtime_watchlist_registry_and_shadow_decisions(tmp_path: Path) -> None:
    paths = CopyResearchPaths(tmp_path)
    day = "2026-06-30"
    ensure_runtime_dirs(paths, day)
    paths.watchlist_file.write_text(json.dumps({
        "version": 1,
        "wallets": [{"address": "0x" + "1" * 40, "label": "leader-a", "enabled": True, "notes": "read-only observation only"}],
        "vaults": [{"vault_address": "0x" + "2" * 40, "label": "vault-a", "enabled": True}],
    }))
    leader_id = "0x" + "1" * 40
    paths.discovery_registry_file.write_text(json.dumps({
        "leaders": {
            f"wallet:{leader_id}": {
                "leader_id": leader_id,
                "leader_type": "wallet",
                "source": "test",
                "status": "watchlist",
                "first_seen_at": f"{day}T00:00:00+00:00",
                "last_seen_at": f"{day}T00:00:00+00:00",
                "snapshot_count": 2,
                "observation_days": 1,
                "notes": "",
            }
        },
    }))
    paths.shadow_result_file(day).write_text(json.dumps({
        "status": "ok",
        "decisions_count": 3,
        "allowed_count": 1,
        "blocked_count": 2,
        "ignored_count": 0,
        "top_block_reasons": {"BLOCK_POSITION_TOO_YOUNG": 2},
    }))

    scorecard = build_phase7_scorecard(paths, day)
    evidence = scorecard["evidence"]

    assert evidence["enabled_wallets"] == 1
    assert evidence["enabled_vaults"] == 1
    assert evidence["registry_total"] == 1
    assert evidence["shadow_decisions"] == 3
    assert evidence["shadow_allowed"] == 1
    assert scorecard["top_shadow_block_reasons"] == {"BLOCK_POSITION_TOO_YOUNG": 2}
    assert "no_enabled_copy_watchlist_entries" not in scorecard["blockers"]
    assert "no_shadow_position_deltas_yet" not in scorecard["blockers"]
    assert scorecard["live_copy_allowed"] is False
