#!/bin/bash

# Script de validation automatique pour les features
# Usage: ./scripts/validate-feature.sh [feature-name]

set -e

FEATURE_NAME="${1:-unknown}"
VALIDATION_DIR="docs/validations"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
VALIDATION_FILE="${VALIDATION_DIR}/${FEATURE_NAME}_${TIMESTAMP}.md"

# Couleurs pour l'output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}🔍 Validation de la feature: ${FEATURE_NAME}${NC}"
echo ""

# Créer le répertoire de validation si nécessaire
mkdir -p "${VALIDATION_DIR}"

# Fonction pour vérifier si une commande existe
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Fonction pour vérifier le statut d'un service
check_service() {
    local service=$1
    local port=$2
    
    if command_exists curl; then
        if curl -s "http://localhost:${port}/api/v1/health" > /dev/null 2>&1; then
            echo -e "${GREEN}✅ ${service} est accessible sur le port ${port}${NC}"
            return 0
        else
            echo -e "${RED}❌ ${service} n'est pas accessible sur le port ${port}${NC}"
            return 1
        fi
    else
        echo -e "${YELLOW}⚠️  curl n'est pas installé, impossible de vérifier ${service}${NC}"
        return 1
    fi
}

# Fonction pour vérifier les tests
check_tests() {
    local test_type=$1
    local test_command=$2
    
    echo -e "${YELLOW}🧪 Exécution des tests ${test_type}...${NC}"
    
    if eval "$test_command" > /dev/null 2>&1; then
        echo -e "${GREEN}✅ Tests ${test_type} passent${NC}"
        return 0
    else
        echo -e "${RED}❌ Tests ${test_type} échouent${NC}"
        return 1
    fi
}

# Fonction pour vérifier la compilation
check_compilation() {
    local project=$1
    local compile_command=$2
    
    echo -e "${YELLOW}🔨 Vérification de la compilation ${project}...${NC}"
    
    if eval "$compile_command" > /dev/null 2>&1; then
        echo -e "${GREEN}✅ ${project} compile sans erreurs${NC}"
        return 0
    else
        echo -e "${RED}❌ ${project} ne compile pas${NC}"
        return 1
    fi
}

# Fonction pour vérifier les linters
check_linter() {
    local project=$1
    local linter_command=$2
    
    echo -e "${YELLOW}🔍 Vérification du linter ${project}...${NC}"
    
    if eval "$linter_command" > /dev/null 2>&1; then
        echo -e "${GREEN}✅ ${project} passe le linter${NC}"
        return 0
    else
        echo -e "${RED}❌ ${project} ne passe pas le linter${NC}"
        return 1
    fi
}

# Initialiser le fichier de validation
cat > "${VALIDATION_FILE}" << EOF
# Validation: ${FEATURE_NAME}

**Date**: $(date)
**Validateur**: Automatique (script)

## Résultats de validation

EOF

# Vérifications Backend
echo -e "\n${YELLOW}📦 Vérifications Backend${NC}"
echo ""

BACKEND_OK=true

# Vérifier la compilation Go
if check_compilation "Backend Go" "cd veza-backend-api && go build -o /dev/null ./..."; then
    echo "- [x] Backend compile sans erreurs" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Backend compile sans erreurs" >> "${VALIDATION_FILE}"
    BACKEND_OK=false
fi

# Vérifier le linter Go
if check_linter "Backend Go" "cd veza-backend-api && golangci-lint run --timeout=5m" 2>/dev/null; then
    echo "- [x] Backend passe le linter" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Backend passe le linter (optionnel)" >> "${VALIDATION_FILE}"
fi

# Vérifier les tests Go
if check_tests "Backend" "cd veza-backend-api && go test ./... -short"; then
    echo "- [x] Tests backend passent" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Tests backend passent" >> "${VALIDATION_FILE}"
    BACKEND_OK=false
fi

# Vérifier que le backend est accessible
if check_service "Backend API" "8080"; then
    echo "- [x] Backend API accessible" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Backend API accessible" >> "${VALIDATION_FILE}"
    BACKEND_OK=false
