// server.js
const express = require('express');
const cors = require('cors');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerJsdoc = require('swagger-jsdoc');
const config = require('./src/config');
const DatabaseManager = require('./src/models/database');

// Middleware pour gérer les requêtes JSON
app.use(express.json());

// Configuration CORS
app.use(cors(config.server.cors));

// Initialisation de la base de données
DatabaseManager.initialize()
  .then(() => console.log('[SERVER] Base de données initialisée avec succès'))
  .catch(err => console.error('[SERVER] Erreur d\'initialisation de la base de données:', err));

// Importer les routes API
const apiRoutes = require('./src/routes');
app.use('/api', apiRoutes);

// Configuration de Swagger
const swaggerOptions = {
  definition: config.swagger.definition,
  apis: config.swagger.apis
};

// Initialisation de swagger-jsdoc
const swaggerDocs = swaggerJsdoc(swaggerOptions);

// Route Swagger UI
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));

// Route de base pour tester le serveur
app.get('/', (req, res) => {
  res.send('Bienvenue sur l\'API Timelapse!');
});

// Gestion des erreurs 404
app.use((req, res) => {
  res.status(404).json({
    error: {
      message: 'Route non trouvée',
      path: req.path,
      method: req.method,
      statusCode: 404
    }
  });
});

// Gestion des erreurs globales
app.use((err, req, res, next) => {
  console.error('[SERVER] Erreur non gérée:', err);
  res.status(500).json({
    error: {
      message: 'Erreur serveur interne',
      statusCode: 500,
      details: process.env.NODE_ENV === 'production' ? undefined : err.message
    }
  });
});

// Démarrer le serveur
const port = config.server.port;
app.listen(port, () => {
  console.log(`[SERVER] Serveur démarré sur http://localhost:${port}`);
  console.log(`[SERVER] Documentation Swagger disponible sur http://localhost:${port}/api-docs`);
});
