#!/usr/bin/env python3
"""
Vérifie si ApolloX utilise des NFTs pour représenter les positions
"""

from web3 import Web3
from eth_account import Account
import os
from dotenv import load_dotenv

load_dotenv()

BSC_RPC_URL = "https://bsc-dataseed.binance.org/"
APOLLOX_V2_CONTRACT = "0x1b6F2d3844C6ae7D56ceb3C3643b9060ba28FEb0"

# Dernière transaction de position ouverte
TX_HASH = "0x59da5b5c41ecb0171c0be25a5e4436b1317487dec93a02b8a17340932c83ceab"

w3 = Web3(Web3.HTTPProvider(BSC_RPC_URL))

print("=" * 80)
print("🔍 ANALYSE NFT POSITION")
print("=" * 80)

# Récupérer le receipt
receipt = w3.eth.get_transaction_receipt(TX_HASH)

print(f"\n📝 Transaction: {TX_HASH}")
print(f"   Status: {'✅ Success' if receipt['status'] == 1 else '❌ Failed'}")
print(f"   Block: {receipt['blockNumber']}")
print(f"   Gas used: {receipt['gasUsed']}")

# Analyser les logs (events)
print(f"\n📋 Events émis: {len(receipt['logs'])}")

# ERC721 Transfer event signature
# Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
TRANSFER_EVENT_SIGNATURE = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"

nft_transfers = []
other_events = []

for i, log in enumerate(receipt['logs']):
    topics = log['topics']

    if len(topics) > 0:
        event_sig = topics[0].hex()

        # Check si c'est un Transfer event
        if event_sig == TRANSFER_EVENT_SIGNATURE:
            # Vérifier si c'est un NFT (ERC721) vs ERC20
            # ERC721: 3-4 topics (from, to, tokenId)
            # ERC20: 3 topics (from, to) + data pour amount

            if len(topics) >= 3:
                from_addr = '0x' + topics[1].hex()[-40:]
                to_addr = '0x' + topics[2].hex()[-40:]

                # Si 4 topics = tokenId dans topics[3] (ERC721)
                if len(topics) == 4:
                    token_id = int(topics[3].hex(), 16)
                    nft_transfers.append({
                        'contract': log['address'],
                        'from': from_addr,
                        'to': to_addr,
                        'tokenId': token_id,
                        'log_index': log['logIndex']
                    })
        else:
            other_events.append({
                'contract': log['address'],
                'signature': event_sig,
                'topics': len(topics),
                'data_length': len(log['data'])
            })

print(f"\n🎨 NFT Transfers détectés: {len(nft_transfers)}")
for nft in nft_transfers:
    print(f"\n   Transfer #{nft['log_index']}:")
    print(f"      Contract: {nft['contract']}")
    print(f"      From: {nft['from']}")
    print(f"      To: {nft['to']}")
    print(f"      Token ID: {nft['tokenId']}")

    # Vérifier si mintée à notre wallet
    private_key = os.getenv('WALLET_PRIVATE_KEY')
    if private_key:
        account = Account.from_key(private_key)
        if nft['to'].lower() == account.address.lower():
            print(f"      ✅ MINTÉE À NOTRE WALLET!")
            print(f"      💡 Token ID {nft['tokenId']} = Position NFT")

if not nft_transfers:
    print("   ⚠️  Aucun NFT Transfer détecté")
    print("\n💡 ApolloX pourrait utiliser un autre mécanisme:")
    print("   - Events custom (non-standard)")
    print("   - Storage mapping direct")
    print("   - Trade hash comme identifiant unique")

print(f"\n📊 Autres events: {len(other_events)}")
if other_events:
    print(f"\n   Exemples:")
    for i, evt in enumerate(other_events[:5]):
        print(f"   {i+1}. Contract: {evt['contract']}")
        print(f"      Signature: {evt['signature']}")
        print(f"      Topics: {evt['topics']}, Data: {evt['data_length']} bytes")

# Checker tous les logs bruts
print(f"\n🔍 ANALYSE DÉTAILLÉE DES LOGS:")
for i, log in enumerate(receipt['logs']):
    print(f"\n   Log #{i}:")
    print(f"      Address: {log['address']}")
    print(f"      Topics: {len(log['topics'])}")
    if log['topics']:
        print(f"      Event signature: {log['topics'][0].hex()}")
    print(f"      Data: {len(log['data'])} bytes")

    # Si data non vide, essayer de décoder
    if log['data'] != '0x' and len(log['data']) > 2:
        data_hex = log['data'][2:]  # Remove 0x
        print(f"      Data (hex): {data_hex[:64]}..." if len(data_hex) > 64 else f"      Data (hex): {data_hex}")

        # Essayer de décoder comme uint256
        if len(data_hex) == 64:
            try:
                value = int(data_hex, 16)
                print(f"      Décodé (uint256): {value}")
            except:
                pass

print("\n" + "=" * 80)
