"""
Script d'analyse de traçabilité des actions joueurs
Vérifie ce qui peut être détecté et ce qui manque pour la détection de triche
"""
import mysql.connector
import json
from datetime import datetime, timedelta
from python.db_config import DB_CONFIG

conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor(dictionary=True)

print("=" * 80)
print("ANALYSE COMPLÈTE DE TRAÇABILITÉ - DÉTECTION TRICHE/HACK")
print("=" * 80)

# 1. Ce qui EST tracé actuellement
print("\n" + "=" * 80)
print("✅ CE QUI EST ACTUELLEMENT TRACÉ")
print("=" * 80)

tracked_actions = [
    ("audit_log.progress.increment", "Chaque niveau complété (difficulté, level_id)"),
    ("audit_log.stats.level.complete", "Stats de completion (moves, time)"),
    ("audit_log.wallet.reward", "Points gagnés après niveau"),
    ("audit_log.wallet.consume", "Utilisation hints/undos/replays"),
    ("audit_log.wallet.purchase", "Achats de consommables"),
    ("audit_log.auth.login/register", "Connexions avec IP et user_agent"),
    ("audit_log.auth.refresh", "Rafraîchissement de session"),
    ("audit_log.settings.update", "Changements de paramètres"),
    ("audit_log.daily.complete", "Défi quotidien complété"),
    ("audit_log.weekly.complete", "Défi hebdo complété"),
    ("audit_log.ads.daily_reward", "Pub visionnée pour récompense"),
    ("level_stats", "Best moves/time par niveau (historique)"),
    ("recent_runs", "Dernières 20 parties (moves, time, timestamp)"),
    ("progress", "Compteur niveaux complétés par difficulté"),
    ("wallets", "État actuel du portefeuille"),
    ("payment_transactions", "Toutes les transactions Stripe"),
    ("refresh_tokens", "Sessions actives/révoquées"),
]

for action, desc in tracked_actions:
    print(f"   ✅ {action}")
    print(f"      └─ {desc}")

# 2. Indicateurs de triche détectables
print("\n" + "=" * 80)
print("🔍 INDICATEURS DE TRICHE DÉTECTABLES AVEC LA STRUCTURE ACTUELLE")
print("=" * 80)

detectable = [
    ("Temps impossibles", "recent_runs.time < minimum_théorique", "Si un niveau expert est fait en 1 seconde"),
    ("Moves impossibles", "recent_runs.moves < minimum_théorique", "Niveau fait en moins de moves que le minimum"),
    ("Progression anormale", "progress.completed saute de valeur", "Passe de 10 à 200 niveaux d'un coup"),
    ("Wallet manipulation", "wallets.hints augmente sans achat/reward", "Hints qui apparaissent sans source"),
    ("Multi-comptes IP", "audit_log.ip avec plusieurs user_id", "Même IP pour plusieurs comptes"),
    ("Session suspecte", "refresh_tokens créés trop rapidement", "Beaucoup de sessions en peu de temps"),
    ("Farming de points", "wallet.reward trop fréquent", "Points gagnés à vitesse impossible"),
]

for name, method, example in detectable:
    print(f"\n   🔍 {name}")
    print(f"      Méthode: {method}")
    print(f"      Exemple: {example}")

# 3. Ce qui MANQUE pour une détection complète
print("\n" + "=" * 80)
print("❌ CE QUI MANQUE POUR UNE DÉTECTION COMPLÈTE")
print("=" * 80)

missing = [
    ("Historique wallet détaillé", "On a l'état actuel mais pas l'historique des changements"),
    ("Timestamp de chaque action in-game", "On sait qu'un niveau est fait mais pas le détail du gameplay"),
    ("Validation côté serveur des moves", "Les moves ne sont pas validés, juste enregistrés"),
    ("Hash/signature des parties", "Pas de preuve cryptographique de légitimité"),
    ("Device fingerprint", "On a l'IP mais pas d'identifiant unique de device"),
    ("Logs de requêtes API", "Pas de log de toutes les requêtes, juste les actions importantes"),
    ("Détection de mémoire modifiée", "Impossible côté serveur de détecter modification client"),
    ("Rate limiting par action", "Pas de limite sur le nombre de niveaux/heure"),
]

