/**
 * create.js
 *
 * @description :: Créer une nouvelle offre d'abonnement
 * @help        :: Voir http://sailsjs.com/#!/documentation/concepts/Controllers
 */

module.exports = {
    friendlyName: 'Créer une offre d\'abonnement',

    description: 'Créer une nouvelle offre d\'abonnement',

    inputs: {
        nom: {
            type: 'string',
            required: true,
            description: 'Nom de l\'offre'
        },
        description: {
            type: 'string',
            allowNull: true,
            description: 'Description de l\'offre'
        },
        typeAbonnement: {
            type: 'string',
            required: true,
            isIn: ['gratuit', 'mensuel', 'trimestriel', 'semestriel', 'annuel', 'essai'],
            description: 'Type d\'abonnement'
        },
        dureeJours: {
            type: 'number',
            required: true,
            min: 1,
            description: 'Durée en jours'
        },
        montant: {
            type: 'number',
            required: true,
            min: 0,
            description: 'Montant de l\'offre'
        },
        devise: {
            type: 'string',
            required: true,
            description: 'Devise'
        },
        fonctionnalites: {
            type: 'json',
            defaultsTo: [],
            description: 'Liste des fonctionnalités incluses'
        },
        codeEcole: {
            type: 'string',
            allowNull: true,
            description: 'Code de l\'école (null pour toutes les écoles)'
        },
        dateDebutValidite: {
            type: 'string',
            allowNull: true,
            description: 'Date de début de validité (format YYYY-MM-DD)'
        },
        dateFinValidite: {
            type: 'string',
            allowNull: true,
            description: 'Date de fin de validité (format YYYY-MM-DD)'
        },
        ordreAffichage: {
            type: 'number',
            defaultsTo: 0,
            description: 'Ordre d\'affichage'
        },
        couleur: {
            type: 'string',
            allowNull: true,
            description: 'Couleur de l\'offre'
        },
        icone: {
            type: 'string',
            allowNull: true,
            description: 'Icône de l\'offre'
        }
    },

    exits: {
        success: {
            description: 'Offre créée avec succès',
            responseType: 'ok'
        },
        invalidDate: {
            description: 'Format de date invalide',
            responseType: 'badRequest'
        },
        ecoleNonTrouvee: {
            description: 'L\'école spécifiée n\'existe pas',
            responseType: 'notFound'
        }
    },

    fn: async function (inputs, exits) {
        try {
            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!" })
            }
            // FIN VERIF CODE ECOLE
            // Vérifier que l'école existe si spécifiée
            if (user.codeEcole) {
                const ecole = await Ecoles.findOne({ codeEcole: user.codeEcole });
                if (!ecole) {
                    return exits.ecoleNonTrouvee({
                        message: 'École non trouvée',
                        code: 'SCHOOL_NOT_FOUND'
                    });
                }
            }

            // Valider les dates si fournies
            let dateDebutValidite = null;
            let dateFinValidite = null;

            if (inputs.dateDebutValidite) {
                try {
                    dateDebutValidite = new Date(inputs.dateDebutValidite);
                } catch (error) {
                    return exits.invalidDate({
                        message: 'Format de date de début invalide',
                        code: 'INVALID_START_DATE'
                    });
                }
            }

            if (inputs.dateFinValidite) {
                try {
                    dateFinValidite = new Date(inputs.dateFinValidite);
                } catch (error) {
                    return exits.invalidDate({
                        message: 'Format de date de fin invalide',
                        code: 'INVALID_END_DATE'
                    });
                }
            }

            // Vérifier la cohérence des dates
            if (dateDebutValidite && dateFinValidite && dateDebutValidite >= dateFinValidite) {
                return exits.invalidDate({
                    message: 'La date de fin doit être postérieure à la date de début',
                    code: 'INVALID_DATE_RANGE'
                });
            }

            // Créer l'offre
            const nouvelleOffre = await OffreAbonnement.create({
                nom: inputs.nom,
                description: inputs.description,
                typeAbonnement: inputs.typeAbonnement,
                dureeJours: inputs.dureeJours,
                montant: inputs.montant,
                devise: inputs.devise,
                fonctionnalites: inputs.fonctionnalites,
                codeEcole: user.codeEcole,
                dateDebutValidite: dateDebutValidite,
                dateFinValidite: dateFinValidite,
                ordreAffichage: inputs.ordreAffichage,
                couleur: inputs.couleur,
                icone: inputs.icone,
                actif: true,
                codeEcole: user.codeEcole
            }).fetch();

            return exits.success({
                message: 'Offre d\'abonnement créée avec succès',
                data: nouvelleOffre
            });

        } catch (error) {
            sails.log.error('Erreur lors de la création de l\'offre d\'abonnement:', error);
            return exits.error({
                message: 'Erreur interne du serveur',
                error: error.message
            });
        }
    }
}; 