#!/usr/bin/env python3
"""
Test des validations SL/TP ajoutées dans apollox_v2_client.py
"""

import sys
sys.path.insert(0, '/var/www/html/HyperOracle/crypto_trader/apollo_degen_bot')

# Mock pour ne pas avoir besoin de wallet réel
class MockAccount:
    def __init__(self):
        self.address = '0x0000000000000000000000000000000000000000'

class MockW3:
    class eth:
        @staticmethod
        def get_transaction_count(address):
            return 0

        gas_price = 3000000000

    @staticmethod
    def to_wei(amount, unit):
        return amount * 1000000000

    @staticmethod
    def from_wei(amount, unit):
        return amount / 1000000000

    @staticmethod
    def to_checksum_address(addr):
        return addr

def test_validations():
    """Test les validations SL/TP"""

    print("="*80)
    print("🧪 TEST VALIDATIONS SL/TP")
    print("="*80)

    # Simulations
    tests = [
        # (is_long, price, sl, tp, should_pass, description)
        (True, 100, 95, 105, True, "LONG valide: SL<Entry<TP"),
        (True, 100, 105, 110, False, "LONG invalide: SL>Entry"),
        (True, 100, 95, 95, False, "LONG invalide: TP<Entry"),
        (True, 100, 100, 105, False, "LONG invalide: SL==Entry"),
        (True, 100, 95, 100, False, "LONG invalide: TP==Entry"),

        (False, 100, 105, 95, True, "SHORT valide: TP<Entry<SL"),
        (False, 100, 95, 90, False, "SHORT invalide: SL<Entry"),
        (False, 100, 105, 105, False, "SHORT invalide: TP>Entry"),
        (False, 100, 100, 95, False, "SHORT invalide: SL==Entry"),
        (False, 100, 105, 100, False, "SHORT invalide: TP==Entry"),
    ]

    passed = 0
    failed = 0

    for is_long, price, sl, tp, should_pass, desc in tests:
        try:
            # Reproduire la logique de validation
            if is_long:
                if sl >= price:
                    raise ValueError(f"LONG: SL >= Entry")
                if tp <= price:
                    raise ValueError(f"LONG: TP <= Entry")
            else:
                if sl <= price:
                    raise ValueError(f"SHORT: SL <= Entry")
                if tp >= price:
                    raise ValueError(f"SHORT: TP >= Entry")

            if abs(sl - price) < 0.01:
                raise ValueError(f"SL trop proche Entry")
            if abs(tp - price) < 0.01:
                raise ValueError(f"TP trop proche Entry")

            # Pas d'erreur
            if should_pass:
                print(f"✅ {desc}")
                passed += 1
            else:
                print(f"❌ {desc} - devrait échouer mais a passé !")
                failed += 1

        except ValueError as e:
            # Erreur levée
            if not should_pass:
                print(f"✅ {desc} - correctement rejeté ({str(e)[:40]})")
                passed += 1
            else:
                print(f"❌ {desc} - incorrectement rejeté ({str(e)[:40]})")
                failed += 1

    print()
    print("="*80)
    print(f"📊 RÉSULTATS: {passed}/{len(tests)} tests passés")
    print("="*80)

    if failed == 0:
        print("✅ TOUTES LES VALIDATIONS FONCTIONNENT CORRECTEMENT")
        return True
    else:
        print(f"❌ {failed} test(s) échoué(s)")
        return False

if __name__ == '__main__':
    success = test_validations()
    sys.exit(0 if success else 1)
