// src/routes/imageRoutes.js
const express = require('express');
const router = express.Router();
const multer = require('multer');
const ImageController = require('../controllers/imageController');

// Configuration de Multer pour le téléchargement des images
const upload = multer({ storage: multer.memoryStorage() });

/**
 * @swagger
 * /smile:
 *   get:
 *     tags:
 *       - Images
 *       - Système
 *     summary: Récupère une image de test (smile)
 *     description: Endpoint de test qui retourne une image statique
 *     responses:
 *       200:
 *         description: Image de test
 *         content:
 *           image/png:
 *             schema:
 *               type: string
 *               format: binary
 *       404:
 *         $ref: '#/components/responses/NotFound'
 *       500:
 *         $ref: '#/components/responses/ServerError'
 */
router.get('/smile', ImageController.getSmileImage);

/**
 * @swagger
 * /images/{projectId}/{orderId}:
 *   get:
 *     tags:
 *       - Images
 *     summary: Récupère une image par projet ID et ordre ID
 *     description: Télécharge l'image associée à un projet et un numéro d'ordre spécifique
 *     parameters:
 *       - in: path
 *         name: projectId
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID du projet
 *       - in: path
 *         name: orderId
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID d'ordre séquentiel de l'image
 *     responses:
 *       200:
 *         description: Image (fichier)
 *         content:
 *           image/jpeg:
 *             schema:
 *               type: string
 *               format: binary
 *       400:
 *         $ref: '#/components/responses/BadRequest'
 *       404:
 *         $ref: '#/components/responses/NotFound'
 *       500:
 *         $ref: '#/components/responses/ServerError'
 */
router.get('/images/:projectId/:orderId', ImageController.getImageByProjectAndOrderId);

/**
 * @swagger
 * /images/{measurementId}:
 *   get:
 *     tags:
 *       - Images
 *     summary: Récupère une image par ID de mesure
 *     description: Télécharge l'image associée à une mesure spécifique
 *     parameters:
 *       - in: path
 *         name: measurementId
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID de la mesure
 *     responses:
 *       200:
 *         description: Image (fichier)
 *         content:
 *           image/jpeg:
 *             schema:
 *               type: string
 *               format: binary
 *       400:
 *         $ref: '#/components/responses/BadRequest'
 *       404:
 *         $ref: '#/components/responses/NotFound'
 *       500:
 *         $ref: '#/components/responses/ServerError'
 */
router.get('/images/:measurementId', ImageController.getImageByMeasurementId);

/**
 * @swagger
 * /preview/{projectId}/{orderId}:
 *   get:
 *     tags:
 *       - Images
 *     summary: Récupère un aperçu d'une image
 *     description: Retourne une version redimensionnée (miniature) d'une image
 *     parameters:
 *       - in: path
 *         name: projectId
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID du projet
 *       - in: path
 *         name: orderId
 *         required: true
 *         schema:
 *           type: integer
 *         description: ID d'ordre séquentiel de l'image
 *     responses:
 *       200:
 *         description: Aperçu d'image redimensionné
 *         content:
 *           image/jpeg:
 *             schema:
 *               type: string
 *               format: binary
 *       400:
 *         $ref: '#/components/responses/BadRequest'
 *       404:
 *         $ref: '#/components/responses/NotFound'
 *       500:
 *         $ref: '#/components/responses/ServerError'
 */
router.get('/preview/:projectId/:orderId', ImageController.getImagePreview);

/**
 * @swagger
 * /camera/upload:
 *   post:
 *     tags:
 *       - Images
 *       - Caméra
 *     summary: Télécharge une image avec données de mesure
 *     description: Enregistre une nouvelle image capturée avec les données de mesure associées. L'API détecte automatiquement le projet actif en cours de capture.
 *     requestBody:
 *       required: true
 *       content:
 *         multipart/form-data:
 *           schema:
 *             type: object
 *             properties:
 *               image:
 *                 type: string
 *                 format: binary
 *                 description: Fichier image à télécharger
 *               timestamp:
 *                 type: string
 *                 format: date-time
 *                 description: Horodatage de la capture
 *               temperature:
 *                 type: number
 *                 description: Température mesurée
 *                 example: 22.5
 *               humidity:
 *                 type: number
 *                 description: Humidité mesurée
 *                 example: 45.2
 *             required:
 *               - image
 *               - timestamp
 *               - temperature
 *               - humidity
 *     responses:
 *       200:
 *         description: Image téléchargée avec succès
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 message:
 *                   type: string
 *                   example: Mesure téléchargée avec succès
 *                 project_id:
 *                   type: integer
 *                   example: 1
 *                   description: ID du projet actif détecté automatiquement
 *                 path:
 *                   type: string
 *                   example: /storage/1/images/42.jpg
 *                 id:
 *                   type: integer
 *                   example: 123
 *       400:
 *         description: Erreur de requête - paramètres manquants ou aucun projet actif
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 error:
 *                   type: string
 *                   example: Aucun projet actif en cours de capture
 *       500:
 *         $ref: '#/components/responses/ServerError'
 */
router.post('/camera/upload', upload.single('image'), ImageController.uploadImage);

module.exports = router;