#!/usr/bin/env python3
"""
Trouve le facet Diamond qui contient getOrderAndTradeHistoryV2
"""

from web3 import Web3
import json

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

w3 = Web3(Web3.HTTPProvider(BSC_RPC))

# Diamond Loupe ABI standard (EIP-2535)
DIAMOND_LOUPE_ABI = [
    {
        "name": "facets",
        "outputs": [{
            "components": [
                {"name": "facetAddress", "type": "address"},
                {"name": "functionSelectors", "type": "bytes4[]"}
            ],
            "internalType": "struct IDiamondLoupe.Facet[]",
            "name": "facets_",
            "type": "tuple[]"
        }],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "name": "facetFunctionSelectors",
        "inputs": [{"name": "_facet", "type": "address"}],
        "outputs": [{"name": "facetFunctionSelectors_", "type": "bytes4[]"}],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "name": "facetAddresses",
        "outputs": [{"name": "facetAddresses_", "type": "address[]"}],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "name": "facetAddress",
        "inputs": [{"name": "_functionSelector", "type": "bytes4"}],
        "outputs": [{"name": "facetAddress_", "type": "address"}],
        "stateMutability": "view",
        "type": "function"
    }
]


def main():
    print("=" * 80)
    print("🔍 RECHERCHE FACET DIAMOND POUR getOrderAndTradeHistoryV2")
    print("=" * 80)
    print()
    print(f"Contract: {APOLLOX_CONTRACT}")
    print()

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

    # Calculer le selector de getOrderAndTradeHistoryV2
    target_function = "getOrderAndTradeHistoryV2(address,uint256,uint8)"
    selector = Web3.keccak(text=target_function)[:4]
    selector_hex = selector.hex()

    print(f"🎯 Target function: {target_function}")
    print(f"   Selector: {selector_hex}\n")

    # Méthode 1: facetAddress (direct)
    print("📡 Méthode 1: Recherche directe via facetAddress()...")
    try:
        facet_addr = contract.functions.facetAddress(selector).call()
        print(f"   ✅ Facet trouvé: {facet_addr}\n")

        if facet_addr != "0x0000000000000000000000000000000000000000":
            return facet_addr
    except Exception as e:
        print(f"   ⚠️  Erreur: {e}\n")

    # Méthode 2: facets() (liste complète)
    print("📡 Méthode 2: Scan de tous les facets via facets()...")
    try:
        facets = contract.functions.facets().call()
        print(f"   Total facets: {len(facets)}\n")

        for i, facet in enumerate(facets, 1):
            facet_addr = facet[0]
            selectors = facet[1]

            print(f"   Facet #{i}: {facet_addr}")
            print(f"      Functions: {len(selectors)}")

            # Chercher notre selector
            for sel in selectors:
                if sel == selector:
                    print(f"      ✅ TROUVÉ ! getOrderAndTradeHistoryV2 dans ce facet\n")
                    return facet_addr

            # Afficher quelques selectors pour debug
            print(f"      Selectors: {[s.hex() for s in selectors[:3]]}...")
            print()

        print("   ❌ Selector non trouvé dans les facets\n")

    except Exception as e:
        print(f"   ⚠️  Erreur: {e}\n")

    # Méthode 3: facetAddresses (liste des adresses)
    print("📡 Méthode 3: Liste via facetAddresses()...")
    try:
        addresses = contract.functions.facetAddresses().call()
        print(f"   Total facets: {len(addresses)}\n")

        for addr in addresses:
            print(f"   Facet: {addr}")
            try:
                selectors = contract.functions.facetFunctionSelectors(addr).call()
                print(f"      Functions: {len(selectors)}")

                if selector in selectors:
                    print(f"      ✅ TROUVÉ ! getOrderAndTradeHistoryV2\n")
                    return addr

            except Exception as e:
                print(f"      Erreur: {e}")
            print()

        print("   ❌ Selector non trouvé\n")

    except Exception as e:
        print(f"   ⚠️  Erreur: {e}\n")

    print("=" * 80)
    print("❌ FACET NON TROUVÉ")
    print("=" * 80)
    print()
    print("Possibilités:")
    print("1. Ce n'est pas un contrat Diamond standard")
    print("2. La fonction n'est pas dans un facet mais directement dans le contrat")
    print("3. La fonction a été retirée/déployée ailleurs")
    print()

    return None


if __name__ == '__main__':
    facet = main()

    if facet:
        print("=" * 80)
        print("✅ RÉSULTAT")
        print("=" * 80)
        print(f"Facet address: {facet}")
        print()
        print("Pour appeler getOrderAndTradeHistoryV2, utiliser:")
        print(f"contract = w3.eth.contract(address='{facet}', abi=HISTORY_ABI)")
