#!/usr/bin/env python3
"""
Test d'authentification sur le REALM UNIONFLOW (pas master)
"""

import requests
import json

class UnionflowRealmTester:
    def __init__(self, base_url: str = "http://localhost:8180"):
        self.base_url = base_url
        self.session = requests.Session()
        
    def test_user_on_unionflow_realm(self, username: str, password: str) -> bool:
        """Teste l'authentification d'un utilisateur sur le realm UNIONFLOW"""
        print(f"🧪 Test de {username} sur le realm UNIONFLOW...")
        
        # URL correcte pour le realm unionflow
        token_url = f"{self.base_url}/realms/unionflow/protocol/openid-connect/token"
        
        data = {
            "username": username,
            "password": password,
            "grant_type": "password",
            "client_id": "unionflow-mobile"
        }
        
        print(f"   📍 URL: {token_url}")
        print(f"   📋 Données: username={username}, client_id=unionflow-mobile")
        
        try:
            response = self.session.post(
                token_url,
                data=data,
                headers={"Content-Type": "application/x-www-form-urlencoded"}
            )
            
            print(f"   📊 Status: {response.status_code}")
            
            if response.status_code == 200:
                token_data = response.json()
                if "access_token" in token_data:
                    print(f"   ✅ {username} FONCTIONNE sur le realm unionflow !")
                    print(f"   🎫 Token reçu (longueur: {len(token_data['access_token'])})")
                    
                    # Décoder le token pour voir les infos
                    try:
                        import base64
                        # Décoder le payload du JWT (partie du milieu)
                        token_parts = token_data['access_token'].split('.')
                        if len(token_parts) >= 2:
                            # Ajouter du padding si nécessaire
                            payload = token_parts[1]
                            payload += '=' * (4 - len(payload) % 4)
                            decoded = base64.b64decode(payload)
                            token_info = json.loads(decoded)
                            print(f"   👤 Utilisateur: {token_info.get('preferred_username', 'N/A')}")
                            print(f"   🏛️ Realm: {token_info.get('iss', 'N/A').split('/')[-1]}")
                            print(f"   📧 Email: {token_info.get('email', 'N/A')}")
                            if 'realm_access' in token_info and 'roles' in token_info['realm_access']:
                                roles = token_info['realm_access']['roles']
                                print(f"   🎭 Rôles: {', '.join(roles)}")
                    except:
                        pass
                    
                    return True
                else:
                    print(f"   ❌ Token manquant dans la réponse")
            else:
                print(f"   ❌ Authentification échouée")
                print(f"   📄 Réponse: {response.text}")
            
        except Exception as e:
            print(f"   ❌ Exception: {e}")
        
        return False
    
    def test_all_unionflow_accounts(self):
        """Teste tous les comptes sur le realm unionflow"""
        print("=" * 80)
        print("🧪 TEST D'AUTHENTIFICATION SUR LE REALM UNIONFLOW")
        print("=" * 80)
        print()
        
        # Vérifier que le realm unionflow est accessible
        try:
            realm_response = self.session.get(f"{self.base_url}/realms/unionflow")
            if realm_response.status_code == 200:
                print("✅ Realm unionflow accessible")
            else:
                print(f"❌ Realm unionflow non accessible: {realm_response.status_code}")
                return False
        except:
            print("❌ Erreur accès realm unionflow")
            return False
        
        print()
        
        # Tester tous les comptes créés
        users = [
            ("marie.active", "Marie123!"),
            ("superadmin", "SuperAdmin123!"),
            ("jean.simple", "Jean123!"),
            ("tech.lead", "TechLead123!"),
            ("rh.manager", "RhManager123!")
        ]
        
        success_count = 0
        working_users = []
        
        for username, password in users:
            if self.test_user_on_unionflow_realm(username, password):
                success_count += 1
                working_users.append((username, password))
            print()
        
        print("=" * 80)
        print(f"📊 RÉSULTAT FINAL SUR LE REALM UNIONFLOW")
        print("=" * 80)
        print(f"✅ {success_count}/{len(users)} comptes fonctionnent sur le realm unionflow")
        print()
        
        if success_count > 0:
            print("🎉 COMPTES QUI FONCTIONNENT SUR LE REALM UNIONFLOW :")
            print()
            for username, password in working_users:
                print(f"   ✅ {username} / {password}")
            
            print()
            print("🚀 VOTRE APPLICATION MOBILE PEUT MAINTENANT S'AUTHENTIFIER !")
            print()
            print("📱 PARAMÈTRES POUR L'APPLICATION :")
            print(f"   • Keycloak URL: {self.base_url}")
            print("   • Realm: unionflow")
            print("   • Client ID: unionflow-mobile")
            print(f"   • Utilisateur de test: {working_users[0][0]}")
            print(f"   • Mot de passe: {working_users[0][1]}")
            print()
            print("✅ TOUS LES COMPTES UNIONFLOW SONT OPÉRATIONNELS !")
            
        else:
            print("❌ Aucun compte ne fonctionne sur le realm unionflow")
            print()
            print("🔧 DIAGNOSTIC :")
            print("   Les comptes existent mais les mots de passe ne correspondent pas.")
            print("   Solution : configuration manuelle dans l'interface Keycloak")
            print()
            print("📋 ÉTAPES MANUELLES :")
            print("1. Ouvrez http://localhost:8180/admin/")
            print("2. Connectez-vous avec admin/admin")
            print("3. Sélectionnez le realm 'unionflow' (pas master !)")
            print("4. Allez dans Users > marie.active")
            print("5. Onglet Credentials > Set password")
            print("6. Entrez 'Marie123!' et décochez 'Temporary'")
            print("7. Testez avec: python test_unionflow_realm.py")
        
        return success_count > 0


def main():
    tester = UnionflowRealmTester()
    tester.test_all_unionflow_accounts()


if __name__ == "__main__":
    main()
