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

/**
 * Modèle pour la gestion de la caméra
 */
class Camera {
  /**
   * Récupère les paramètres de la caméra
   * @returns {Promise<Object|null>} Paramètres de la caméra ou null si non trouvés
   */
  static getCamera = wrapDatabaseOperation(async () => {
    const query = `SELECT * FROM camera WHERE id = 1;`;
    const result = await db.query(query);
    return result.rows[0] || null;
  });

  /**
   * Met à jour les paramètres de la caméra
   * @param {number} id - ID de l'entrée caméra (normalement 1)
   * @param {Object} updates - Paramètres à mettre à jour
   * @returns {Promise<Object|null>} Paramètres mis à jour ou null si non trouvés
   */
  static updateCamera = 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 camera SET ${fields} WHERE id = $1 RETURNING *;`;
    const result = await db.query(query, values);
    return result.rows[0] || null;
  });

  /**
   * Supprime les paramètres de la caméra
   * @param {number} id - ID de l'entrée caméra à supprimer
   * @returns {Promise<void>}
   */
  static deleteCamera = wrapDatabaseOperation(async (id) => {
    const query = `DELETE FROM camera WHERE id = $1;`;
    await db.query(query, [id]);
  });

  /**
   * Initialise les paramètres de la caméra par défaut
   * @returns {Promise<Object>} Paramètres de caméra créés
   */
  static initializeCamera = wrapDatabaseOperation(async () => {
    const { defaultSettings } = config.camera;
    const query = `
      INSERT INTO camera (id, interval, maintenance, idle) 
      VALUES ($1, $2, $3, $4) 
      ON CONFLICT (id) DO NOTHING
      RETURNING *;
    `;
    const result = await db.query(query, [
      defaultSettings.id, 
      defaultSettings.interval, 
      defaultSettings.maintenance ? 1 : 0, 
      defaultSettings.idle ? 0 : 1
    ]);
    
    // Si l'insertion a échoué à cause d'un conflit, récupérer l'enregistrement existant
    if (result.rows.length === 0) {
      return await this.getCamera();
    }
    
    return result.rows[0];
  });
}

module.exports = Camera;