fi

# Vérifications Frontend
echo -e "\n${YELLOW}🎨 Vérifications Frontend${NC}"
echo ""

FRONTEND_OK=true

# Vérifier la compilation TypeScript
if check_compilation "Frontend" "cd apps/web && npm run build" 2>/dev/null; then
    echo "- [x] Frontend compile sans erreurs" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Frontend compile sans erreurs" >> "${VALIDATION_FILE}"
    FRONTEND_OK=false
fi

# Vérifier le linter TypeScript
if check_linter "Frontend" "cd apps/web && npm run lint" 2>/dev/null; then
    echo "- [x] Frontend passe le linter" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Frontend passe le linter (optionnel)" >> "${VALIDATION_FILE}"
fi

# Vérifier les tests Frontend
if check_tests "Frontend" "cd apps/web && npm test -- --passWithNoTests" 2>/dev/null; then
    echo "- [x] Tests frontend passent" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Tests frontend passent" >> "${VALIDATION_FILE}"
    FRONTEND_OK=false
fi

# Vérifier que le frontend est accessible
if check_service "Frontend" "3000"; then
    echo "- [x] Frontend accessible" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Frontend accessible" >> "${VALIDATION_FILE}"
    FRONTEND_OK=false
fi

# Vérifications Services
echo -e "\n${YELLOW}🔧 Vérifications Services${NC}"
echo ""

SERVICES_OK=true

# Vérifier PostgreSQL
if command_exists psql; then
    if psql -h localhost -U veza_user -d veza_db -c "SELECT 1;" > /dev/null 2>&1; then
        echo -e "${GREEN}✅ PostgreSQL est accessible${NC}"
        echo "- [x] PostgreSQL accessible" >> "${VALIDATION_FILE}"
    else
        echo -e "${RED}❌ PostgreSQL n'est pas accessible${NC}"
        echo "- [ ] PostgreSQL accessible" >> "${VALIDATION_FILE}"
        SERVICES_OK=false
    fi
else
    echo -e "${YELLOW}⚠️  psql n'est pas installé, impossible de vérifier PostgreSQL${NC}"
    echo "- [ ] PostgreSQL accessible (psql non disponible)" >> "${VALIDATION_FILE}"
fi

# Vérifier Redis
if check_service "Redis" "6379"; then
    echo "- [x] Redis accessible" >> "${VALIDATION_FILE}"
else
    echo "- [ ] Redis accessible" >> "${VALIDATION_FILE}"
    SERVICES_OK=false
fi

# Résumé
echo -e "\n${YELLOW}📊 Résumé${NC}"
echo ""

cat >> "${VALIDATION_FILE}" << EOF

## Résumé

- Backend: $([ "$BACKEND_OK" = true ] && echo "✅ OK" || echo "❌ ÉCHEC")
- Frontend: $([ "$FRONTEND_OK" = true ] && echo "✅ OK" || echo "❌ ÉCHEC")
- Services: $([ "$SERVICES_OK" = true ] && echo "✅ OK" || echo "❌ ÉCHEC")

## Notes

⚠️ **IMPORTANT**: Cette validation automatique ne remplace PAS la validation manuelle dans le navigateur.
Vous DEVEZ tester la feature manuellement avant de la marquer comme complétée.

Consultez \`docs/ORIGIN/ORIGIN_FEATURE_VALIDATION_STRATEGY.md\` pour la checklist complète.
EOF

if [ "$BACKEND_OK" = true ] && [ "$FRONTEND_OK" = true ] && [ "$SERVICES_OK" = true ]; then
    echo -e "${GREEN}✅ Toutes les vérifications automatiques sont passées${NC}"
    echo -e "${YELLOW}⚠️  N'oubliez pas de tester manuellement dans le navigateur !${NC}"
    echo ""
    echo "Fichier de validation créé: ${VALIDATION_FILE}"
    exit 0
else
    echo -e "${RED}❌ Certaines vérifications ont échoué${NC}"
    echo ""
    echo "Fichier de validation créé: ${VALIDATION_FILE}"
    exit 1
fi

