#!/usr/bin/env python3
"""
Analyse les events d'une transaction ApolloX connue
"""

from web3 import Web3
import json

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

w3 = Web3(Web3.HTTPProvider(BSC_RPC))

# TX connues depuis positions.json.backup
SAMPLE_TXS = [
    "0xd89bd9da1b0487b91d7505eb8ec0db529e21e670efbb5a9687b26f3c1743d23f",
    "0xfbfd35181fb34048d8e0f444b92354b90f4c97a46c0d6874be034551cd21ec10",
]

# Event names possibles
EVENT_NAMES = {
    'OpenTrade': 'Open a new trade',
    'CloseTrade': 'Close an existing trade',
    'ExecuteTrade': 'Execute a pending trade',
    'Liquidate': 'Liquidate a position',
    'UpdateTP': 'Update take profit',
    'UpdateSL': 'Update stop loss',
    'AddMargin': 'Add margin to position',
}


def analyze_tx(tx_hash: str):
    """Analyse une transaction"""

    print(f"\n📝 Transaction: {tx_hash}")
    print("=" * 80)

    try:
        receipt = w3.eth.get_transaction_receipt(tx_hash)
        tx = w3.eth.get_transaction(tx_hash)

        print(f"From: {tx['from']}")
        print(f"To: {tx['to']}")
        print(f"Block: {receipt['blockNumber']}")
        print(f"Status: {'✅ Success' if receipt['status'] == 1 else '❌ Failed'}")
        print(f"Gas Used: {receipt['gasUsed']}")
        print()

        # Analyser input data
        input_data = tx['input']
        if len(input_data) >= 10:
            method_sig = input_data[:10]
            print(f"Method Signature: {method_sig}")

            # Méthodes connues
            known_methods = {
                '0x4584eff6': 'openMarketTrade',
                '0x421cdddf': 'closeTrade',
                '0x058ddbe5': 'addMargin',
                '0x44a9ca3f': 'updateTradeTpAndSl',
            }

            if method_sig in known_methods:
                print(f"Method Name: {known_methods[method_sig]}")
        print()

        # Analyser logs/events
        print(f"📊 Events ({len(receipt['logs'])} logs):\n")

        apollox_events = []

        for i, log in enumerate(receipt['logs'], 1):
            # Afficher tous les logs
            log_addr = log['address']
            is_apollox = log_addr.lower() == APOLLOX_CONTRACT.lower()

            print(f"   Log #{i}: {log_addr} {'⭐ APOLLOX' if is_apollox else ''}")

            if len(log['topics']) > 0:
                event_sig = log['topics'][0].hex()
                print(f"      Event Signature: {event_sig}")
                print(f"      Topics: {len(log['topics'])}")
                print(f"      Data: {len(log['data'])} bytes")

                if is_apollox:
                    apollox_events.append({
                        'signature': event_sig,
                        'topics': [t.hex() for t in log['topics']],
                        'data': log['data'].hex() if isinstance(log['data'], bytes) else log['data']
                    })

                # Afficher les topics
                if len(log['topics']) > 1:
                    print(f"      Topic[1] (indexed param 1): {log['topics'][1].hex()}")
                if len(log['topics']) > 2:
                    print(f"      Topic[2] (indexed param 2): {log['topics'][2].hex()}")
                if len(log['topics']) > 3:
                    print(f"      Topic[3] (indexed param 3): {log['topics'][3].hex()}")

            print()

        # Résumé ApolloX
        if apollox_events:
            print("=" * 80)
            print(f"🎯 EVENTS APOLLOX: {len(apollox_events)}")
            print("=" * 80)

            for i, event in enumerate(apollox_events, 1):
                print(f"\nEvent #{i}:")
                print(f"   Signature: {event['signature']}")
                print(f"   Topics: {len(event['topics'])}")

                # Topic[1] est souvent le trade_hash
                if len(event['topics']) > 1:
                    print(f"   Trade Hash: {event['topics'][1]}")

                # Essayer de décoder data
                data = event['data']
                if data.startswith('0x'):
                    data = data[2:]

                print(f"   Data: {len(data) // 2} bytes")

                # Si data est long, afficher les premiers slots
                if len(data) >= 64:
                    slots = []
                    for j in range(0, min(len(data), 320), 64):  # 5 premiers slots
                        slot_hex = data[j:j+64]
                        if len(slot_hex) == 64:
                            slot_int = int(slot_hex, 16)
                            slots.append(slot_int)

                    if slots:
                        print(f"   Data slots:")
                        for j, slot in enumerate(slots):
                            print(f"      [{j}] {slot} (0x{slot:x})")

                            # Tentative de conversion
                            if slot < 10**20:  # Pourrait être un wei amount
                                usdt = slot / 1e18
                                if 0.01 < usdt < 1000000:
                                    print(f"          = {usdt:.4f} USDT (if wei)")

                            if 10**6 < slot < 10**10:  # Pourrait être un prix
                                price = slot / 1e8
                                if 100 < price < 200000:
                                    print(f"          = ${price:,.2f} (if price)")

        return apollox_events

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


def main():
    print("=" * 80)
    print("🔍 ANALYSE TRANSACTIONS APOLLOX")
    print("=" * 80)

    all_events = {}

    for tx_hash in SAMPLE_TXS:
        events = analyze_tx(tx_hash)

        for event in events:
            sig = event['signature']
            if sig not in all_events:
                all_events[sig] = []
            all_events[sig].append(event)

    # Résumé global
    print("\n" + "=" * 80)
    print("📊 RÉSUMÉ GLOBAL")
    print("=" * 80)

    print(f"\nEvent signatures uniques trouvées: {len(all_events)}\n")

    for i, (sig, events) in enumerate(all_events.items(), 1):
        print(f"Event #{i}:")
        print(f"   Signature: {sig}")
        print(f"   Occurrences: {len(events)}")
        print()

    # Code à utiliser
    print("=" * 80)
    print("📝 CODE À UTILISER")
    print("=" * 80)
    print()

    for i, sig in enumerate(all_events.keys(), 1):
        print(f"EVENT_{i} = '{sig}'")


if __name__ == '__main__':
    main()
