# Auto SAV API — Documentation des endpoints

Base URL : `http://localhost:8000/api/v1`  
Production : `https://mauto-api.conexusitapps.ma/api/v1`

## Authentification

Les routes protégées nécessitent un header :

```http
Authorization: Bearer {access_token}
Content-Type: application/json
Accept: application/json
```

| Token | Durée |
|-------|-------|
| `access_token` | 24 h |
| `refresh_token` | 30 jours |

---

## Routes publiques

### Santé de l'API

| Méthode | Endpoint | Auth |
|---------|----------|------|
| `GET` | `/health` | Non |

**Réponse :**
```json
{
  "status": "ok",
  "service": "Auto SAV API",
  "version": "1.0.0"
}
```

---

### Marques & modèles

| Méthode | Endpoint | Auth | Description |
|---------|----------|------|-------------|
| `GET` | `/marques` | Non | Liste des marques actives |
| `GET` | `/marques/{id}/modeles` | Non | Modèles d'une marque |

**Exemple :**
```bash
curl http://localhost:8000/api/v1/marques
curl http://localhost:8000/api/v1/marques/1/modeles
```

---

### Authentification

| Méthode | Endpoint | Auth | Description |
|---------|----------|------|-------------|
| `POST` | `/register` | Non | Inscription utilisateur |
| `POST` | `/login` | Non | Connexion |
| `POST` | `/refresh` | Non | Renouveler les tokens |

#### POST `/register`

```json
{
  "name": "Jean Dupont",
  "email": "jean@example.com",
  "password": "password123",
  "password_confirmation": "password123"
}
```

#### POST `/login`

```json
{
  "email": "jean@example.com",
  "password": "password123"
}
```

#### POST `/refresh`

```json
{
  "refresh_token": "2|xxxxxxxx..."
}
```

**Réponse login / register / refresh :**
```json
{
  "message": "Connexion réussie.",
  "user": { "id": 1, "name": "...", "email": "..." },
  "access_token": "1|xxx...",
  "refresh_token": "1|yyy...",
  "token_type": "Bearer",
  "expires_in": 86399,
  "expires_at": "2026-06-17T12:00:00+00:00"
}
```

---

### Création compte client

| Méthode | Endpoint | Auth | Description |
|---------|----------|------|-------------|
| `POST` | `/clients` | Non | Créer un compte client + véhicule |

```json
{
  "first_name": "Marie",
  "last_name": "Martin",
  "phone": "+33698765432",
  "email": "marie@example.com",
  "vin": "VF1RJA00012345678",
  "brand": "Renault",
  "model": "Clio",
  "purchase_date": "2025-03-15"
}
```

| Champ | Obligatoire | Description |
|-------|-------------|-------------|
| `first_name` | Oui | Prénom |
| `last_name` | Oui | Nom |
| `phone` | Oui | Format international `+33612345678` |
| `email` | Non | Si absent, login auto-généré |
| `vin` | Oui | 17 caractères |
| `brand` | Oui | Marque |
| `model` | Oui | Modèle |
| `purchase_date` | Oui | Date d'achat (≤ aujourd'hui) |

Le mot de passe par défaut est **`mauto26`** et envoyé par **SMS**.

---

## Routes protégées (token requis)

### Profil utilisateur

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/me` | Profil du user connecté |
| `POST` | `/logout` | Déconnexion (révoque le token) |
| `POST` | `/password/change` | Changer le mot de passe |

#### POST `/password/change`

```json
{
  "current_password": "ancien_mot_de_passe",
  "new_password": "NouveauMotDePasse123!",
  "new_password_confirmation": "NouveauMotDePasse123!"
}
```

---

### Centres SAV

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/centres` | Liste des centres réservables |

Retourne uniquement les centres `is_active = true` et `is_visible = true`.

---

