const archiver = require('archiver');
const stream = require('stream');

module.exports = {
    friendlyName: "Export All Notes ZIP",
    description: "Exporte toutes les notes validées d'un trimestre en ZIP (3 CSV).",
    inputs: {
        trimestre: { type: 'string', required: true },
        anneeScolaire: { type: 'string' },
        codeEcole: { type: 'string' },
    },
    exits: {
        success: { responseType: 'ok' },
        notFound: { responseType: 'notFound' },
        forbidden: { responseType: 'forbidden' },
        serverError: { responseType: 'serverError' },
    },
    fn: async function (inputs, exits) {
        try {
            const { user } = this.req.token;
            let userCodeEcole;
            if (user.typeUser === 'ADMINISTRATION' || user.typeUser === 'SECRETARIAT') {
                userCodeEcole = user.codeEcole
            } else if (user.typeUser === 'ADMIN') {
                userCodeEcole = undefined
            } else {
                return exits.notFound({ message: "Vous n'etes pas autoriser a accéder a cette page!" })

            }
            const codeEcole = inputs.codeEcole || user.codeEcole;
            const anneeScolaire = inputs.anneeScolaire || new Date().getFullYear().toString();
            const trimestre = inputs.trimestre;
            //console.log("user", user);
            // 1. Vérifier que toutes les classes sont validées (sur ProfNote)
            const classes = await Classe.find({ codeEcole });
            for (const classe of classes) {
                const totalEntetes = await ProfNote.count({ codeClasse: classe.codeClasse, codeEcole, trimSem: trimestre, anneeScolaire });
                console.log("totalEntetes", totalEntetes);
                const validatedEntetes = await ProfNote.count({ codeClasse: classe.codeClasse, codeEcole, trimSem: trimestre, anneeScolaire, validation: 'OUI' });
                console.log("validatedEntetes", validatedEntetes);
                if (totalEntetes > 0 && totalEntetes !== validatedEntetes) {
                    return exits.forbidden({ message: `Toutes les notes de la classe ${classe.libelleClasse} ne sont pas validées.` });
                }
            }
            console.log("codeEcole", codeEcole);
            // 2. Récupérer tous les entêtes validés pour le trimestre
            const entetes = await ProfNote.find({ codeEcole, trimSem: trimestre, anneeScolaire, validation: 'OUI' });
            const entetesMap = {};
            entetes.forEach(e => { entetesMap[e.codMoy] = e; });
            const codMoyList = entetes.map(e => e.codMoy);
            //console.log("codMoyList", codMoyList);
            // 3. Récupérer tous les détails liés à ces entêtes
            const notes = await ProfNoteDetails.find({ codeEcole, trimSem: trimestre, anneeScolaire, codMoy: codMoyList });
            // 4. Pour chaque note, utiliser le typeNote de l'entête
            function getTypeNote(detail) {
                const entete = entetesMap[detail.codMoy];
                return entete ? entete.typeNote : '';
            }
            console.log("notes", notes);
            const interros = notes.filter(n => getTypeNote(n).startsWith('I'));
            const devoirs = notes.filter(n => getTypeNote(n) === 'D1');
            const compos = notes.filter(n => getTypeNote(n) === 'D2' || getTypeNote(n) === 'D3');
            // 5. Générer les CSV
            function toCsv(rows, typeNoteFn) {
                let csv = 'matricule,code_matiere,trimestre,devoir,note\n';
                for (const n of rows) {
                    csv += `${n.matricule},${n.codeMatiere},${trimestre},${typeNoteFn(n)},${n.note || ''}\n`;
                }
                return csv;
            }
            //console.log("interros");
            //console.log("devoirs", devoirs);
            //console.log("compos", compos);
            const csvInterros = toCsv(interros, getTypeNote);
            const csvDevoirs = toCsv(devoirs, getTypeNote);
            const csvCompos = toCsv(compos, getTypeNote);
            // 6. Créer le ZIP
            this.res.setHeader('Content-disposition', `attachment; filename=export_notes_trimestre_${trimestre}.zip`);
            this.res.set('Content-Type', 'application/zip');
            const archive = archiver('zip', { zlib: { level: 9 } });
            archive.on('error', err => exits.serverError({ message: err.message }));
            archive.pipe(this.res);
            archive.append(csvInterros, { name: `export_Interros_Trimestre_${trimestre}.csv` });
            archive.append(csvDevoirs, { name: `export_Devoirs_Trimestre_${trimestre}.csv` });
            archive.append(csvCompos, { name: `export_Compos_Trimestre_${trimestre}.csv` });
            archive.finalize();
        } catch (e) {
            return exits.serverError({ message: e.message });
        }
    }
}; 