// src/controllers/measurementController.js
const Measurement = require('../models/Measurement');
const { sendError, asyncHandler } = require('../utils/errorHandler');
const StorageService = require('../services/storageService');
const fs = require('fs').promises;

/**
 * Contrôleur pour les opérations liées aux mesures
 */
class MeasurementController {
  /**
   * Récupère toutes les mesures
   */
  static getAllMeasurements = asyncHandler(async (req, res) => {
    const measurements = await Measurement.getAllMeasurements();
    
    if (!measurements || measurements.length === 0) {
      return sendError('Aucune mesure trouvée', res, null, 404);
    }
    
    res.json(measurements);
  });

  /**
   * Récupère une mesure par son ID
   */
  static getMeasurementById = asyncHandler(async (req, res) => {
    const measurementId = req.params.id;
    
    if (!measurementId || isNaN(measurementId)) {
      return sendError('ID de mesure invalide', res, null, 400);
    }
    
    const measurement = await Measurement.getMeasurementById(measurementId);
    
    if (!measurement) {
      return sendError('Mesure non trouvée', res, null, 404);
    }
    
    res.json(measurement);
  });

  /**
   * Récupère une mesure par son projet ID et son ordre ID
   */
  static getMeasurementByProjectAndOrderId = asyncHandler(async (req, res) => {
    const { projectId, orderId } = req.params;
    
    if (!projectId || !orderId || isNaN(projectId) || isNaN(orderId)) {
      return sendError('IDs de projet ou d\'ordre invalides', res, null, 400);
    }
    
    const measurement = await Measurement.getMeasurementByProjectAndOrderId(projectId, orderId);
    
    if (!measurement) {
      return sendError('Mesure non trouvée', res, null, 404);
    }
    
    res.json(measurement);
  });

  /**
   * Supprime une mesure par son ID
   */
  static deleteMeasurement = asyncHandler(async (req, res) => {
    const measurementId = req.params.id;
    
    if (!measurementId || isNaN(measurementId)) {
      return sendError('ID de mesure invalide', res, null, 400);
    }
    
    // Récupère les informations de la mesure avant suppression
    const measurement = await Measurement.getMeasurementById(measurementId);
    
    if (!measurement) {
      return sendError('Mesure non trouvée', res, null, 404);
    }
    
    // Supprime le fichier image associé si existant
    if (measurement.path) {
      try {
        await fs.access(measurement.path);
        await fs.unlink(measurement.path);
      } catch (error) {
        console.error(`[MEASUREMENT] Erreur lors de la suppression du fichier : ${measurement.path}`, error);
      }
    }
    
    // Supprime l'entrée de la base de données
    await Measurement.deleteMeasurement(measurementId);
    
    res.json({ 
      message: 'Mesure supprimée avec succès', 
      id: measurementId 
    });
  });

  /**
   * Supprime une mesure par projet ID et ordre ID
   */
  static deleteMeasurementByProjectAndOrderId = asyncHandler(async (req, res) => {
    const { projectId, orderId } = req.params;
    
    if (!projectId || !orderId || isNaN(projectId) || isNaN(orderId)) {
      return sendError('IDs de projet ou d\'ordre invalides', res, null, 400);
    }
    
    // Récupère les informations de la mesure avant suppression
    const measurement = await Measurement.getMeasurementByProjectAndOrderId(projectId, orderId);
    
    if (!measurement) {
      return sendError('Mesure non trouvée', res, null, 404);
    }
    
    // Supprime le fichier image associé si existant
    if (measurement.path) {
      try {
        await fs.access(measurement.path);
        await fs.unlink(measurement.path);
      } catch (error) {
        console.error(`[MEASUREMENT] Erreur lors de la suppression du fichier : ${measurement.path}`, error);
      }
    }
    
    // Supprime l'entrée de la base de données
    await Measurement.deleteMeasurement(measurement.id);
    
    res.json({ 
      message: 'Mesure supprimée avec succès', 
      id: measurement.id 
    });
  });
}

module.exports = MeasurementController;