### Rendez-vous SAV

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/rdv-savs/me` | Mes RDV (paginé) |
| `POST` | `/rdv-savs` | Créer un RDV |

#### POST `/rdv-savs`

```json
{
  "centre_id": 1,
  "vehicle_id": 1,
  "sav_ticket_id": null,
  "scheduled_at": "2026-06-20 09:00:00",
  "notes": "Révision annuelle"
}
```

| Champ | Obligatoire | Description |
|-------|-------------|-------------|
| `centre_id` | Oui | ID du centre |
| `scheduled_at` | Oui | Date/heure future |
| `vehicle_id` | Non | Véhicule du user |
| `sav_ticket_id` | Non | Dossier SAV lié |
| `notes` | Non | Commentaire |

**Vérification créneau :** si le créneau est déjà pris au même centre → `422`.

**Statuts RDV :** `en_attente`, `confirme`, `annule`, `termine`

---

### Véhicules

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/vehicles/me` | Mes véhicules |
| `GET` | `/vehicles` | Mes véhicules (identique) |
| `POST` | `/vehicles` | Ajouter un véhicule |
| `GET` | `/vehicles/{id}` | Détail d'un véhicule |
| `PUT` | `/vehicles/{id}` | Modifier un véhicule |
| `DELETE` | `/vehicles/{id}` | Supprimer un véhicule |

#### POST `/vehicles`

```json
{
  "brand": "Peugeot",
  "model": "308",
  "license_plate": "AB-123-CD",
  "year": 2022,
  "vin": "VF1XXXXXXXXXXXXXXX"
}
```

---

### Dossiers SAV

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/sav-tickets` | Liste de mes dossiers |
| `POST` | `/sav-tickets` | Créer un dossier |
| `GET` | `/sav-tickets/{id}` | Détail d'un dossier |
| `PUT` | `/sav-tickets/{id}` | Modifier un dossier |
| `DELETE` | `/sav-tickets/{id}` | Supprimer un dossier |

#### POST `/sav-tickets`

```json
{
  "vehicle_id": 1,
  "title": "Problème moteur",
  "description": "Bruit anormal au démarrage",
  "priority": "haute"
}
```

**Priorités :** `basse`, `normale`, `haute`  
**Statuts :** `ouvert`, `en_cours`, `resolu`, `ferme`

---

## Récapitulatif complet

| Méthode | Endpoint | Auth |
|---------|----------|------|
| `GET` | `/health` | Non |
| `GET` | `/marques` | Non |
| `GET` | `/marques/{marque}/modeles` | Non |
| `POST` | `/register` | Non |
| `POST` | `/login` | Non |
| `POST` | `/refresh` | Non |
| `POST` | `/clients` | Non |
| `GET` | `/me` | Oui |
| `POST` | `/logout` | Oui |
| `POST` | `/password/change` | Oui |
| `GET` | `/centres` | Oui |
| `GET` | `/rdv-savs/me` | Oui |
| `POST` | `/rdv-savs` | Oui |
| `GET` | `/vehicles/me` | Oui |
| `GET` | `/vehicles` | Oui |
| `POST` | `/vehicles` | Oui |
| `GET` | `/vehicles/{vehicle}` | Oui |
| `PUT` | `/vehicles/{vehicle}` | Oui |
| `DELETE` | `/vehicles/{vehicle}` | Oui |
| `GET` | `/sav-tickets` | Oui |
| `POST` | `/sav-tickets` | Oui |
| `GET` | `/sav-tickets/{sav_ticket}` | Oui |
| `PUT` | `/sav-tickets/{sav_ticket}` | Oui |
| `DELETE` | `/sav-tickets/{sav_ticket}` | Oui |

---

## Codes de réponse HTTP

| Code | Signification |
|------|---------------|
| `200` | Succès |
| `201` | Ressource créée |
| `401` | Non authentifié (token manquant ou expiré) |
| `403` | Accès interdit |
| `404` | Ressource introuvable |
| `422` | Erreur de validation |
| `429` | Trop de tentatives (rate limit) |

---

## Rate limiting

| Routes | Limite |
|--------|--------|
| `/login`, `/register`, `/clients` | 5 req/min par IP + email |
| `/refresh` | 10 req/min par IP |

---

## Variables d'environnement utiles

```env
SANCTUM_TOKEN_EXPIRATION=1440
REFRESH_TOKEN_EXPIRATION=43200
SMS_DRIVER=log
```
