# EF Core Environment Check (Shared Step)

> **Usage:** Include ce step dans toutes les commandes EF Core qui interagissent avec la base de donnees.

---

## STEP 0: Verification environnement et connexion

### 0.1 Detecter les fichiers appsettings disponibles

```bash
# Scanner les fichiers appsettings dans le projet API
API_DIR=$(find . -type d -name "*.Api" -o -name "*Web" | head -1)
if [ -z "$API_DIR" ]; then
  API_DIR="."
fi

# Lister tous les appsettings
APPSETTINGS_FILES=$(find "$API_DIR" -maxdepth 1 -name "appsettings*.json" 2>/dev/null | sort)
```

### 0.2 Determiner l'environnement a utiliser

**Priorite:**
1. Flag `--env {Environment}` si fourni
2. `appsettings.Local.json` (defaut recommande)
3. Erreur si aucun fichier trouve

```bash
# Logique de selection
ENV_FLAG="$1"  # --env Development par exemple

if [ -n "$ENV_FLAG" ]; then
  SELECTED_ENV="appsettings.${ENV_FLAG}.json"
elif [ -f "$API_DIR/appsettings.Local.json" ]; then
  SELECTED_ENV="appsettings.Local.json"
else
  echo "ERROR: Aucun fichier appsettings trouve"
  echo "  Creez appsettings.Local.json ou utilisez --env {Environment}"
  exit 1
fi

# Verifier que le fichier existe
if [ ! -f "$API_DIR/$SELECTED_ENV" ]; then
  echo "ERROR: $SELECTED_ENV non trouve dans $API_DIR"
  exit 1
fi
```

### 0.3 Extraire et afficher la connection string

```bash
# Extraire la connection string (PowerShell pour parsing JSON fiable)
CONNECTION_STRING=$(powershell -Command "
  \$json = Get-Content '$API_DIR/$SELECTED_ENV' | ConvertFrom-Json
  \$json.ConnectionStrings.DefaultConnection
")

# Extraire le nom de la base de donnees
DATABASE_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Database=\K[^;]+' || echo "Unknown")
SERVER_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Server=\K[^;]+' || echo "Unknown")

# Masquer le mot de passe si present
CONNECTION_MASKED=$(echo "$CONNECTION_STRING" | sed 's/Password=[^;]*/Password=****/g')
```

### 0.4 Afficher le resume

```
================================================================================
                         EF CORE - ENVIRONNEMENT
================================================================================

FICHIERS DISPONIBLES:
{liste des appsettings detectes}

SELECTION: {SELECTED_ENV} {(defaut) si Local}

CONNEXION:
  Server:   {SERVER_NAME}
  Database: {DATABASE_NAME}
  String:   {CONNECTION_MASKED}

================================================================================
```

### 0.5 Protection Production

```bash
# Bloquer si Production detecte (sauf pour db-status qui est read-only)
if [[ "$SELECTED_ENV" == *"Production"* ]]; then
  echo "================================================================================
                         BLOQUE - ENVIRONNEMENT PRODUCTION
================================================================================

Cette commande est bloquee pour proteger les donnees de production.

OPTIONS:
1. Utilisez un environnement non-production
2. Contactez support@atlshub.ch pour assistance

================================================================================
"
  exit 1
fi
```

### 0.6 Confirmation (pour commandes destructives)

> **Note:** Utiliser uniquement pour db-reset, db-seed, et autres commandes destructives.

```javascript
AskUserQuestion({
  questions: [{
    question: "Confirmer l'execution sur cette base de donnees?",
    header: "Confirm",
    options: [
      { label: "Oui, continuer", description: "Executer sur " + DATABASE_NAME },
      { label: "Non, annuler", description: "Arreter l'execution" }
    ],
    multiSelect: false
  }]
})
```

---

## Variables exportees

Apres ce step, les variables suivantes sont disponibles:

| Variable | Description |
|----------|-------------|
| `SELECTED_ENV` | Fichier appsettings utilise |
| `CONNECTION_STRING` | Connection string complete |
| `CONNECTION_MASKED` | Connection string masquee |
| `DATABASE_NAME` | Nom de la base de donnees |
| `SERVER_NAME` | Nom du serveur |
| `API_DIR` | Repertoire du projet API |

---

## Utilisation dans les commandes

```markdown
## STEP 0: Verification environnement

> **Include:** `_env-check.md`

{Executer les etapes 0.1 a 0.4}
{Executer 0.5 si commande modifie la base}
{Executer 0.6 si commande est destructive}
```
