from eth_account import Account

from src.config.hyperliquid_env import load_hyperliquid_env


def test_env_specific_files_support_keys_with_spaces(tmp_path):
    api = Account.create()
    wallet = Account.create().address
    (tmp_path / "Mainnet.env").write_text(
        f"HL_WALLET_ADDRESS = {wallet}\n"
        f"HL_API_PRIVATE_KEY = {api.key.hex()}\n"
        "API Wallet Name = Hermes Agent\n"
        f"API Key = {api.address}\n",
        encoding="utf-8",
    )

    cfg = load_hyperliquid_env("mainnet", search_dirs=(tmp_path,), validation_mode="readonly")

    assert cfg.account_address == wallet
    assert cfg.api_wallet_address_from_env == api.address
    assert cfg.api_wallet_address_derived == api.address
    assert cfg.sdk_account_address == wallet


def test_env_specific_files_support_mainnet_alias_names(tmp_path):
    api = Account.create()
    wallet = Account.create().address
    (tmp_path / "Mainnet.env").write_text(
        f"Mainnet_Account_Address = {wallet}\n"
        f"Mainnet_Private_Key = {api.key.hex()}\n"
        f"Mainnet_API_Key = {api.address}\n",
        encoding="utf-8",
    )

    cfg = load_hyperliquid_env("mainnet", search_dirs=(tmp_path,), validation_mode="readonly")

    assert cfg.account_address == wallet
    assert cfg.api_wallet_address_from_env == api.address
    assert cfg.api_wallet_address_derived == api.address


def test_mainnet_signed_validation_can_validate_without_order_permission(tmp_path):
    api = Account.create()
    wallet = Account.create().address
    (tmp_path / "Mainnet.env").write_text(
        f"Mainnet_Account_Address = {wallet}\n"
        f"Mainnet_Private_Key = {api.key.hex()}\n"
        f"Mainnet_API_Key = {api.address}\n",
        encoding="utf-8",
    )

    blocked = load_hyperliquid_env("mainnet", search_dirs=(tmp_path,), validation_mode="signed", allow_errors=True)
    validated = load_hyperliquid_env("mainnet", search_dirs=(tmp_path,), validation_mode="signed", allow_mainnet_signed_validation=True)

    assert "mainnet_signed_actions_blocked" in blocked.errors
    assert validated.errors == ()
    assert validated.agent_wallet_key_matches_private_key is True
