// src/controllers/projectController.js
const Project = require('../models/Project');
const Video = require('../models/Video');
const Measurement = require('../models/Measurement');
const StorageService = require('../services/storageService');
const { sendError, asyncHandler } = require('../utils/errorHandler');
const config = require('../config');

/**
 * Contrôleur pour les opérations liées aux projets
 */
class ProjectController {
  /**
   * Récupère tous les projets
   */
  static getAllProjects = asyncHandler(async (req, res) => {
    const projects = await Project.getAllProjects();
    res.json(projects);
  });

  /**
   * Récupère un projet par son ID
   */
  static getProjectById = asyncHandler(async (req, res) => {
    const projectId = req.params.id;
    
    if (!projectId || isNaN(projectId)) {
      return sendError('ID de projet invalide', res, null, 400);
    }
    
    const project = await Project.getProjectById(projectId);
    
    if (!project) {
      return sendError('Projet non trouvé', res, null, 404);
    }
    
    res.json(project);
  });

  /**
   * Récupère les vidéos d'un projet
   */
  static getProjectVideos = asyncHandler(async (req, res) => {
    const projectId = req.params.id;
    
    if (!projectId || isNaN(projectId)) {
      return sendError('ID de projet invalide', res, null, 400);
    }
    
    const videos = await Video.getVideosByProjectId(projectId);
    
    if (videos.length === 0) {
      return sendError('Aucune vidéo trouvée pour ce projet', res, null, 404);
    }
    
    res.json(videos);
  });

  /**
   * Récupère les mesures d'un projet
   */
  static getProjectMeasurements = asyncHandler(async (req, res) => {
    const projectId = req.params.id;
    
    if (!projectId || isNaN(projectId)) {
      return sendError('ID de projet invalide', res, null, 400);
    }
    
    const measurements = await Measurement.getMeasurementsByProjectId(projectId);
    
    if (measurements.length === 0) {
      return sendError('Aucune mesure trouvée pour ce projet', res, null, 404);
    }
    
    res.json(measurements);
  });

  /**
   * Crée un nouveau projet
   */
  static createProject = asyncHandler(async (req, res) => {
    const { name, description } = req.body;
    
    if (!name || !description) {
      return sendError('Le nom et la description sont requis', res, null, 400);
    }
    
    const date = new Date();
    const defaultStatus = config.status.waiting;
    
    const project = await Project.createProject(name, description, date, defaultStatus);
    await StorageService.project.createProjectDirectory(project.id);
    
    res.status(201).json({ 
      message: 'Projet ajouté avec succès', 
      id: project.id 
    });
  });

  /**
   * Supprime un projet existant
   */
  static deleteProject = asyncHandler(async (req, res) => {
    const projectId = req.params.id;
    
    if (!projectId || isNaN(projectId)) {
      return sendError('ID de projet invalide', res, null, 400);
    }
    
    // Supprime d'abord le répertoire du projet
    await StorageService.project.deleteProjectDirectory(projectId);
    
    // Puis supprime l'entrée dans la base de données
    await Project.deleteProject(projectId);
    
    res.status(200).json({ 
      message: 'Projet supprimé avec succès', 
      id: projectId 
    });
  });
}

module.exports = ProjectController;