/**
 * NotificationAbonnement.js
 *
 * @description :: Modèle pour gérer les notifications liées aux abonnements
 * @docs        :: https://sailsjs.com/docs/concepts/models-and-orm/models
 */

const crypto = require('crypto');
const shortId = (prefix) => `${prefix}${crypto.randomBytes(4).toString('hex').toUpperCase()}`;

module.exports = {
    tableName: 'notification_abonnement',

    attributes: {
        codeNotification: {
            type: 'string',
            columnName: 'code_notification',
            unique: true
        },

        // Association vers Abonnement (FK Waterline)
        abonnement: {
            model: 'abonnement',
            columnName: 'abonnement_id'
        },

        // Conserve aussi le code technique si besoin
        codeAbonnement: {
            type: 'string',
            columnName: 'code_abonnement',
            required: true
        },

        codeParent: {
            type: 'string',
            columnName: 'code_parent',
            required: true
        },

        typeNotification: {
            type: 'string',
            columnName: 'type_notification',
            required: true,
            isIn: [
                'expiration_proche',
                'expiration',
                'renouvellement_auto',
                'paiement_reussi',
                'paiement_echoue',
                'offre_speciale',
                'promotion_disponible',
                'essai_commence',
                'essai_fin',
                'suspension',
                'reactivation',
                'abonnement_active',
                'annulation'
            ]
        },

        titre: {
            type: 'string',
            columnName: 'titre',
            required: true
        },

        message: {
            type: 'string',
            columnName: 'message',
            required: true
        },

        statut: {
            type: 'string',
            columnName: 'statut',
            isIn: ['envoyee', 'lue', 'non_lue', 'echoue'],
            defaultsTo: 'non_lue'
        },

        dateEnvoi: {
            type: 'ref',
            columnName: 'date_envoi',
            required: true
        },

        dateLecture: {
            type: 'ref',
            columnName: 'date_lecture'
        },

        canauxEnvoi: {
            type: 'json',
            columnName: 'canaux_envoi',
            defaultsTo: ['push', 'email', 'sms']
        },

        statutEnvoi: {
            type: 'json',
            columnName: 'statut_envoi',
            defaultsTo: {
                push: 'non_envoye',
                email: 'non_envoye',
                sms: 'non_envoye'
            }
        },

        donneesSupplementaires: {
            type: 'json',
            columnName: 'donnees_supplementaires',
            defaultsTo: {}
        },

        priorite: {
            type: 'string',
            columnName: 'priorite',
            isIn: ['basse', 'normale', 'haute', 'urgente'],
            defaultsTo: 'normale'
        },

        actionRequise: {
            type: 'boolean',
            columnName: 'action_requise',
            defaultsTo: false
        },

        actionType: {
            type: 'string',
            columnName: 'action_type'
        },

        actionUrl: {
            type: 'string',
            columnName: 'action_url'
        },

        nombreTentatives: {
            type: 'number',
            columnName: 'nombre_tentatives',
            defaultsTo: 0
        },

        dateDerniereTentative: {
            type: 'ref',
            columnName: 'date_derniere_tentative'
        },

        erreurEnvoi: {
            type: 'string',
            columnName: 'erreur_envoi'
        },
        codeEcole: {
            type: 'string',
            columnName: 'code_ecole',
            required: true,

        },
    },

    beforeCreate: function (values, cb) {
        // Générer un code court et lisible pour la notification
        if (!values.codeNotification) {
            values.codeNotification = shortId('NOTIF_');
        }

        // Définir la date d'envoi si non fournie
        if (!values.dateEnvoi) {
            values.dateEnvoi = new Date();
        }

        cb();
    }
}; 