/**
 * check-status.js
 *
 * @description :: Vérifier le statut d'un abonnement
 * @help        :: Voir http://sailsjs.com/#!/documentation/concepts/Controllers
 */

module.exports = {
    friendlyName: 'Vérifier le statut d\'un abonnement',

    description: 'Vérifier le statut d\'un abonnement et le mettre à jour si nécessaire',

    inputs: {
        codeAbonnement: {
            type: 'string',
            required: true,
            description: 'Code de l\'abonnement à vérifier'
        }
    },

    exits: {
        success: {
            description: 'Statut vérifié avec succès',
            responseType: 'ok'
        },
        abonnementNonTrouve: {
            description: 'L\'abonnement spécifié n\'existe pas',
            responseType: 'notFound'
        }
    },

    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 l'abonnement existe
            const abonnement = await Abonnement.findOne({ codeAbonnement: inputs.codeAbonnement, codeEcole: user.codeEcole });
            if (!abonnement) {
                return exits.abonnementNonTrouve({
                    message: 'Abonnement non trouvé',
                    code: 'SUBSCRIPTION_NOT_FOUND'
                });
            }

            const maintenant = new Date();
            const dateFin = new Date(abonnement.dateFin);
            let statutMisAJour = false;
            let nouveauStatut = abonnement.statut;
            let notifications = [];

            // Vérifier si l'abonnement a expiré
            if (abonnement.statut === 'actif' && maintenant > dateFin) {
                nouveauStatut = 'expire';
                statutMisAJour = true;

                // Créer une notification d'expiration
                notifications.push({
                    codeEcole: user.codeEcole,
                    typeNotification: 'expiration',
                    titre: 'Abonnement expiré',
                    message: 'Votre abonnement a expiré. Veuillez le renouveler pour continuer à bénéficier de nos services.',
                    priorite: 'haute'
                });
            }

            // Vérifier si l'abonnement expire bientôt (7 jours avant)
            if (abonnement.statut === 'actif') {
                const dateExpirationProche = new Date(dateFin);
                dateExpirationProche.setDate(dateExpirationProche.getDate() - 7);

                if (maintenant >= dateExpirationProche && maintenant < dateFin) {
                    // Vérifier si une notification d'expiration proche a déjà été envoyée
                    const notificationExistante = await NotificationAbonnement.findOne({
                        codeAbonnement: inputs.codeAbonnement,
                        typeNotification: 'expiration_proche',
                        statut: 'envoyee',
                        codeEcole: user.codeEcole
                    });

                    if (!notificationExistante) {
                        notifications.push({
                            codeEcole: user.codeEcole,
                            typeNotification: 'expiration_proche',
                            titre: 'Expiration proche',
                            message: `Votre abonnement expire le ${dateFin.toLocaleDateString('fr-FR')}. Pensez à le renouveler !`,
                            priorite: 'normale'
                        });
                    }
                }
            }

            // Vérifier si l'essai a expiré
            if (abonnement.statut === 'essai' && maintenant > dateFin) {
                nouveauStatut = 'expire';
                statutMisAJour = true;

                notifications.push({
                    codeEcole: user.codeEcole,
                    typeNotification: 'essai_fin',
                    titre: 'Période d\'essai terminée',
                    message: 'Votre période d\'essai a pris fin. Passez à un abonnement payant pour continuer.',
                    priorite: 'haute'
                });
            }

            // Mettre à jour le statut si nécessaire
            if (statutMisAJour) {
                await Abonnement.updateOne({ codeAbonnement: inputs.codeAbonnement })
                    .set({ statut: nouveauStatut });

                abonnement.statut = nouveauStatut;
            }

            // Créer les notifications
            for (const notification of notifications) {
                await NotificationAbonnement.create({
                    codeEcole: user.codeEcole,
                    codeAbonnement: inputs.codeAbonnement,
                    codeParent: abonnement.codeParent,
                    ...notification,
                    statut: 'envoyee',
                    dateEnvoi: new Date(), // Champ requis manquant
                    canauxEnvoi: ['push', 'email', 'sms'], // Valeur par défaut
                    statutEnvoi: { // Valeur par défaut
                        push: 'non_envoye',
                        email: 'non_envoye',
                        sms: 'non_envoye'
                    }
                });
            }

            // Récupérer les informations complètes
            const offre = await OffreAbonnement.findOne({ codeOffre: abonnement.codeOffre });
            const parent = await Parents.findOne({ codeParent: abonnement.codeParent });
            const ecole = await Ecoles.findOne({ codeEcole: abonnement.codeEcole });

            // Calculer les jours restants
            const joursRestants = Math.ceil((dateFin - maintenant) / (1000 * 60 * 60 * 24));

            return exits.success({
                message: 'Statut vérifié avec succès',
                data: {
                    abonnement: {
                        ...abonnement,
                        offre: offre || null,
                        parent: parent ? {
                            codeParent: parent.codeParent,
                            nom: parent.nom,
                            prenom: parent.prenom,
                            email: parent.email
                        } : null,
                        ecole: ecole ? {
                            codeEcole: ecole.codeEcole,
                            nom: ecole.nom,
                            ville: ecole.ville
                        } : null
                    },
                    statut: {
                        actuel: abonnement.statut,
                        misAJour: statutMisAJour,
                        joursRestants: joursRestants > 0 ? joursRestants : 0,
                        expire: maintenant > dateFin,
                        expirationProche: joursRestants <= 7 && joursRestants > 0
                    },
                    notifications: notifications.length > 0 ? notifications : null
                }
            });

        } catch (error) {
            sails.log.error('Erreur lors de la vérification du statut:', error);
            return exits.error({
                message: 'Erreur interne du serveur',
                error: error.message
            });
        }
    }
}; 