package com.social.media;

import com.social.media.service.UserCredentialsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

/**
 * Script para desbloquear conta e resetar tentativas falhadas
 */
@SpringBootTest
@Transactional
public class UnlockAccountTest {
    
    @Autowired
    private UserCredentialsService userCredentialsService;
    
    @Test
    public void unlockAccountAndResetFailedAttempts() {
        System.out.println("=== DESBLOQUEANDO CONTA E RESETANDO TENTATIVAS ===");
        
        // Lista de IDs de usuários para desbloquear
        Long[] userIds = {1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L};
        
        for (Long userId : userIds) {
            try {
                System.out.println("\n--- Processando usuário ID: " + userId + " ---");
                
                // Verificar se o usuário tem credenciais
                var credentialsOpt = userCredentialsService.findByUserId(userId);
                if (credentialsOpt.isPresent()) {
                    var credentials = credentialsOpt.get();
                    
                    System.out.println("Status atual:");
                    System.out.println("  Conta bloqueada: " + credentials.getIsAccountLocked());
                    System.out.println("  Bloqueio permanente: " + credentials.getIsPermanentlyLocked());
                    System.out.println("  Tentativas falhadas: " + credentials.getFailedLoginAttempts());
                    System.out.println("  Tempo restante bloqueio: " + credentials.getRemainingLockoutMinutes() + " min");
                    
                    boolean needsUnlock = false;
                    
                    // 1. Desbloquear conta se estiver bloqueada
                    if (Boolean.TRUE.equals(credentials.getIsAccountLocked()) || 
                        Boolean.TRUE.equals(credentials.getIsPermanentlyLocked()) ||
                        (credentials.getRemainingLockoutMinutes() != null && credentials.getRemainingLockoutMinutes() > 0)) {
                        
                        System.out.println("  ➤ Desbloqueando conta...");
                        userCredentialsService.unlockAccount(userId);
                        needsUnlock = true;
                    }
                    
                    // 2. Resetar tentativas falhadas se houver
                    if (credentials.getFailedLoginAttempts() != null && credentials.getFailedLoginAttempts() > 0) {
                        System.out.println("  ➤ Resetando tentativas falhadas...");
                        userCredentialsService.resetFailedAttempts(userId);
                        needsUnlock = true;
                    }
                    
                    if (needsUnlock) {
                        // Verificar status após desbloqueio
                        var updatedCredentials = userCredentialsService.findByUserId(userId).orElse(null);
                        if (updatedCredentials != null) {
                            System.out.println("Status após desbloqueio:");
                            System.out.println("  Conta bloqueada: " + updatedCredentials.getIsAccountLocked());
                            System.out.println("  Tentativas falhadas: " + updatedCredentials.getFailedLoginAttempts());
                            System.out.println("  ✅ Conta desbloqueada com sucesso!");
                        }
                    } else {
                        System.out.println("  ✅ Conta já estava desbloqueada");
                    }
                    
                } else {
                    System.out.println("  ❌ Credenciais não encontradas para usuário ID: " + userId);
                }
                
            } catch (Exception e) {
                System.out.println("  ❌ Erro ao processar usuário ID " + userId + ": " + e.getMessage());
            }
        }
        
        System.out.println("\n=== PROCESSO DE DESBLOQUEIO CONCLUÍDO ===");
        
        // Agora testar autenticação novamente
        testAuthenticationAfterUnlock();
    }
    
    private void testAuthenticationAfterUnlock() {
        System.out.println("\n=== TESTANDO AUTENTICAÇÃO APÓS DESBLOQUEIO ===");
        
        String testPassword = "Leader@2025!Strong#Pass";
        
        // Testar para os primeiros usuários
        for (Long userId = 1L; userId <= 5L; userId++) {
            try {
                var credentialsOpt = userCredentialsService.findByUserId(userId);
                if (credentialsOpt.isPresent()) {
                    System.out.println("\nTestando usuário ID: " + userId);
                    
                    boolean authResult = userCredentialsService.authenticate(userId, testPassword);
                    System.out.println("  Resultado da autenticação: " + (authResult ? "✅ SUCESSO" : "❌ FALHA"));
                    
                    if (authResult) {
                        System.out.println("  🎉 USUÁRIO ENCONTRADO COM A SENHA CORRETA!");
                        System.out.println("  📝 Este é o usuário que você deve usar para fazer login");
                        
                        // Mostrar informações do usuário se possível
                        return; // Parar no primeiro sucesso
                    }
                }
            } catch (Exception e) {
                System.out.println("  Erro ao testar usuário ID " + userId + ": " + e.getMessage());
            }
        }
        
        System.out.println("\n❌ Nenhum usuário autenticado com sucesso após desbloqueio");
        System.out.println("💡 A senha pode não pertencer aos usuários testados");
    }
    
    @Test
    public void resetSpecificUser() {
        System.out.println("=== RESETANDO USUÁRIO ESPECÍFICO ===");
        
        // Se você souber o ID do usuário específico, mude aqui
        Long specificUserId = 1L; // Ajuste conforme necessário
        
        try {
            System.out.println("Resetando usuário ID: " + specificUserId);
            
            // Desbloquear
            userCredentialsService.unlockAccount(specificUserId);
            System.out.println("✅ Conta desbloqueada");
            
            // Resetar tentativas
            userCredentialsService.resetFailedAttempts(specificUserId);
            System.out.println("✅ Tentativas falhadas resetadas");
            
            // Testar autenticação
            boolean authResult = userCredentialsService.authenticate(specificUserId, "Leader@2025!Strong#Pass");
            System.out.println("Resultado da autenticação: " + (authResult ? "✅ SUCESSO" : "❌ FALHA"));
            
        } catch (Exception e) {
            System.out.println("❌ Erro: " + e.getMessage());
        }
    }
}
