// controllers/commandesController.js
const Commande = require('../models/Commande');
const { Op } = require('sequelize');

// Get all commandes
const getAllCommandes = async (req, res) => {
  try {
    const page = parseInt(req.query.page) || 1;
    const limit = parseInt(req.query.limit) || 10;
    const offset = (page - 1) * limit;
    
    const where = {};
    
    // Filters
    if (req.query.statut) {
      where.statut = req.query.statut;
    }
    
    if (req.query.client_id) {
      where.client_id = req.query.client_id;
    }
    
    if (req.query.table_id) {
      where.table_id = req.query.table_id;
    }
    
    if (req.query.serveur) {
      where.serveur = { [Op.like]: `%${req.query.serveur}%` };
    }
    
    if (req.query.date_debut && req.query.date_fin) {
      where.date_commande = {
        [Op.between]: [req.query.date_debut, req.query.date_fin]
      };
    }

    const { count, rows } = await Commande.findAndCountAll({
      where,
      limit,
      offset,
      order: [['date_commande', 'DESC']]
    });

    res.status(200).json({
      success: true,
      data: {
        commandes: rows,
        pagination: {
          currentPage: page,
          totalPages: Math.ceil(count / limit),
          totalItems: count,
          itemsPerPage: limit
        }
      }
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur lors de la récupération des commandes',
      error: error.message
    });
  }
};

// Get commande by ID
const getCommandeById = async (req, res) => {
  try {
    const commande = await Commande.findByPk(req.params.id);

    if (!commande) {
      return res.status(404).json({
        success: false,
        message: 'Commande non trouvée'
      });
    }

    res.status(200).json({
      success: true,
      data: commande
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur lors de la récupération de la commande',
      error: error.message
    });
  }
};

// Create new commande
const createCommande = async (req, res) => {
  try {
    const {
      client_id,
      table_id,
      reservation_id,
      numero_commande,
      statut,
      total_ht,
      total_tva,
      total_ttc,
      mode_paiement,
      commentaires,
      serveur,
      date_commande,
      date_service
    } = req.body;

    const newCommande = await Commande.create({
      client_id,
      table_id,
      reservation_id,
      numero_commande,
      statut: statut || 'en_attente',
      total_ht: total_ht || 0.00,
      total_tva: total_tva || 0.00,
      total_ttc: total_ttc || 0.00,
      mode_paiement,
      commentaires,
      serveur,
      date_commande: date_commande || new Date(),
      date_service
    });

    res.status(201).json({
      success: true,
      message: 'Commande créée avec succès',
      data: newCommande
    });
  } catch (error) {
    res.status(400).json({
      success: false,
      message: 'Erreur lors de la création de la commande',
      error: error.message
    });
  }
};

// Update commande
const updateCommande = async (req, res) => {
  try {
    const commandeId = req.params.id;
    const updateData = req.body;

    const commande = await Commande.findByPk(commandeId);
    
    if (!commande) {
      return res.status(404).json({
        success: false,
        message: 'Commande non trouvée'
      });
    }

    await commande.update(updateData);

    res.status(200).json({
      success: true,
      message: 'Commande mise à jour avec succès',
      data: commande
    });
  } catch (error) {
    res.status(400).json({
      success: false,
      message: 'Erreur lors de la mise à jour de la commande',
      error: error.message
    });
  }
};

// Delete commande
const deleteCommande = async (req, res) => {
  try {
    const commandeId = req.params.id;
    
    const commande = await Commande.findByPk(commandeId);
    
    if (!commande) {
      return res.status(404).json({
        success: false,
        message: 'Commande non trouvée'
      });
    }

    await commande.destroy();

    res.status(200).json({
      success: true,
      message: 'Commande supprimée avec succès'
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur lors de la suppression de la commande',
      error: error.message
    });
  }
};

// Update commande status
const updateStatut = async (req, res) => {
  try {
    const commandeId = req.params.id;
    const { statut } = req.body;

    if (!statut) {
      return res.status(400).json({
        success: false,
        message: 'Le statut est requis'
      });
    }

    const commande = await Commande.findByPk(commandeId);
    
    if (!commande) {
      return res.status(404).json({
        success: false,
        message: 'Commande non trouvée'
      });
    }

    const updateData = { statut };
    if (statut === 'servie' && !commande.date_service) {
      updateData.date_service = new Date();
    }

    await commande.update(updateData);

    res.status(200).json({
      success: true,
      message: 'Statut de la commande mis à jour avec succès',
      data: commande
    });
  } catch (error) {
    res.status(400).json({
      success: false,
      message: 'Erreur lors de la mise à jour du statut',
      error: error.message
    });
  }
};

// Get commandes by status
const getCommandesByStatut = async (req, res) => {
  try {
    const { statut } = req.params;
    
    const commandes = await Commande.findAll({
      where: { statut },
      order: [['date_commande', 'DESC']]
    });

    res.status(200).json({
      success: true,
      data: commandes
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur lors de la récupération des commandes par statut',
      error: error.message
    });
  }
};

// Get daily statistics
const getDailyStats = async (req, res) => {
  try {
    const date = req.query.date || new Date().toISOString().split('T')[0];
    
    const startOfDay = new Date(date + 'T00:00:00.000Z');
    const endOfDay = new Date(date + 'T23:59:59.999Z');

    const stats = await Commande.findAll({
      where: {
        date_commande: {
          [Op.between]: [startOfDay, endOfDay]
        }
      },
      attributes: [
        'statut',
        [sequelize.fn('COUNT', sequelize.col('id')), 'count'],
        [sequelize.fn('SUM', sequelize.col('total_ttc')), 'total_amount']
      ],
      group: ['statut']
    });

    res.status(200).json({
      success: true,
      data: {
        date,
        statistics: stats
      }
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur lors de la récupération des statistiques',
      error: error.message
    });
  }
};

// IMPORTANT: Make sure this export is at the very end of the file
module.exports = {
  getAllCommandes,
  getCommandeById,
  createCommande,
  updateCommande,
  deleteCommande,
  updateStatut,
  getCommandesByStatut,
  getDailyStats
};
