from __future__ import annotations

import json

import pytest

from src.ctb_copy.runtime_paths import CopyResearchPaths
from src.ctb_copy.watchlist import enabled_vaults, enabled_wallets, init_watchlist, load_watchlist, save_watchlist, validate_watchlist, watchlist_path

DUMMY_WALLET = "0x" + "1" * 40
DUMMY_VAULT = "0x" + "2" * 40


def test_watchlist_json_is_initialized_outside_repo(tmp_path) -> None:
    runtime = tmp_path / "state_root"
    target = watchlist_path(runtime)

    created = init_watchlist(target)

    assert created == runtime / "state" / "watchlist.json"
    assert "Crypto_Agent" not in str(created)
    assert json.loads(created.read_text()) == {"version": 1, "wallets": [], "vaults": []}


def test_missing_watchlist_does_not_crash_and_defaults_empty(tmp_path) -> None:
    payload = load_watchlist(CopyResearchPaths(tmp_path).watchlist_file)

    assert payload == {"version": 1, "wallets": [], "vaults": []}
    assert enabled_wallets(payload) == ()
    assert enabled_vaults(payload) == ()


def test_enabled_false_is_ignored_and_invalid_address_rejected(tmp_path) -> None:
    payload = {
        "version": 1,
        "wallets": [
            {"address": DUMMY_WALLET, "label": "on", "source": "manual", "enabled": True, "notes": ""},
            {"address": "0x" + "3" * 40, "label": "off", "source": "manual", "enabled": False, "notes": ""},
        ],
        "vaults": [{"vault_address": DUMMY_VAULT, "label": "vault", "source": "manual", "enabled": True, "notes": ""}],
    }

    assert validate_watchlist(payload).ok is True
    assert [entry.address for entry in enabled_wallets(payload)] == [DUMMY_WALLET]
    assert [entry.vault_address for entry in enabled_vaults(payload)] == [DUMMY_VAULT]

    invalid = {"version": 1, "wallets": [{"address": "not-an-address", "enabled": True}], "vaults": []}
    validation = validate_watchlist(invalid)
    assert validation.ok is False
    assert "wallets[0].address_invalid" in validation.errors
    with pytest.raises(ValueError):
        save_watchlist(invalid, tmp_path / "watchlist.json")
