const express = require('express');
const router = express.Router();

/**
 * @swagger
 * components:
 *   schemas:
 *     Utilisateur:
 *       type: object
 *       required:
 *         - nom
 *         - prenom
 *         - email
 *         - mot_de_passe
 *       properties:
 *         id:
 *           type: integer
 *           description: ID auto-généré
 *         nom:
 *           type: string
 *           maxLength: 50
 *           description: Nom de famille
 *         prenom:
 *           type: string
 *           maxLength: 50
 *           description: Prénom
 *         email:
 *           type: string
 *           maxLength: 100
 *           format: email
 *           description: Adresse email unique
 *         mot_de_passe:
 *           type: string
 *           minLength: 6
 *           description: Mot de passe (sera hashé)
 *         telephone:
 *           type: string
 *           maxLength: 20
 *           description: Numéro de téléphone
 *         role:
 *           type: string
 *           enum: [admin, manager, serveur, cuisinier, caissier]
 *           default: serveur
 *           description: Rôle de l'utilisateur
 *         statut:
 *           type: string
 *           enum: [actif, inactif, suspendu]
 *           default: actif
 *           description: Statut du compte
 *         date_embauche:
 *           type: string
 *           format: date
 *           description: Date d'embauche
 *         salaire:
 *           type: number
 *           format: float
 *           description: Salaire de base
 *         adresse:
 *           type: string
 *           description: Adresse complète
 *         date_naissance:
 *           type: string
 *           format: date
 *           description: Date de naissance
 *         photo:
 *           type: string
 *           description: Chemin vers la photo de profil
 *         derniere_connexion:
 *           type: string
 *           format: date-time
 *           description: Date de dernière connexion
 *         preferences:
 *           type: object
 *           description: Préférences utilisateur (JSON)
 *         est_actif:
 *           type: boolean
 *           default: true
 *           description: Utilisateur actif ou non
 *         cree_le:
 *           type: string
 *           format: date-time
 *           description: Date de création
 *         modifie_le:
 *           type: string
 *           format: date-time
 *           description: Date de modification
 */

/**
 * @swagger
 * tags:
 *   name: Utilisateurs
 *   description: Gestion des utilisateurs
 */

/**
 * @swagger
 * /api/utilisateurs:
 *   get:
 *     summary: Lister tous les utilisateurs
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: query
 *         name: page
 *         schema:
 *           type: integer
 *           default: 1
 *         description: Numéro de page
 *       - in: query
 *         name: limit
 *         schema:
 *           type: integer
 *           default: 10
 *         description: Nombre d'éléments par page
 *       - in: query
 *         name: role
 *         schema:
 *           type: string
 *           enum: [admin, manager, serveur, cuisinier, caissier]
 *         description: Filtrer par rôle
 *       - in: query
 *         name: statut
 *         schema:
 *           type: string
 *           enum: [actif, inactif, suspendu]
 *         description: Filtrer par statut
 *       - in: query
 *         name: search
 *         schema:
 *           type: string
 *         description: Recherche dans nom, prénom, email
 *       - in: query
 *         name: sort_by
 *         schema:
 *           type: string
 *           default: cree_le
 *         description: Champ de tri
 *       - in: query
 *         name: sort_order
 *         schema:
 *           type: string
 *           enum: [ASC, DESC]
 *           default: DESC
 *         description: Ordre de tri
 *     responses:
 *       200:
 *         description: Liste des utilisateurs
 *       500:
 *         description: Erreur serveur
 */
router.get('/', UtilisateurController.getAllUtilisateurs);

/**
 * @swagger
 * /api/utilisateurs/stats:
 *   get:
 *     summary: Statistiques des utilisateurs
 *     tags: [Utilisateurs]
 *     responses:
 *       200:
 *         description: Statistiques des utilisateurs
 */
router.get('/stats', UtilisateurController.getStats);

/**
 * @swagger
 * /api/utilisateurs/search:
 *   get:
 *     summary: Rechercher des utilisateurs
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: query
 *         name: q
 *         required: true
 *         schema:
 *           type: string
 *           minLength: 2
 *         description: Terme de recherche
 *       - in: query
 *         name: role
 *         schema:
 *           type: string
 *         description: Filtrer par rôle
 *       - in: query
 *         name: limit
 *         schema:
 *           type: integer
 *           default: 10
 *         description: Limite de résultats
 *     responses:
 *       200:
 *         description: Résultats de recherche
 *       400:
 *         description: Recherche trop courte
 */
router.get('/search', UtilisateurController.searchUtilisateurs);

