/**
 * TransactionAbonnement.js
 *
 * @description :: Modèle pour gérer l'historique des transactions de paiement 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: 'transaction_abonnement',

    attributes: {
        codeTransaction: {
            type: 'string',
            columnName: 'code_transaction',
            unique: true
        },

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

        // Association optionnelle vers une promotion
        promotion: {
            model: 'promotionabonnement',
            columnName: 'promotion_id'
        },

        // Conserve aussi le code technique si besoin de recherche par code
        codeAbonnement: {
            type: 'string',
            columnName: 'code_abonnement'
        },

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

        typeTransaction: {
            type: 'string',
            columnName: 'type_transaction',
            required: true,
            isIn: ['paiement', 'remboursement', 'annulation', 'renouvellement', 'reduction']
        },

        statut: {
            type: 'string',
            columnName: 'statut',
            //required: true,
            isIn: [
                // Statuts internes
                'en_cours', 'reussi', 'echoue', 'annule', 'en_attente_confirmation',
                // Statuts FedaPay et autres opérateurs
                'approved', 'completed', 'paid', 'succeeded', 'success',
                'canceled', 'failed', 'expired', 'refused', 'declined', 'error',
                'pending', 'processing', 'refunded', 'partially_refunded'
            ],
            defaultsTo: 'en_cours'
        },

        montant: {
            type: 'number',
            columnName: 'montant',
            required: true
        },

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

        methodePaiement: {
            type: 'string',
            columnName: 'methode_paiement',
            required: true,
            isIn: ['mobile_money', 'carte_bancaire', 'virement', 'especes', 'gratuit', 'fedapay']
        },

        referencePaiement: {
            type: 'string',
            columnName: 'reference_paiement'
        },

        referenceExterne: {
            type: 'string',
            columnName: 'reference_externe'
        },

        dateTransaction: {
            type: 'ref',
            columnName: 'date_transaction',
            required: true
        },

        dateConfirmation: {
            type: 'ref',
            columnName: 'date_confirmation'
        },

        operateur: {
            type: 'string',
            columnName: 'operateur',
            required: true,
            isIn: ['fedapay', 'stripe', 'paypal', 'mobile_money_local', 'autre']
        },

        operateurId: {
            type: 'string',
            columnName: 'operateur_id',
            description: 'ID de transaction retourné par l\'opérateur de paiement'
        },

        modePaiement: {
            type: 'string',
            columnName: 'mode_paiement',
            description: 'Mode spécifique de paiement (moov, mtn, orange, visa, mastercard, etc.)'
        },

        numeroTelephone: {
            type: 'string',
            columnName: 'numero_telephone'
        },

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

        fraisTransaction: {
            type: 'number',
            columnName: 'frais_transaction',
            defaultsTo: 0
        },

        receiptUrl: {
            type: 'string',
            columnName: 'receipt_url',
            description: 'URL du reçu de paiement fourni par l\'opérateur'
        },

        montantNet: {
            type: 'number',
            columnName: 'montant_net',
            required: true
        },

        codePromotion: {
            type: 'string',
            columnName: 'code_promotion'
        },

        montantReduction: {
            type: 'number',
            columnName: 'montant_reduction',
            defaultsTo: 0
        },

        commentaires: {
            type: 'string',
            columnName: 'commentaires'
        },

        donneesTechniques: {
            type: 'json',
            columnName: 'donnees_techniques',
            defaultsTo: {}
        },
        codeEcole: {
            type: 'string',
            columnName: 'code_ecole',
            required: true,

        },
    },

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

        // Calculer le montant net
        if (values.montant && values.fraisTransaction) {
            values.montantNet = values.montant - values.fraisTransaction;
        } else if (values.montant) {
            values.montantNet = values.montant;
        }

        // Définir la date de transaction si non fournie
        if (!values.dateTransaction) {
            values.dateTransaction = new Date();
        }

        cb();
    }
}; 