#!/usr/bin/env python3
"""
Test getPositionByHashV2 avec des trade_hash connus
"""

from web3 import Web3
import json

BSC_RPC = "https://bsc-dataseed.binance.org/"
APOLLOX_CONTRACT = "0x1b6F2d3844C6ae7D56ceb3C3643b9060ba28FEb0"

w3 = Web3(Web3.HTTPProvider(BSC_RPC))

# ABI pour getPositionByHashV2 (depuis apollox_v2_client.py)
ABI = [{
    "inputs": [{"name": "tradeHash", "type": "bytes32"}],
    "name": "getPositionByHashV2",
    "outputs": [{
        "components": [
            {"name": "tradeHash", "type": "bytes32"},
            {"name": "user", "type": "address"},
            {"name": "pairBase", "type": "address"},
            {"name": "isLong", "type": "bool"},
            {"name": "margin", "type": "uint96"},
            {"name": "qty", "type": "uint80"},
            {"name": "entryPrice", "type": "uint64"},
            {"name": "stopLoss", "type": "uint64"},
            {"name": "takeProfit", "type": "uint64"}
        ],
        "type": "tuple"
    }],
    "stateMutability": "view",
    "type": "function"
}]

# Trade hashes depuis positions.json.backup_fake
KNOWN_TRADE_HASHES = [
    "fda5c2bdecd3233298c9ca74940ea5fca47d00fce6b4d7df4f7471cb2be8863c",
    "3ab5e5d1c3bd938f0843d3bb455e354b2adbff88dcb00c8016f2d55b2806905f",
]


def test_get_position(trade_hash: str):
    """Test getPositionByHashV2"""

    print(f"\n{'='*80}")
    print(f"Testing trade_hash: {trade_hash}")
    print(f"{'='*80}\n")

    contract = w3.eth.contract(
        address=Web3.to_checksum_address(APOLLOX_CONTRACT),
        abi=ABI
    )

    try:
        # Convertir en bytes32
        trade_hash_bytes = bytes.fromhex(trade_hash)

        print(f"🔍 Appel getPositionByHashV2...")

        position = contract.functions.getPositionByHashV2(trade_hash_bytes).call()

        print(f"✅ Position récupérée!\n")

        # Décoder
        result = {
            'tradeHash': '0x' + position[0].hex(),
            'user': position[1],
            'pairBase': position[2],
            'isLong': position[3],
            'margin': position[4] / 1e18,
            'qty': position[5] / 1e10,
            'entryPrice': position[6] / 1e8,
            'stopLoss': position[7] / 1e8,
            'takeProfit': position[8] / 1e8
        }

        print(f"📊 Données:")
        print(f"   User: {result['user']}")
        print(f"   Pair: {result['pairBase']}")
        print(f"   Side: {'LONG' if result['isLong'] else 'SHORT'}")
        print(f"   Margin: ${result['margin']:.2f} USDT")
        print(f"   Qty: {result['qty']:.6f}")
        print(f"   Entry: ${result['entryPrice']:,.2f}")
        print(f"   SL: ${result['stopLoss']:,.2f}")
        print(f"   TP: ${result['takeProfit']:,.2f}")

        # Si margin = 0, position fermée
        if result['margin'] == 0:
            print(f"\n⚠️  POSITION FERMÉE (margin = 0)")
        else:
            print(f"\n✅ POSITION OUVERTE")

        return result

    except Exception as e:
        print(f"❌ Erreur: {e}")
        import traceback
        traceback.print_exc()
        return None


def main():
    print("="*80)
    print("🧪 TEST getPositionByHashV2")
    print("="*80)

    results = []

    for trade_hash in KNOWN_TRADE_HASHES:
        result = test_get_position(trade_hash)
        if result:
            results.append(result)

    print("\n" + "="*80)
    print("📊 RÉSUMÉ")
    print("="*80)

    print(f"\nTesté: {len(KNOWN_TRADE_HASHES)} positions")
    print(f"Réussies: {len(results)}")

    open_positions = [r for r in results if r['margin'] > 0]
    closed_positions = [r for r in results if r['margin'] == 0]

    print(f"\nOuvertes: {len(open_positions)}")
    print(f"Fermées: {len(closed_positions)}")

    if closed_positions:
        print(f"\n💡 IMPORTANT:")
        print(f"   Les positions fermées retournent margin=0")
        print(f"   On ne peut PAS récupérer l'historique avec getPositionByHashV2")


if __name__ == '__main__':
    main()
