/**
 * PromotionAbonnement.js
 *
 * @description :: Modèle pour gérer les promotions et codes de réduction des 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: 'promotion_abonnement',

    attributes: {
        codePromotion: {
            type: 'string',
            columnName: 'code_promotion',
            unique: true
        },

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

        description: {
            type: 'string',
            columnName: 'description',
            allowNull: true
        },

        typeReduction: {
            type: 'string',
            columnName: 'type_reduction',
            required: true,
            isIn: ['pourcentage', 'montant_fixe', 'gratuit']
        },

        valeurReduction: {
            type: 'number',
            columnName: 'valeur_reduction',
            required: true
        },

        devise: {
            type: 'string',
            columnName: 'devise',
            defaultsTo: 'XOF'
        },

        codeEcole: {
            type: 'string',
            columnName: 'code_ecole',
            allowNull: true // null = valable pour toutes les écoles
        },

        typesAbonnementApplicables: {
            type: 'json',
            columnName: 'types_abonnement_applicables',
            defaultsTo: []
        },

        dateDebut: {
            type: 'ref',
            columnName: 'date_debut',
            required: true
        },

        dateFin: {
            type: 'ref',
            columnName: 'date_fin',
            required: true
        },

        nombreUtilisationsMax: {
            type: 'number',
            columnName: 'nombre_utilisations_max',
            allowNull: true // null = illimité
        },

        nombreUtilisationsActuelles: {
            type: 'number',
            columnName: 'nombre_utilisations_actuelles',
            defaultsTo: 0
        },

        nombreUtilisationsParParent: {
            type: 'number',
            columnName: 'nombre_utilisations_par_parent',
            defaultsTo: 1
        },

        parentsUtilises: {
            type: 'json',
            columnName: 'parents_utilises',
            defaultsTo: []
        },

        actif: {
            type: 'boolean',
            columnName: 'actif',
            defaultsTo: true
        },

        montantMinimum: {
            type: 'number',
            columnName: 'montant_minimum',
            defaultsTo: 0
        },

        montantMaximum: {
            type: 'number',
            columnName: 'montant_maximum',
            allowNull: true
        },

        codeOffreApplicable: {
            type: 'string',
            columnName: 'code_offre_applicable',
            allowNull: true // null = applicable à toutes les offres
        },

        couleur: {
            type: 'string',
            columnName: 'couleur',
            allowNull: true
        },

        // Relations
        transactions: {
            collection: 'transactionabonnement',
            via: 'promotion'
        },

        abonnements: {
            collection: 'abonnement',
            via: 'promotion'
        }
    },

    beforeCreate: function (values, cb) {
        // Générer un code court et lisible
        if (!values.codePromotion) {
            values.codePromotion = shortId('PROMO_');
        }
        cb();
    }
}; 