#!/usr/bin/env python3
"""
Script interactif pour configurer les clés API ApolloX de manière sécurisée
"""

import os
import sys
import getpass
from pathlib import Path

def print_header():
    print("="*80)
    print("🔑 CONFIGURATION DES CLÉS API APOLLOX")
    print("="*80)
    print()

def print_warning():
    print("⚠️  AVERTISSEMENTS DE SÉCURITÉ:")
    print("   1. Ne JAMAIS partager vos clés API")
    print("   2. Activer IP Whitelist sur ApolloX")
    print("   3. PAS de permission 'Withdrawals' sur l'API")
    print("   4. Activer 2FA sur votre compte ApolloX")
    print()

def check_existing_config():
    """Vérifie si des clés existent déjà"""
    config_path = Path("config.py")

    if config_path.exists():
        with open(config_path, 'r') as f:
            content = f.read()
            if 'APOLLOX_API_KEY = ""' not in content or 'APOLLOX_API_SECRET = ""' not in content:
                print("⚠️  Des clés API semblent déjà configurées dans config.py")
                response = input("   Voulez-vous les remplacer? (oui/non): ").lower()
                if response not in ['oui', 'o', 'yes', 'y']:
                    print("   Configuration annulée.")
                    return False
    return True

def get_api_keys():
    """Demande les clés API de manière sécurisée"""
    print("📝 Entrez vos clés API ApolloX:")
    print("   (Elles ne seront pas affichées à l'écran)")
    print()

    api_key = getpass.getpass("   API Key: ").strip()
    if not api_key:
        print("❌ API Key vide. Annulation.")
        return None, None

    api_secret = getpass.getpass("   Secret Key: ").strip()
    if not api_secret:
        print("❌ Secret Key vide. Annulation.")
        return None, None

    # Vérification basique
    if len(api_key) < 20 or len(api_secret) < 20:
        print("⚠️  Les clés semblent trop courtes. Vérifiez-les.")
        response = input("   Continuer quand même? (oui/non): ").lower()
        if response not in ['oui', 'o', 'yes', 'y']:
            return None, None

    return api_key, api_secret

def choose_storage_method():
    """Demande la méthode de stockage préférée"""
    print()
    print("📁 Méthode de stockage des clés:")
    print("   1. Fichier .env (Recommandé - Plus sécurisé)")
    print("   2. config.py (Direct - Moins sécurisé)")
    print()

    while True:
        choice = input("   Votre choix (1/2): ").strip()
        if choice in ['1', '2']:
            return choice
        print("   ⚠️  Choix invalide. Entrez 1 ou 2.")

def save_to_env(api_key, api_secret):
    """Sauvegarde dans fichier .env"""
    env_path = Path(".env")

    # Backup si existe déjà
    if env_path.exists():
        backup_path = Path(".env.backup")
        print(f"   📋 Backup de .env existant vers .env.backup")
        os.replace(env_path, backup_path)

    # Écrire nouveau .env
    with open(env_path, 'w') as f:
        f.write("# ApolloX API Configuration\n")
        f.write("# ⚠️  NE JAMAIS COMMITER CE FICHIER DANS GIT!\n\n")
        f.write(f"APOLLOX_API_KEY={api_key}\n")
        f.write(f"APOLLOX_API_SECRET={api_secret}\n")

    # Sécuriser les permissions (Unix/Linux)
    try:
        os.chmod(env_path, 0o600)  # Readable/writable par owner uniquement
        print("   🔒 Permissions sécurisées (600) appliquées")
    except:
        print("   ⚠️  Impossible de changer les permissions (Windows?)")

    # Vérifier .gitignore
    gitignore_path = Path(".gitignore")
    if gitignore_path.exists():
        with open(gitignore_path, 'r') as f:
            if '.env' not in f.read():
                with open(gitignore_path, 'a') as f:
                    f.write("\n# API Keys\n.env\n.env.backup\n")
                print("   📝 .env ajouté au .gitignore")
    else:
        with open(gitignore_path, 'w') as f:
            f.write("# API Keys\n.env\n.env.backup\n")
        print("   📝 .gitignore créé avec .env")

    print()
    print("   ✅ Clés sauvegardées dans .env")
    print()
    print("   💡 Pour utiliser .env, installez python-dotenv:")
    print("      pip install python-dotenv")
    print()
    print("   Puis modifiez apollo_client.py pour charger .env:")
    print("      from dotenv import load_dotenv")
    print("      load_dotenv()")

def save_to_config(api_key, api_secret):
    """Sauvegarde directement dans config.py"""
    config_path = Path("config.py")

    if not config_path.exists():
        print("   ❌ config.py introuvable!")
        return False

    # Backup
    backup_path = Path("config.py.backup")
    print(f"   📋 Backup de config.py vers config.py.backup")
    with open(config_path, 'r') as f:
        content = f.read()
    with open(backup_path, 'w') as f:
        f.write(content)

    # Remplacer les clés
    content = content.replace(
        'APOLLOX_API_KEY = ""',
        f'APOLLOX_API_KEY = "{api_key}"'
    )
    content = content.replace(
        'APOLLOX_API_SECRET = ""',
        f'APOLLOX_API_SECRET = "{api_secret}"'
    )

    with open(config_path, 'w') as f:
        f.write(content)

    print()
    print("   ✅ Clés sauvegardées dans config.py")
    print()
    print("   ⚠️  ATTENTION: Ne commitez JAMAIS config.py dans Git avec vos clés!")
    return True

def test_connection():
    """Propose de tester la connexion"""
    print()
    print("🔍 Voulez-vous tester la connexion maintenant?")
    response = input("   (oui/non): ").lower()

    if response in ['oui', 'o', 'yes', 'y']:
        print()
        print("   Lancement du test de connexion...")
        os.system("python3 test_api_connection.py")
    else:
        print()
        print("   Test ignoré. Vous pouvez le lancer plus tard avec:")
        print("   python3 test_api_connection.py")

def main():
    print_header()
    print_warning()

    # Vérifier config existante
    if not check_existing_config():
        return

    # Obtenir les clés
    api_key, api_secret = get_api_keys()
    if not api_key or not api_secret:
        print("\n❌ Configuration annulée.\n")
        return

    # Choisir méthode stockage
    storage_method = choose_storage_method()

    print()
    print("💾 Sauvegarde des clés...")

    # Sauvegarder
    if storage_method == '1':
        save_to_env(api_key, api_secret)
    else:
        if not save_to_config(api_key, api_secret):
            return

    # Tester connexion
    test_connection()

    print()
    print("="*80)
    print("✅ CONFIGURATION TERMINÉE!")
    print("="*80)
    print()
    print("📚 Prochaines étapes:")
    print("   1. Vérifier leverages: python3 check_leverage_limits.py")
    print("   2. Lancer backtest V10: python3 test_v10_final.py")
    print("   3. Paper trading:       python3 paper_trader_v10.py (à créer)")
    print("   4. Live trading:        python3 live_trader_v10.py (à créer)")
    print()
    print("📖 Documentation complète: cat SETUP_API.md")
    print()

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n⚠️  Configuration interrompue par l'utilisateur.\n")
        sys.exit(1)
    except Exception as e:
        print(f"\n❌ Erreur: {e}\n")
        sys.exit(1)