/**
 * @swagger
 * /api/utilisateurs/login:
 *   post:
 *     summary: Connexion utilisateur
 *     tags: [Utilisateurs]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required:
 *               - email
 *               - mot_de_passe
 *             properties:
 *               email:
 *                 type: string
 *                 format: email
 *               mot_de_passe:
 *                 type: string
 *     responses:
 *       200:
 *         description: Connexion réussie
 *       401:
 *         description: Identifiants incorrects
 *       400:
 *         description: Données manquantes
 */
router.post('/login', UtilisateurController.login);

/**
 * @swagger
 * /api/utilisateurs/{id}:
 *   get:
 *     summary: Obtenir un utilisateur par ID
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID de l'utilisateur
 *     responses:
 *       200:
 *         description: Utilisateur trouvé
 *       404:
 *         description: Utilisateur non trouvé
 */
router.get('/:id', UtilisateurController.getUtilisateurById);

/**
 * @swagger
 * /api/utilisateurs:
 *   post:
 *     summary: Créer un nouvel utilisateur
 *     tags: [Utilisateurs]
 *     requestBody:
 *       required: true
 *       content:
 *         multipart/form-data:
 *           schema:
 *             type: object
 *             required:
 *               - nom
 *               - prenom
 *               - email
 *               - mot_de_passe
 *             properties:
 *               nom:
 *                 type: string
 *                 maxLength: 50
 *               prenom:
 *                 type: string
 *                 maxLength: 50
 *               email:
 *                 type: string
 *                 format: email
 *               mot_de_passe:
 *                 type: string
 *                 minLength: 6
 *               telephone:
 *                 type: string
 *               role:
 *                 type: string
 *                 enum: [admin, manager, serveur, cuisinier, caissier]
 *               date_embauche:
 *                 type: string
 *                 format: date
 *               salaire:
 *                 type: number
 *               adresse:
 *                 type: string
 *               date_naissance:
 *                 type: string
 *                 format: date
 *               photo:
 *                 type: string
 *                 format: binary
 *     responses:
 *       201:
 *         description: Utilisateur créé
 *       400:
 *         description: Email déjà utilisé
 *       500:
 *         description: Erreur serveur
 */
router.post('/', uploadPhoto, UtilisateurController.createUtilisateur);

/**
 * @swagger
 * /api/utilisateurs/{id}:
 *   put:
 *     summary: Mettre à jour un utilisateur
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: integer
 *     requestBody:
 *       required: true
 *       content:
 *         multipart/form-data:
 *           schema:
 *             type: object
 *             properties:
 *               nom:
 *                 type: string
 *               prenom:
 *                 type: string
 *               email:
 *                 type: string
 *               mot_de_passe:
 *                 type: string
 *               telephone:
 *                 type: string
 *               role:
 *                 type: string
 *               statut:
 *                 type: string
 *               date_embauche:
 *                 type: string
 *               salaire:
 *                 type: number
 *               adresse:
 *                 type: string
 *               date_naissance:
 *                 type: string
 *               photo:
 *                 type: string
 *                 format: binary
 *     responses:
 *       200:
 *         description: Utilisateur mis à jour
 *       404:
 *         description: Utilisateur non trouvé
 *       400:
 *         description: Email déjà utilisé
 */
router.put('/:id', uploadPhoto, UtilisateurController.updateUtilisateur);

/**
 * @swagger
 * /api/utilisateurs/{id}:
 *   delete:
 *     summary: Supprimer un utilisateur
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: integer
 *     responses:
 *       200:
 *         description: Utilisateur supprimé
 *       404:
 *         description: Utilisateur non trouvé
 */
router.delete('/:id', UtilisateurController.deleteUtilisateur);

/**
 * @swagger
 * /api/utilisateurs/{id}/statut:
 *   patch:
 *     summary: Changer le statut d'un utilisateur
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: integer
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required:
 *               - statut
 *             properties:
 *               statut:
 *                 type: string
 *                 enum: [actif, inactif, suspendu]
 *     responses:
 *       200:
 *         description: Statut changé
 *       400:
 *         description: Statut invalide
 *       404:
 *         description: Utilisateur non trouvé
 */
router.patch('/:id/statut', UtilisateurController.changeStatut);

/**
 * @swagger
 * /api/utilisateurs/{id}/reset-password:
 *   patch:
 *     summary: Réinitialiser le mot de passe
 *     tags: [Utilisateurs]
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: integer
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required:
 *               - nouveau_mot_de_passe
 *             properties:
 *               nouveau_mot_de_passe:
 *                 type: string
 *                 minLength: 6
 *     responses:
 *       200:
 *         description: Mot de passe réinitialisé
 *       400:
 *         description: Mot de passe trop court
 *       404:
 *         description: Utilisateur non trouvé
 */
router.patch('/:id/reset-password', UtilisateurController.resetPassword);

module.exports = router;

