from eth_account import Account

from src.config.hyperliquid_env import diagnose_hyperliquid_env, load_hyperliquid_env


def _write_agent_env(path, *, account_address, agent_private_key, agent_wallet_address):
    path.write_text(
        f"HL_ACCOUNT_ADDRESS={account_address}\n"
        f"HL_AGENT_PRIVATE_KEY={agent_private_key}\n"
        f"HL_AGENT_WALLET_ADDRESS={agent_wallet_address}\n",
        encoding="utf-8",
    )


def test_signed_credentials_use_account_for_sdk_and_agent_key_for_signer(tmp_path):
    account = Account.create()
    agent = Account.create()
    _write_agent_env(
        tmp_path / "Testnet.env",
        account_address=account.address,
        agent_private_key=agent.key.hex(),
        agent_wallet_address=agent.address,
    )

    cfg = load_hyperliquid_env("testnet", search_dirs=(tmp_path,), validation_mode="signed")

    assert cfg.account_address == account.address
    assert cfg.agent_private_key == agent.key.hex()
    assert cfg.agent_wallet_address_from_env == agent.address
    assert cfg.agent_wallet_address_derived == agent.address
    assert cfg.agent_wallet_key_matches_private_key is True
    assert cfg.account_address_equals_agent_wallet_address is False
    assert cfg.sdk_account_address == account.address
    assert cfg.safe_to_run_testnet_smokes is True


def test_signed_credentials_block_when_agent_address_mismatch(tmp_path):
    account = Account.create()
    agent = Account.create()
    wrong_agent_address = Account.create().address
    _write_agent_env(
        tmp_path / "Testnet.env",
        account_address=account.address,
        agent_private_key=agent.key.hex(),
        agent_wallet_address=wrong_agent_address,
    )

    diag = diagnose_hyperliquid_env("testnet", search_dirs=(tmp_path,), validation_mode="signed")

    assert diag["agent_wallet_key_matches_private_key"] is False
    assert "agent_wallet_private_key_mismatch" in diag["errors"]
    assert diag["safe_to_run_testnet_smokes"] is False


def test_signed_credentials_block_when_account_equals_agent_wallet(tmp_path):
    agent = Account.create()
    _write_agent_env(
        tmp_path / "Testnet.env",
        account_address=agent.address,
        agent_private_key=agent.key.hex(),
        agent_wallet_address=agent.address,
    )

    diag = diagnose_hyperliquid_env("testnet", search_dirs=(tmp_path,), validation_mode="signed")

    assert diag["account_address_equals_agent_wallet_address"] is True
    assert "account_address_equals_agent_wallet_address" in diag["errors"]
    assert diag["safe_to_run_testnet_smokes"] is False


def test_legacy_variable_names_still_supported_but_reported_as_legacy(tmp_path):
    account = Account.create()
    agent = Account.create()
    (tmp_path / "Testnet.env").write_text(
        f"HL_WALLET_ADDRESS={account.address}\n"
        f"HL_API_PRIVATE_KEY={agent.key.hex()}\n"
        f"API_Wallet_Adress={agent.address}\n",
        encoding="utf-8",
    )

    diag = diagnose_hyperliquid_env("testnet", search_dirs=(tmp_path,), validation_mode="signed")

    assert diag["account_address_masked"].startswith(account.address[:6])
    assert diag["agent_wallet_address_from_env_masked"].startswith(agent.address[:6])
    assert diag["agent_wallet_key_matches_private_key"] is True
    assert "legacy_env_names_used" in diag["warnings"]
    assert diag["safe_to_run_testnet_smokes"] is True
