#!/usr/bin/env python3
"""
Trouve les event signatures en analysant les transactions réelles du wallet
"""

from web3 import Web3
import requests
import os
from dotenv import load_dotenv
from collections import Counter

load_dotenv()

WALLET_ADDRESS = os.getenv('WALLET_ADDRESS', '0x7476737C49d55bea691e54c2c96fD39a6bAf3049')
APOLLOX_CONTRACT = "0x1b6F2d3844C6ae7D56ceb3C3643b9060ba28FEb0"
BSC_RPC = "https://bsc-dataseed.binance.org/"

w3 = Web3(Web3.HTTPProvider(BSC_RPC))

# Event names connus
KNOWN_EVENTS = {
    '0x7064b82c073f138da0ec7646ebb51d4a0061d647accb4670bc564edf0bfac41d': 'OpenTrade(?)',
}


def get_wallet_transactions():
    """Récupère toutes les TX du wallet via BSCScan"""

    url = "https://api.bscscan.com/api"
    params = {
        'module': 'account',
        'action': 'txlist',
        'address': WALLET_ADDRESS,
        'startblock': 0,
        'endblock': 99999999,
        'sort': 'desc',
        'apikey': 'YourApiKeyToken'
    }

    print("📡 Récupération transactions depuis BSCScan...")

    try:
        response = requests.get(url, params=params, timeout=30)
        data = response.json()

        if data.get('status') == '1':
            txs = data.get('result', [])
            print(f"   ✅ {len(txs)} transactions\n")
            return txs
        else:
            print(f"   ❌ Erreur: {data.get('message')}\n")
            return []

    except Exception as e:
        print(f"   ❌ Erreur: {e}\n")
        return []


def analyze_transaction_logs(tx_hash: str) -> list:
    """Analyse les logs d'une transaction"""

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

        events = []
        for log in receipt['logs']:
            # Filtrer uniquement ApolloX
            if log['address'].lower() != APOLLOX_CONTRACT.lower():
                continue

            if len(log['topics']) > 0:
                event_sig = log['topics'][0].hex()
                events.append({
                    'signature': event_sig,
                    'topics_count': len(log['topics']),
                    'data_size': len(log['data'])
                })

        return events

    except Exception as e:
        return []


def main():
    print("=" * 80)
    print("🔍 RECHERCHE EVENT SIGNATURES - APOLLOX")
    print("=" * 80)
    print()
    print(f"Wallet: {WALLET_ADDRESS}")
    print(f"Contract: {APOLLOX_CONTRACT}\n")

    # 1. Récupérer TX
    txs = get_wallet_transactions()

    if not txs:
        print("❌ Aucune transaction")
        return

    # Filtrer TX ApolloX
    apollox_txs = [
        tx for tx in txs
        if tx.get('to', '').lower() == APOLLOX_CONTRACT.lower()
    ]

    print(f"📊 {len(apollox_txs)} transactions ApolloX\n")

    if not apollox_txs:
        print("❌ Aucune transaction ApolloX")
        return

    # 2. Analyser les logs
    print("🔍 Analyse des events...\n")

    all_events = []
    event_counter = Counter()

    for i, tx in enumerate(apollox_txs[:50], 1):  # Limiter à 50 TX
        tx_hash = tx['hash']
        print(f"   [{i}/{min(len(apollox_txs), 50)}] {tx_hash[:16]}...")

        events = analyze_transaction_logs(tx_hash)

        for event in events:
            sig = event['signature']
            all_events.append(event)
            event_counter[sig] += 1

            # Afficher si nouveau
            if sig not in KNOWN_EVENTS:
                print(f"      🆕 Event: {sig}")
                print(f"         Topics: {event['topics_count']}, Data: {event['data_size']} bytes")

    # 3. Résumé
    print()
    print("=" * 80)
    print("📊 RÉSUMÉ DES EVENTS")
    print("=" * 80)
    print()

    print(f"Total events: {len(all_events)}")
    print(f"Events uniques: {len(event_counter)}\n")

    print("🔥 TOP EVENTS PAR FRÉQUENCE:\n")

    for sig, count in event_counter.most_common(10):
        name = KNOWN_EVENTS.get(sig, '???')
        print(f"   {sig}")
        print(f"      Nom: {name}")
        print(f"      Occurrences: {count}")
        print()

    # Suggestions de noms basées sur la fréquence
    print("=" * 80)
    print("💡 SUGGESTIONS")
    print("=" * 80)
    print()

    events_list = event_counter.most_common()

    if len(events_list) >= 1:
        print(f"Event #1 (le plus fréquent) - {events_list[0][1]} occurrences:")
        print(f"   {events_list[0][0]}")
        print(f"   Probablement: OpenTrade ou ExecuteTrade")
        print()

    if len(events_list) >= 2:
        print(f"Event #2 - {events_list[1][1]} occurrences:")
        print(f"   {events_list[1][0]}")
        print(f"   Probablement: CloseTrade ou UpdatePosition")
        print()

    if len(events_list) >= 3:
        print(f"Event #3 - {events_list[2][1]} occurrences:")
        print(f"   {events_list[2][0]}")
        print(f"   Probablement: Liquidation ou ClosePosition")
        print()

    # Export pour usage
    print("=" * 80)
    print("📝 CODE À UTILISER")
    print("=" * 80)
    print()
    print("# Event signatures trouvées:")

    for sig, count in events_list[:5]:
        name = KNOWN_EVENTS.get(sig, f'EVENT_{count}')
        print(f"{name.upper().replace('(?)', '')}_EVENT = '{sig}'  # {count} occurrences")


if __name__ == '__main__':
    main()
