#!/bin/bash

# ============================================================================
# Test de Coherencia: Sistema Híbrido de Roles
# ============================================================================
# 
# Valida que usuarios web mantengan coherencia entre:
# - id_role (sistema legacy)
# - assigned_roles (sistema Bouncer)
# 
# Autor: Alberto Granados
# Fecha: 19-Nov-2025
# ============================================================================

set -e

TIMESTAMP=$(date +%s)
DB_NAME="traffic_dev"
DB_USER="postgres"

echo "🧪 TEST DE COHERENCIA: Sistema Híbrido de Roles"
echo "================================================"
echo ""

# ============================================================================
# LIMPIAR DATOS DE PRUEBA ANTERIORES
# ============================================================================
echo "🧹 Limpiando datos de prueba anteriores..."
psql -U $DB_USER -d $DB_NAME -c "
    DELETE FROM drivers WHERE id_user IN (SELECT id FROM users WHERE email LIKE 'coherence.test.%@test.com');
    DELETE FROM users WHERE email LIKE 'coherence.test.%@test.com';
" > /dev/null 2>&1
echo "✅ Limpieza completada"
echo ""

# ============================================================================
# FUNCIÓN: Crear usuario y validar coherencia
# ============================================================================
test_user_coherence() {
    local USER_TYPE=$1
    local TYPE_INDEX=$2
    local EMAIL="coherence.test.${USER_TYPE}.${TIMESTAMP}@test.com"
    local NAME="Coherence Test $(echo $USER_TYPE | tr '[:lower:]' '[:upper:]')"
    local PHONE="461999$(printf %04d $RANDOM)"
    
    echo "📝 Test: Crear usuario tipo '${USER_TYPE}'"
    
    # Crear usuario usando índice numérico para el choice
    if [ "$USER_TYPE" == "driver" ]; then
        echo -e "${NAME}\n${PHONE}\n0\nLICENSE_TEST_${TIMESTAMP}\nCARD_TEST_${TIMESTAMP}" | \
            php artisan make:user-account "$EMAIL" > /tmp/test_coherence_output.txt 2>&1
    else
        echo -e "${NAME}\n${PHONE}\n${TYPE_INDEX}" | \
            php artisan make:user-account "$EMAIL" > /tmp/test_coherence_output.txt 2>&1
    fi
    
    if [ $? -ne 0 ]; then
        echo "❌ Error al crear usuario tipo '${USER_TYPE}'"
        return 1
    fi
    
    # Validar coherencia en BD con formato CSV
    QUERY="SELECT 
        r.slug,
        COALESCE(br.slug, 'N/A'),
        CASE 
            WHEN r.slug = br.slug THEN 'COHERENT'
            WHEN '$USER_TYPE' = 'driver' AND br.slug IS NULL AND r.slug = 'driver' THEN 'COHERENT'
            ELSE 'INCOHERENT'
        END
    FROM users u
    LEFT JOIN roles r ON u.id_role = r.id
    LEFT JOIN assigned_roles ar ON u.id = ar.entity_id AND ar.entity_type = 'App\User'
    LEFT JOIN roles br ON ar.role_id = br.id
    WHERE u.email = '$EMAIL'"
    
    RESULT=$(psql -U $DB_USER -d $DB_NAME -t -A -F'|' -c "$QUERY")
    ID_ROLE_SLUG=$(echo "$RESULT" | cut -d'|' -f1 | xargs)
    BOUNCER_SLUG=$(echo "$RESULT" | cut -d'|' -f2 | xargs)
    COHERENCE=$(echo "$RESULT" | cut -d'|' -f3 | xargs)
    
    if [ -z "$BOUNCER_SLUG" ]; then
        BOUNCER_SLUG="(N/A)"
    fi
    
    if [ "$COHERENCE" == "COHERENT" ]; then
        echo "   ✅ Usuario creado correctamente"
        echo "   📊 id_role: $ID_ROLE_SLUG | Bouncer: $BOUNCER_SLUG"
        echo "   🎯 Coherencia: ✅ COHERENTE"
        return 0
    else
        echo "   ❌ FALLO: Incoherencia detectada"
        echo "   📊 id_role: $ID_ROLE_SLUG | Bouncer: $BOUNCER_SLUG"
        echo "   🎯 Coherencia: ❌ INCOHERENTE"
        return 1
    fi
}

# ============================================================================
# EJECUTAR TESTS
# ============================================================================
TESTS_PASSED=0
TESTS_FAILED=0

echo "🔬 INICIANDO TESTS DE COHERENCIA"
echo "================================="
echo ""

# Test 1: Root (índice 4)
if test_user_coherence "root" "4"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
fi
echo ""

# Test 2: Admin (índice 2)
if test_user_coherence "admin" "2"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
fi
echo ""

# Test 3: Operative (índice 3)
if test_user_coherence "operative" "3"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
fi
echo ""

# Test 4: Viewer (índice 1)
if test_user_coherence "viewer" "1"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
fi
echo ""

# Test 5: Driver (índice 0)
if test_user_coherence "driver" "0"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
fi
echo ""

# ============================================================================
# VALIDACIÓN ADICIONAL: Verificar todos los usuarios de prueba
# ============================================================================
echo "🔍 VALIDACIÓN ADICIONAL: Coherencia general"
echo "==========================================="

INCOHERENT_COUNT=$(psql -U $DB_USER -d $DB_NAME -t -c "
SELECT COUNT(*) 
FROM users u
JOIN roles r ON u.id_role = r.id
LEFT JOIN assigned_roles ar ON u.id = ar.entity_id AND ar.entity_type = 'App\User'
LEFT JOIN roles br ON ar.role_id = br.id
WHERE u.email LIKE 'coherence.test.%@test.com'
  AND r.slug != COALESCE(br.slug, r.slug)
" | xargs)

echo "   📊 Usuarios incoherentes: $INCOHERENT_COUNT"

if [ "$INCOHERENT_COUNT" -eq 0 ]; then
    echo "   ✅ Todos los usuarios mantienen coherencia"
else
    echo "   ❌ Se detectaron $INCOHERENT_COUNT usuarios incoherentes"
    ((TESTS_FAILED++))
fi
echo ""

# ============================================================================
# LIMPIAR DATOS DE PRUEBA
# ============================================================================
echo "🧹 Limpiando datos de prueba..."
psql -U $DB_USER -d $DB_NAME -c "
    DELETE FROM drivers WHERE id_user IN (SELECT id FROM users WHERE email LIKE 'coherence.test.%@test.com');
    DELETE FROM users WHERE email LIKE 'coherence.test.%@test.com';
" > /dev/null 2>&1
echo "✅ Limpieza completada"
echo ""

# ============================================================================
# RESUMEN FINAL
# ============================================================================
echo "📊 RESUMEN DE PRUEBAS"
echo "====================="
echo "✅ Pruebas exitosas: $TESTS_PASSED"
echo "❌ Pruebas fallidas: $TESTS_FAILED"
echo "📈 Total: $((TESTS_PASSED + TESTS_FAILED))"
echo ""

if [ $TESTS_FAILED -eq 0 ]; then
    echo "🎉 TODAS LAS PRUEBAS PASARON"
    echo "✅ Sistema híbrido de roles funciona correctamente"
    echo "✅ Coherencia entre id_role y Bouncer validada"
    exit 0
else
    echo "❌ ALGUNAS PRUEBAS FALLARON"
    echo "⚠️  Revisar el comando make:user-account"
    exit 1
fi
