/**
 * validate.js
 *
 * @description :: Valider un code promotionnel
 * @help        :: Voir http://sailsjs.com/#!/documentation/concepts/Controllers
 */

module.exports = {
    friendlyName: 'Valider un code promotionnel',

    description: 'Valider un code promotionnel et calculer la réduction',

    inputs: {
        codePromotion: {
            type: 'string',
            required: true,
            description: 'Code promotionnel à valider'
        },
        codeParent: {
            type: 'string',
            required: true,
            description: 'Code du parent qui utilise la promotion'
        },
        codeOffre: {
            type: 'string',
            required: true,
            description: 'Code de l\'offre pour laquelle la promotion est utilisée'
        },
        montantOriginal: {
            type: 'number',
            required: true,
            description: 'Montant original de l\'offre'
        }
    },

    exits: {
        success: {
            description: 'Code promotionnel validé avec succès',
            responseType: 'ok'
        },
        promotionNonTrouvee: {
            description: 'Le code promotionnel n\'existe pas',
            responseType: 'notFound'
        },
        promotionInactive: {
            description: 'Le code promotionnel est inactif',
            responseType: 'badRequest'
        },
        promotionExpiree: {
            description: 'Le code promotionnel a expiré',
            responseType: 'badRequest'
        },
        promotionEpuisee: {
            description: 'Le code promotionnel a été épuisé',
            responseType: 'badRequest'
        },
        promotionDejaUtilisee: {
            description: 'Le code promotionnel a déjà été utilisé par ce parent',
            responseType: 'badRequest'
        },
        offreNonCompatible: {
            description: 'Le code promotionnel n\'est pas compatible avec cette offre',
            responseType: 'badRequest'
        },
        montantInsuffisant: {
            description: 'Le montant minimum requis n\'est pas atteint',
            responseType: 'badRequest'
        }
    },

    fn: async function (inputs, exits) {
        const { id, user } = this.req.token;
        // console.log("ID", id, user.login, user.typeUser, user.codeEcole)
        // VERIFICATION DU CODE ECOLE
        if (user.codeEcole === '' || user.codeEcole === null || user.codeEcole === undefined) {
            return exits.notFound({ message: "Veuillez préciser le code Ecole pour cet utulisateur pour a accéder a cette page!" })
        }
        ecoleVerif = await Ecoles.find({ codeEcole: user.codeEcole }).then(_.first)
        if (!ecoleVerif) {
            return exits.notFound({ message: "Cet utilisateur n'est attribué a aucune classe!" })
        }
        // FIN VERIF CODE ECOLE  
        try {
            // Vérifier que la promotion existe
            const promotion = await PromotionAbonnement.findOne({ codePromotion: inputs.codePromotion, codeEcole: user.codeEcole });
            if (!promotion) {
                return exits.promotionNonTrouvee({
                    message: 'Code promotionnel invalide',
                    code: 'PROMOTION_NOT_FOUND'
                });
            }

            // Vérifier que la promotion est active
            if (!promotion.actif) {
                return exits.promotionInactive({
                    message: 'Ce code promotionnel n\'est plus actif',
                    code: 'PROMOTION_INACTIVE'
                });
            }

            // Vérifier la validité temporelle
            const maintenant = new Date();
            if (promotion.dateDebut > maintenant || promotion.dateFin < maintenant) {
                return exits.promotionExpiree({
                    message: 'Ce code promotionnel a expiré ou n\'est pas encore valide',
                    code: 'PROMOTION_EXPIRED',
                    dateDebut: promotion.dateDebut,
                    dateFin: promotion.dateFin
                });
            }

            // Vérifier le nombre d'utilisations
            if (promotion.nombreUtilisationsMax &&
                promotion.nombreUtilisationsActuelles >= promotion.nombreUtilisationsMax) {
                return exits.promotionEpuisee({
                    message: 'Ce code promotionnel a été épuisé',
                    code: 'PROMOTION_EXHAUSTED',
                    utilisationsMax: promotion.nombreUtilisationsMax,
                    utilisationsActuelles: promotion.nombreUtilisationsActuelles
                });
            }

            // Vérifier les utilisations par parent
            const utilisationsParent = promotion.parentsUtilises.filter(p => p.codeParent === inputs.codeParent).length;
            if (utilisationsParent >= promotion.nombreUtilisationsParParent) {
                return exits.promotionDejaUtilisee({
                    message: 'Vous avez déjà utilisé ce code promotionnel',
                    code: 'PROMOTION_ALREADY_USED',
                    utilisationsParParent: promotion.nombreUtilisationsParParent,
                    utilisationsActuelles: utilisationsParent
                });
            }

            // Vérifier la compatibilité avec l'offre
            if (promotion.codeOffreApplicable && promotion.codeOffreApplicable !== inputs.codeOffre) {
                return exits.offreNonCompatible({
                    message: 'Ce code promotionnel n\'est pas compatible avec cette offre',
                    code: 'INCOMPATIBLE_OFFER',
                    offreApplicable: promotion.codeOffreApplicable
                });
            }

            // Vérifier le montant minimum
            if (inputs.montantOriginal < promotion.montantMinimum) {
                return exits.montantInsuffisant({
                    message: `Le montant minimum requis est de ${promotion.montantMinimum} ${promotion.devise}`,
                    code: 'INSUFFICIENT_AMOUNT',
                    montantMinimum: promotion.montantMinimum,
                    montantFourni: inputs.montantOriginal
                });
            }

            // Vérifier le montant maximum
            if (promotion.montantMaximum && inputs.montantOriginal > promotion.montantMaximum) {
                return exits.montantInsuffisant({
                    message: `Le montant maximum autorisé est de ${promotion.montantMaximum} ${promotion.devise}`,
                    code: 'EXCESSIVE_AMOUNT',
                    montantMaximum: promotion.montantMaximum,
                    montantFourni: inputs.montantOriginal
                });
            }

            // Calculer la réduction
            let montantReduction = 0;
            let montantFinal = inputs.montantOriginal;

            if (promotion.typeReduction === 'pourcentage') {
                montantReduction = (inputs.montantOriginal * promotion.valeurReduction) / 100;
                montantFinal = inputs.montantOriginal - montantReduction;
            } else if (promotion.typeReduction === 'montant_fixe') {
                montantReduction = promotion.valeurReduction;
                montantFinal = inputs.montantOriginal - montantReduction;
            } else if (promotion.typeReduction === 'gratuit') {
                montantReduction = inputs.montantOriginal;
                montantFinal = 0;
            }

            // S'assurer que le montant final n'est pas négatif
            if (montantFinal < 0) {
                montantFinal = 0;
                montantReduction = inputs.montantOriginal;
            }

            return exits.success({
                message: 'Code promotionnel validé avec succès',
                data: {
                    promotion: {
                        codePromotion: promotion.codePromotion,
                        nom: promotion.nom,
                        description: promotion.description,
                        typeReduction: promotion.typeReduction,
                        valeurReduction: promotion.valeurReduction,
                        devise: promotion.devise
                    },
                    calcul: {
                        montantOriginal: inputs.montantOriginal,
                        montantReduction: montantReduction,
                        montantFinal: montantFinal,
                        pourcentageReduction: promotion.typeReduction === 'pourcentage' ? promotion.valeurReduction : null
                    },
                    validite: {
                        dateDebut: promotion.dateDebut,
                        dateFin: promotion.dateFin,
                        utilisationsRestantes: promotion.nombreUtilisationsMax ?
                            promotion.nombreUtilisationsMax - promotion.nombreUtilisationsActuelles : null,
                        utilisationsParParentRestantes: promotion.nombreUtilisationsParParent - utilisationsParent
                    }
                }
            });

        } catch (error) {
            sails.log.error('Erreur lors de la validation du code promotionnel:', error);
            return exits.error({
                message: 'Erreur interne du serveur',
                error: error.message
            });
        }
    }
}; 