for name, desc in missing:
    print(f"\n   ❌ {name}")
    print(f"      └─ {desc}")

# 4. Exemple concret - Chercher des anomalies
print("\n" + "=" * 80)
print("🚨 RECHERCHE D'ANOMALIES RÉELLES DANS LA BASE")
print("=" * 80)

# Temps de completion suspects (< 5 secondes pour un niveau)
print("\n📊 Parties avec temps suspect (< 5 secondes):")
cursor.execute("""
    SELECT user_id, difficulty, level_id, moves, time, completed_at 
    FROM recent_runs 
    WHERE time < 5000 
    ORDER BY time ASC 
    LIMIT 10
""")
suspicious_times = cursor.fetchall()
if suspicious_times:
    for r in suspicious_times:
        print(f"   ⚠️ User #{r['user_id']} | {r['difficulty']} L{r['level_id']} | {r['time']}ms | {r['moves']} moves")
else:
    print("   ✅ Aucune partie suspecte trouvée")

# Progression anormalement élevée
print("\n📊 Joueurs avec progression anormale (>100 niveaux easy):")
cursor.execute("""
    SELECT p.user_id, u.display_name, p.difficulty, p.completed
    FROM progress p
    JOIN users u ON u.id = p.user_id
    WHERE p.completed > 100
    ORDER BY p.completed DESC
    LIMIT 10
""")
high_progress = cursor.fetchall()
for p in high_progress:
    print(f"   ℹ️ #{p['user_id']} {p['display_name'] or 'Anonyme'} | {p['difficulty']}: {p['completed']} niveaux")

# IPs avec plusieurs comptes
print("\n📊 IPs utilisées par plusieurs comptes:")
cursor.execute("""
    SELECT ip, COUNT(DISTINCT user_id) as user_count, GROUP_CONCAT(DISTINCT user_id) as users
    FROM audit_log
    WHERE ip IS NOT NULL AND ip != ''
    GROUP BY ip
    HAVING user_count > 1
    ORDER BY user_count DESC
    LIMIT 5
""")
multi_ips = cursor.fetchall()
if multi_ips:
    for ip in multi_ips:
        print(f"   ⚠️ IP {ip['ip']} → {ip['user_count']} comptes (IDs: {ip['users']})")
else:
    print("   ✅ Pas de multi-comptes détectés par IP")

# Wallets avec valeurs anormales
print("\n📊 Wallets avec valeurs inhabituelles:")
cursor.execute("""
    SELECT w.user_id, u.display_name, w.points, w.hints, w.undos, w.replays
    FROM wallets w
    JOIN users u ON u.id = w.user_id
    WHERE w.hints > 50 OR w.undos > 50 OR w.replays > 50 OR w.points > 100000
    ORDER BY w.hints + w.undos + w.replays DESC
    LIMIT 10
""")
high_wallets = cursor.fetchall()
if high_wallets:
    for w in high_wallets:
        print(f"   ℹ️ #{w['user_id']} {w['display_name'] or 'Anonyme'} | Points: {w['points']} | Hints: {w['hints']} | Undos: {w['undos']}")
else:
    print("   ✅ Aucun wallet suspect")

print("\n" + "=" * 80)
print("RÉSUMÉ")
print("=" * 80)
print("""
📊 CAPACITÉ DE TRAÇAGE ACTUELLE: ~70%

✅ Points forts:
   - Audit log complet des actions principales
   - IP tracking sur chaque action
   - Stats de gameplay enregistrées
   - Transactions financières tracées

❌ Faiblesses:
   - Pas de validation serveur des parties
   - Historique wallet non détaillé
   - Pas de device fingerprint
   - Pas de signature cryptographique

💡 RECOMMANDATIONS PRIORITAIRES:
   1. Ajouter table wallet_history pour tracer chaque +/-
   2. Ajouter validation côté serveur du temps minimum par niveau
   3. Implémenter rate limiting par action
   4. Ajouter device_id dans audit_log
""")

conn.close()
