const express = require('express');
const router = express.Router();
const projectManager = require('../src/project/projectManager');
const serverError = require('../utils/serverError');

/**
 * @swagger
 * /projects:
 *   get:
 *     summary: Récupérer tous les projets
 *     description: Récupère tous les projets disponibles.
 *     responses:
 *       200:
 *         description: Une liste de projets.
 *         content:
 *           application/json:
 *             schema:
 *               type: array
 *               items:
 *                 type: object
 *       500:
 *         description: Erreur serveur.
 */
router.get('/projects', async (req, res) => {
   try {
      const projects = await projectManager.getAllProjects();
      res.json(projects);
   } catch (error) {
      serverError.sendError('Error getting all projects:', res, error);
   }
});

/**
 * @swagger
 * /projects/{id}:
 *   get:
 *     summary: Récupérer un projet par ID
 *     description: Récupère un projet spécifique en utilisant son ID.
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: integer
 *         required: true
 *         description: ID du projet
 *     responses:
 *       200:
 *         description: Un projet.
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *       400:
 *         description: ID de projet invalide.
 *       500:
 *         description: Erreur serveur.
 */
router.get('/projects/:id', async (req, res) => {
   const projectId = req.params.id;
   if (!projectId || isNaN(projectId)) {
      return res.status(400).json({ error: 'Invalid project ID' });
   }
   try {
      const project = await projectManager.getProjectById(projectId);
      res.json(project);
   } catch (error) {
      serverError.sendError('Error getting project by ID:', res, error);
   }
});

/**
 * @swagger
 * /projects/{id}/videos:
 *   get:
 *     summary: Récupérer les vidéos d'un projet par ID
 *     description: Récupère les vidéos associées à un projet spécifique en utilisant son ID.
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: integer
 *         required: true
 *         description: ID du projet
 *     responses:
 *       200:
 *         description: Une liste de vidéos.
 *         content:
 *           application/json:
 *             schema:
 *               type: array
 *               items:
 *                 type: object
 *       400:
 *         description: ID de projet invalide.
 *       500:
 *         description: Erreur serveur.
 */
router.get('/projects/:id/videos', async (req, res) => {
   const projectId = req.params.id;
   if (!projectId || isNaN(projectId)) {
      return res.status(400).json({ error: 'Invalid project ID' });
   }
   try {
      const videos = await projectManager.getVideosByProjectId(projectId);
      res.json(videos);
   } catch (error) {
      serverError.sendError('Error getting videos by project ID:', res, error);
   }
});

/**
 * @swagger
 * /projects/{id}/measurements:
 *   get:
 *     summary: Récupérer les mesures d'un projet par ID
 *     description: Récupère les mesures associées à un projet spécifique en utilisant son ID.
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: integer
 *         required: true
 *         description: ID du projet
 *     responses:
 *       200:
 *         description: Une liste de mesures.
 *         content:
 *           application/json:
 *             schema:
 *               type: array
 *               items:
 *                 type: object
 *       400:
 *         description: ID de projet invalide.
 *       500:
 *         description: Erreur serveur.
 */
router.get('/projects/:id/measurements', async (req, res) => {
   const projectId = req.params.id;
   if (!projectId || isNaN(projectId)) {
      return res.status(400).json({ error: 'Invalid project ID' });
   }
   try {
      const measurements = await projectManager.getMeasurementsByProjectId(projectId);
      res.json(measurements);
   } catch (error) {
      serverError.sendError('Error getting measurements by project ID:', res, error);
   }
});

/**
 * @swagger
 * /projects:
 *   post:
 *     summary: Ajouter un nouveau projet
 *     description: Ajoute un nouveau projet à la base de données.
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               name:
 *                 type: string
 *               description:
 *                 type: string
 *     responses:
 *       201:
 *         description: Projet ajouté avec succès.
 *       400:
 *         description: Le nom et la description sont requis.
 *       500:
 *         description: Erreur serveur.
 */
router.post('/projects', async (req, res) => {
   const { name, description } = req.body;
   if (!name || !description) {
      return res.status(400).json({ error: 'Name and description are required' });
   }
   try {
      const project = await projectManager.createProject(name, description, new Date(), 0);
      projectManager.createProjectDirectory(project.id);
      res.status(201).json({ message: 'Project added successfully', id: project.id });
   } catch (error) {
      serverError.sendError('Error creating project:', res, error);
   }
});

/**
 * @swagger
 * /projects/{id}:
 *   delete:
 *     summary: Supprimer un projet par ID
 *     description: Supprime un projet spécifique en utilisant son ID.
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: integer
 *         required: true
 *         description: ID du projet
 *     responses:
 *       200:
 *         description: Projet supprimé avec succès.
 *       400:
 *         description: ID de projet invalide.
 *       500:
 *         description: Erreur serveur.
 */
router.delete('/projects/:id', async (req, res) => {
   const projectId = req.params.id;
   if (!projectId || isNaN(projectId)) {
      return res.status(400).json({ error: 'Invalid project ID' });
   }
   try {
      projectManager.deleteProjectDirectory(projectId);
      projectManager.deleteProjectById(projectId);
      res.status(200).json({ message: 'Project deleted successfully', id: projectId });
   } catch (error) {
      serverError.sendError('Error deleting project:', res, error);
   }
});

module.exports = router;
