// src/models/Project.js
const db = require('../database/connection');
const { wrapDatabaseOperation } = require('../utils/errorHandler');
const config = require('../config');

/**
 * Modèle pour la gestion des projets
 */
class Project {
  /**
   * Récupère tous les projets
   * @returns {Promise<Array>} Liste de tous les projets
   */
  static getAllProjects = wrapDatabaseOperation(async () => {
    const query = `SELECT * FROM projects;`;
    return (await db.query(query)).rows;
  });

  /**
   * Récupère un projet par son ID
   * @param {number} id - ID du projet
   * @returns {Promise<Object|null>} Détails du projet ou null si non trouvé
   */
  static getProjectById = wrapDatabaseOperation(async (id) => {
    const query = `SELECT * FROM projects WHERE id = $1;`;
    const result = await db.query(query, [id]);
    return result.rows[0] || null;
  });

  /**
   * Crée un nouveau projet
   * @param {string} name - Nom du projet
   * @param {string} description - Description du projet
   * @param {Date} startDate - Date de début du projet
   * @param {number} status - Statut du projet
   * @returns {Promise<Object>} Projet créé
   */
  static createProject = wrapDatabaseOperation(async (name, description, startDate, status) => {
    const query = `
      INSERT INTO projects (name, description, start_date, status) 
      VALUES ($1, $2, $3, $4) 
      RETURNING *;
    `;
    const result = await db.query(query, [name, description, startDate, status]);
    return result.rows[0];
  });

  /**
   * Met à jour un projet existant
   * @param {number} id - ID du projet
   * @param {Object} updates - Champs à mettre à jour
   * @returns {Promise<Object|null>} Projet mis à jour ou null si non trouvé
   */
  static updateProject = wrapDatabaseOperation(async (id, updates) => {
    const fields = Object.keys(updates).map((key, index) => `${key} = $${index + 2}`).join(', ');
    const values = [id, ...Object.values(updates)];
    const query = `UPDATE projects SET ${fields} WHERE id = $1 RETURNING *;`;
    const result = await db.query(query, values);
    return result.rows[0] || null;
  });

  /**
   * Met à jour le statut d'un projet
   * @param {number} id - ID du projet
   * @param {number} status - Nouveau statut du projet
   * @returns {Promise<Object|null>} Projet mis à jour ou null si non trouvé
   */
  static updateProjectStatus = wrapDatabaseOperation(async (id, status) => {
    const query = `UPDATE projects SET status = $1 WHERE id = $2 RETURNING *;`;
    const result = await db.query(query, [status, id]);
    // Ajout du statut stopping pour les projets en cours d'arrêt
    if (status === config.projectStatus.stopping) {
      console.log(`[PROJECT] Projet ${id} mis à jour avec le statut 'stopping'.`);
    }
    return result.rows[0] || null;
  });

  /**
   * Supprime un projet par son ID
   * @param {number} id - ID du projet
   * @returns {Promise<void>}
   */
  static deleteProject = wrapDatabaseOperation(async (id) => {
    const query = `DELETE FROM projects WHERE id = $1;`;
    await db.query(query, [id]);
  });

  /**
   * Trouve le projet en cours de rendu (status = capturing)
   * @returns {Promise<Object|null>} Projet en cours de rendu ou null
   */
  static findCurrentRenderingProject = wrapDatabaseOperation(async () => {
    const query = `SELECT * FROM projects WHERE status = ${config.projectStatus.capturing};`;
    const result = await db.query(query);
    return result.rows[0] || null;
  });

  /**
   * Trouve le projet en cours d'arrêt (status = stopping)
   * @returns {Promise<Object|null>} Projet en cours d'arrêt ou null
   */
  static findStoppingProject = wrapDatabaseOperation(async () => {
    const query = `SELECT * FROM projects WHERE status = ${config.projectStatus.stopping};`;
    const result = await db.query(query);
    return result.rows[0] || null;
  });
}

module.exports = Project;