#!/bin/bash
# check-sprint10.sh — Vérification Sprint 10 Backend (doc-service M4)
# Usage : bash check-sprint10.sh (depuis ~/digital-workspace-backend)
cd ~/digital-workspace-backend
PASS=0; FAIL=0; WARN=0
green()  { echo "  ✅ $1"; ((PASS++)); }
red()    { echo "  ❌ $1"; ((FAIL++)); }
yellow() { echo "  ⚠️  $1"; ((WARN++)); }
section(){ echo ""; echo "$1"; }

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  Digital Workspace — Checklist Sprint 10 Backend"
echo "  CDC v6.4 · DataFlow v2.3 · doc-service (M4)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# ─── 1. Migrations ────────────────────────────────────────────
section "1. doc-service — Migrations tenant-aware"
MD="services/doc-service/database/migrations/tenant"
for m in "t_documents" "t_document_versions" "t_wiki_pages" "t_contracts" "t_doc_permissions"; do
  if ls "${MD}"/*${m}* 2>/dev/null | grep -q .; then
    SIZE=$(wc -c < "$(ls ${MD}/*${m}* | head -1)")
    if [ "$SIZE" -gt 100 ]; then green "Migration : $m ($SIZE bytes)"
    else red "Migration : $m — fichier vide"; fi
  else red "Migration MANQUANTE : $m"; fi
done

# ─── 2. Tables en base ────────────────────────────────────────
section "2. Tables schéma tenant (doc-service)"
echo "  → Vérification dans test-sprint1..."
cd services/auth-service
TABLES=$(php -r "
chdir('/home/fanta/digital-workspace-backend/services/auth-service');
require 'vendor/autoload.php';
\$app = require 'bootstrap/app.php';
\$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
\$t = App\Models\Central\Tenant::find('test-sprint1');
if (!\$t) { echo 'NO_TENANT'; exit; }
tenancy()->initialize(\$t);
foreach (['t_documents','t_document_versions','t_wiki_pages','t_contracts','t_doc_permissions'] as \$tbl) {
    echo (Schema::hasTable(\$tbl) ? 'OK' : 'MISS') . ':' . \$tbl . PHP_EOL;
}
tenancy()->end();
" 2>/dev/null)
cd ~/digital-workspace-backend
if echo "$TABLES" | grep -q "NO_TENANT"; then
  yellow "Tenant test-sprint1 non trouvé"
else
  while IFS= read -r line; do
    [ -z "$line" ] && continue
    status=$(echo "$line" | cut -d: -f1)
    table=$(echo "$line" | cut -d: -f2)
    if [ "$status" = "OK" ]; then green "Table en base : $table ✅"
    elif [ "$status" = "MISS" ]; then red "Table en base : $table MANQUANTE"; fi
  done <<< "$TABLES"
fi

# ─── 3. Models ────────────────────────────────────────────────
section "3. doc-service — Models"
for m in "Document" "DocumentVersion" "WikiPage" "Contract" "DocPermission"; do
  f="services/doc-service/app/Models/Tenant/${m}.php"
  if [ -f "$f" ]; then
    green "Model : $m"
    if grep -q "declare(strict_types=1)" "$f"; then green "  → declare(strict_types=1)"; else red "  → declare ABSENT"; fi
    if grep -q "incrementing = false" "$f"; then green "  → UUID PK configuré"; else red "  → UUID PK ABSENT"; fi
  else red "Model MANQUANT : $m"; fi
done

# ─── 4. DocumentService ───────────────────────────────────────
section "4. doc-service — DocumentService"
f="services/doc-service/app/Services/DocumentService.php"
if [ -f "$f" ]; then
  green "DocumentService présent"
  if grep -q "declare(strict_types=1)" "$f"; then green "  → declare(strict_types=1)"; else red "  → declare ABSENT"; fi
  # Événements DataFlow v2.3
  for event in "doc.document.created" "doc.document.uploaded" "doc.document.new_version" \
               "doc.document.shared" "doc.wiki.page.created" "doc.wiki.page.updated"; do
    if grep -q "$event" "$f"; then green "  → $event publié"
    else red "  → $event ABSENT"; fi
  done
  # Champs requis E-040
  if grep -q "owner_id" "$f" && grep -q "file_size\|size_bytes" "$f"; then
    green "  → E-040 : owner_id + file_size présents"
  else red "  → E-040 : owner_id ou file_size ABSENT"; fi
  # Champs requis E-041
  if grep -q "change_summary" "$f"; then green "  → E-041 : change_summary présent"; else red "  → change_summary ABSENT"; fi
  # Champs requis E-042
  if grep -q "space" "$f"; then green "  → E-042 : space présent"; else red "  → space ABSENT"; fi
  # Quota storage
  if grep -q "checkStorageQuota\|storage_quota" "$f"; then
    green "  → Quota stockage vérifié (CDC §5.2)"
  else red "  → Quota stockage NON vérifié"; fi
  if grep -q "413" "$f"; then green "  → HTTP 413 si quota dépassé"; else red "  → HTTP 413 ABSENT"; fi
  # Dossier employé
  if grep -q "createEmployeeFolder" "$f"; then green "  → createEmployeeFolder() pour E-010"; else red "  → createEmployeeFolder ABSENT"; fi
  # Règles
  if grep -q "AuditLog" "$f"; then green "  → audit log (règle #3)"; else red "  → audit log ABSENT"; fi
  if grep -q "marketplace" "$f"; then red "  → marketplace (ADR-002)"; else green "  → aucun marketplace (ADR-002 ✓)"; fi
else red "DocumentService MANQUANT"; fi

# ─── 5. Consumers ─────────────────────────────────────────────
section "5. doc-service — Consumers"
for consumer in "DocumentCreatedConsumer" "DocumentSharedConsumer" "DocumentUploadedConsumer" \
                "DocumentNewVersionConsumer" "WikiPageCreatedConsumer" "WikiPageUpdatedConsumer" \
                "EmployeeOnboardedConsumer" "TicketClosedConsumer"; do
  f="services/doc-service/app/Consumers/${consumer}.php"
  if [ -f "$f" ]; then
    green "Consumer : $consumer"
    if grep -q "declare(strict_types=1)" "$f"; then green "  → declare(strict_types=1)"; else red "  → declare ABSENT"; fi
    if grep -q "marketplace" "$f"; then red "  → marketplace (ADR-002)"; else green "  → aucun marketplace ✓"; fi
  else red "Consumer MANQUANT : $consumer"; fi
done

# Vérifications spécifiques
f="services/doc-service/app/Consumers/EmployeeOnboardedConsumer.php"
[ -f "$f" ] && {
  if grep -q "hr.employee.onboarded" "$f"; then green "EmployeeOnboardedConsumer : écoute E-010 ✅"; else red "E-010 non écouté"; fi
  if grep -q "createEmployeeFolder" "$f"; then green "  → createEmployeeFolder() appelé"; else red "  → createEmployeeFolder ABSENT"; fi
}
f="services/doc-service/app/Consumers/TicketClosedConsumer.php"
[ -f "$f" ] && {
  if grep -q "ticket.ticket.closed" "$f"; then green "TicketClosedConsumer : écoute E-023 ✅"; else red "E-023 non écouté"; fi
}
f="services/doc-service/app/Consumers/DocumentNewVersionConsumer.php"
[ -f "$f" ] && {
  if grep -q "ACK silencieux" "$f"; then green "E-041 : ACK silencieux intentionnel (DataFlow v2.3 ✓)"; else yellow "E-041 : ACK silencieux non documenté"; fi
}
f="services/doc-service/app/Consumers/WikiPageUpdatedConsumer.php"
[ -f "$f" ] && {
  if grep -q "ACK silencieux" "$f"; then green "E-043 : ACK silencieux intentionnel (DataFlow v2.3 ✓)"; else yellow "E-043 : ACK silencieux non documenté"; fi
}

# ─── 6. Routes ────────────────────────────────────────────────
section "6. doc-service — Routes"
f="services/doc-service/routes/api.php"
if [ -f "$f" ]; then
  if grep -q "api/v1/docs" "$f"; then green "Routes : préfixe /api/v1/docs (règle #6)"; else red "Préfixe ABSENT"; fi
  for route in "versions" "share" "wiki" "pages"; do
    if grep -q "$route" "$f"; then green "Route : $route présente"; else yellow "Route : $route absente"; fi
  done
fi
if [ -f "services/doc-service/routes/health.php" ]; then green "routes/health.php présent"; else red "ABSENT"; fi

# ─── 7. Tests Pest ────────────────────────────────────────────
section "7. Tests Pest — doc-service"
if [ -f "services/doc-service/tests/Feature/DocumentServiceTest.php" ]; then
  green "DocumentServiceTest présent"
  echo "  → Exécution Pest..."
  cd services/doc-service
  PEST=$(php artisan test tests/Feature/DocumentServiceTest.php --no-coverage 2>&1)
  if echo "$PEST" | grep -q "passed"; then
    green "Tests Pest : $(echo "$PEST" | grep -oP '\d+ passed' | head -1) ✅"
  else
    red "Tests Pest : ÉCHEC"
    echo "$PEST" | grep -E "FAILED|Error|●" | head -5 | sed 's/^/     /'
  fi
  cd ~/digital-workspace-backend
else red "DocumentServiceTest MANQUANT"; fi

# ─── 8. /health doc-service ───────────────────────────────────
section "8. /health doc-service"
R=$(curl -s --max-time 3 http://localhost:8010/health 2>/dev/null)
if echo "$R" | grep -q '"status":"ok"'; then green "/health :8010 (doc-service) → 200 OK"
elif [ -z "$R" ]; then yellow "/health :8010 : serveur non démarré"
else red "/health :8010 → dégradé"; fi

# ─── 9. Règles absolues ───────────────────────────────────────
section "9. Règles absolues — doc-service"
MISS=$(find services/doc-service/app -name "*.php" -not -name "Controller.php" \
  -exec grep -rL "declare(strict_types=1)" {} \; 2>/dev/null | wc -l)
if [ "$MISS" -eq 0 ]; then green "Règle #1 : declare dans tous les fichiers PHP"
else red "Règle #1 : $MISS fichiers sans declare"; fi

MKT=$(grep -rn "xadd.*marketplace\|publish.*marketplace" \
  services/doc-service/app/ 2>/dev/null | grep -v "#\|//" | wc -l)
if [ "$MKT" -eq 0 ]; then green "Règle #12 : aucun canal marketplace (ADR-002 ✓)"
else red "Règle #12 : $MKT publications marketplace"; fi

# ─── 10. Non-régression ───────────────────────────────────────
section "10. Non-régression Sprints 1-9"
cd services/auth-service
R=$(php artisan test tests/Feature/TenantIsolationTest.php --no-coverage 2>&1)
if echo "$R" | grep -q "passed"; then green "TenantIsolationTest : $(echo "$R" | grep -oP '\d+ passed' | head -1) ✅"
else red "TenantIsolationTest : RÉGRESSION"; fi
cd ~/digital-workspace-backend
POC=$(bash poc-dataflow.sh 2>&1)
if echo "$POC" | grep -q "validé"; then green "poc-dataflow.sh : $(echo "$POC" | grep -oP '\d+ms' | head -1) ✅"
else red "poc-dataflow.sh : RÉGRESSION"; fi

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  Résultat Sprint 10"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  ✅ Réussis  : $PASS"
echo "  ⚠️  Warnings : $WARN"
echo "  ❌ Échecs   : $FAIL"
echo ""
if [ "$FAIL" -eq 0 ]; then
  echo "  🎉 Sprint 10 VALIDÉ — GO Sprint 11 (M11 enrichi + Recette Lot 2)"
else
  echo "  🛑 Sprint 10 INCOMPLET — $FAIL points bloquants"
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
