const { MenuCategory, Menu } = require('../models/associations');

const categoryController = {
    // Get all categories
    getAllCategories: async (req, res) => {
        try {
            const { include_menus = 'false' } = req.query;

            const options = {
                order: [['ordre', 'ASC'], ['nom', 'ASC']]
            };

            if (include_menus === 'true') {
                options.include = [{
                    model: Menu,
                    as: 'menus',
                    attributes: ['id', 'nom', 'prix', 'disponible']
                }];
            }

            const categories = await MenuCategory.findAll(options);

            res.json({
                success: true,
                data: categories
            });

        } catch (error) {
            console.error('Error fetching categories:', error);
            res.status(500).json({
                success: false,
                message: 'Erreur lors de la récupération des catégories',
                error: error.message
            });
        }
    },

    // Get category by ID
    getCategoryById: async (req, res) => {
        try {
            const { id } = req.params;

            const category = await MenuCategory.findByPk(id, {
                include: [{
                    model: Menu,
                    as: 'menus',
                    attributes: ['id', 'nom', 'prix', 'disponible']
                }]
            });

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

            res.json({
                success: true,
                data: category
            });

        } catch (error) {
            console.error('Error fetching category:', error);
            res.status(500).json({
                success: false,
                message: 'Erreur lors de la récupération de la catégorie',
                error: error.message
            });
        }
    },

    // Create category
    createCategory: async (req, res) => {
        try {
            const { nom, description, ordre = 0, actif = true } = req.body;

            if (!nom) {
                return res.status(400).json({
                    success: false,
                    message: 'Le nom de la catégorie est requis'
                });
            }

            const category = await MenuCategory.create({
                nom,
                description,
                ordre,
                actif
            });

            res.status(201).json({
                success: true,
                message: 'Catégorie créée avec succès',
                data: category
            });

        } catch (error) {
            console.error('Error creating category:', error);
            
            if (error.name === 'SequelizeUniqueConstraintError') {
                return res.status(400).json({
                    success: false,
                    message: 'Une catégorie avec ce nom existe déjà'
                });
            }

            res.status(500).json({
                success: false,
                message: 'Erreur lors de la création de la catégorie',
                error: error.message
            });
        }
    },

    // Update category
    updateCategory: async (req, res) => {
        try {
            const { id } = req.params;
            const { nom, description, ordre, actif } = req.body;

            const category = await MenuCategory.findByPk(id);
            if (!category) {
                return res.status(404).json({
                    success: false,
                    message: 'Catégorie non trouvée'
                });
            }

            await category.update({
                nom: nom !== undefined ? nom : category.nom,
                description: description !== undefined ? description : category.description,
                ordre: ordre !== undefined ? ordre : category.ordre,
                actif: actif !== undefined ? actif : category.actif
            });

            res.json({
                success: true,
                message: 'Catégorie mise à jour avec succès',
                data: category
            });

        } catch (error) {
            console.error('Error updating category:', error);
            res.status(500).json({
                success: false,
                message: 'Erreur lors de la mise à jour de la catégorie',
                error: error.message
            });
        }
    },

    // Delete category
    deleteCategory: async (req, res) => {
        try {
            const { id } = req.params;

            const category = await MenuCategory.findByPk(id);
            if (!category) {
                return res.status(404).json({
                    success: false,
                    message: 'Catégorie non trouvée'
                });
            }

            // Check if category has menus
            const menuCount = await Menu.count({ where: { categorie_id: id } });
            if (menuCount > 0) {
                return res.status(400).json({
                    success: false,
                    message: `Impossible de supprimer la catégorie. Elle contient ${menuCount} menu(s)`
                });
            }

            await category.destroy();

            res.json({
                success: true,
                message: 'Catégorie supprimée avec succès'
            });

        } catch (error) {
            console.error('Error deleting category:', error);
            res.status(500).json({
                success: false,
                message: 'Erreur lors de la suppression de la catégorie',
                error: error.message
            });
        }
    }
};

module.exports = categoryController;
