#!/bin/bash
# Script de pruebas exhaustivas para make:user-account
# Uso: bash tests/test_make_user_account.sh

set -e

TIMESTAMP=$(date +%s)
PASSED=0
FAILED=0

echo "=================================="
echo "🧪 PRUEBAS EXHAUSTIVAS: make:user-account"
echo "=================================="
echo ""

# Función para limpiar usuarios de prueba
cleanup() {
    echo "🧹 Limpiando usuarios de prueba..."
    PGPASSWORD=2662 psql -U postgres -d traffic_dev -c "
        DELETE FROM drivers WHERE id IN (
            SELECT d.id FROM drivers d 
            JOIN users u ON d.id_user = u.id 
            WHERE u.email LIKE 'autotest.%@test.com'
        );
        DELETE FROM assigned_roles WHERE entity_id IN (
            SELECT id FROM users WHERE email LIKE 'autotest.%@test.com'
        );
        DELETE FROM users WHERE email LIKE 'autotest.%@test.com';
    " > /dev/null 2>&1
}

# Limpiar antes de empezar
cleanup

# Test 1: Crear VIEWER
echo "📝 Test 1: Crear usuario VIEWER..."
php artisan make:user-account autotest.viewer.$TIMESTAMP@test.com << EOF
Test Viewer
4610000001
1
EOF

if PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users u JOIN assigned_roles ar ON u.id = ar.entity_id JOIN roles r ON ar.role_id = r.id WHERE u.email = 'autotest.viewer.$TIMESTAMP@test.com' AND r.slug = 'viewer';" | grep -q "1"; then
    echo "✅ Test 1 PASÓ: Viewer creado correctamente"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 1 FALLÓ: Viewer no tiene rol correcto"
    FAILED=$((FAILED + 1))
fi
echo ""

# Test 2: Crear ADMIN
echo "📝 Test 2: Crear usuario ADMIN..."
php artisan make:user-account autotest.admin.$TIMESTAMP@test.com << EOF
Test Admin
4610000002
2
EOF

if PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users u JOIN assigned_roles ar ON u.id = ar.entity_id JOIN roles r ON ar.role_id = r.id WHERE u.email = 'autotest.admin.$TIMESTAMP@test.com' AND r.slug = 'admin';" | grep -q "1"; then
    echo "✅ Test 2 PASÓ: Admin creado correctamente"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 2 FALLÓ: Admin no tiene rol correcto"
    FAILED=$((FAILED + 1))
fi
echo ""

# Test 3: Crear OPERATIVE
echo "📝 Test 3: Crear usuario OPERATIVE..."
php artisan make:user-account autotest.operative.$TIMESTAMP@test.com << EOF
Test Operative
4610000003
3
EOF

if PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users u JOIN assigned_roles ar ON u.id = ar.entity_id JOIN roles r ON ar.role_id = r.id WHERE u.email = 'autotest.operative.$TIMESTAMP@test.com' AND r.slug = 'operative';" | grep -q "1"; then
    echo "✅ Test 3 PASÓ: Operative creado correctamente"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 3 FALLÓ: Operative no tiene rol correcto"
    FAILED=$((FAILED + 1))
fi
echo ""

# Test 4: Crear ROOT
echo "📝 Test 4: Crear usuario ROOT..."
php artisan make:user-account autotest.root.$TIMESTAMP@test.com << EOF
Test Root
4610000004
4
EOF

if PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users u JOIN assigned_roles ar ON u.id = ar.entity_id JOIN roles r ON ar.role_id = r.id WHERE u.email = 'autotest.root.$TIMESTAMP@test.com' AND r.slug = 'root';" | grep -q "1"; then
    echo "✅ Test 4 PASÓ: Root creado correctamente"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 4 FALLÓ: Root no tiene rol correcto"
    FAILED=$((FAILED + 1))
fi
echo ""

# Test 5: Crear DRIVER (con registro en tabla drivers)
echo "📝 Test 5: Crear usuario DRIVER..."
php artisan make:user-account autotest.driver.$TIMESTAMP@test.com << EOF
Test Driver
4610000005
0
LICENSE_AUTO_TEST
CARD_AUTO_TEST
EOF

# Verificar que se creó user Y driver
if PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users u JOIN drivers d ON u.id = d.id_user WHERE u.email = 'autotest.driver.$TIMESTAMP@test.com' AND u.id_role = 4 AND d.license = 'LICENSE_AUTO_TEST';" | grep -q "1"; then
    echo "✅ Test 5 PASÓ: Driver creado con registro en tabla drivers"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 5 FALLÓ: Driver no tiene registro completo"
    FAILED=$((FAILED + 1))
fi
echo ""

# Test 6: Verificar que todos tienen campo phone
echo "📝 Test 6: Verificar campo phone obligatorio..."
COUNT=$(PGPASSWORD=2662 psql -U postgres -d traffic_dev -t -c "SELECT COUNT(*) FROM users WHERE email LIKE 'autotest.%.$TIMESTAMP@test.com' AND phone IS NOT NULL AND phone != '';" | tr -d ' ')
if [ "$COUNT" = "5" ]; then
    echo "✅ Test 6 PASÓ: Todos los usuarios tienen phone"
    PASSED=$((PASSED + 1))
else
    echo "❌ Test 6 FALLÓ: Algunos usuarios no tienen phone ($COUNT/5)"
    FAILED=$((FAILED + 1))
fi
echo ""

# Limpiar al final
cleanup

# Resumen
echo "=================================="
echo "📊 RESUMEN DE PRUEBAS"
echo "=================================="
echo "✅ Pruebas exitosas: $PASSED"
echo "❌ Pruebas fallidas: $FAILED"
echo "📈 Total: $((PASSED + FAILED))"
echo ""

if [ $FAILED -eq 0 ]; then
    echo "🎉 TODAS LAS PRUEBAS PASARON"
    exit 0
else
    echo "⚠️  ALGUNAS PRUEBAS FALLARON"
    exit 1
fi
