Source: models/core/core_printing.js

const EventEmitter = require('events');
const Printer = require('pdf-to-printer');
const fs = require('fs');

class Printing extends EventEmitter {

    /**
     * Class offers printing related functionality to ALARMiator core
     * @constructor
     */
    constructor() {
        super();

        this.availablePrinters = [];    // holds all available printers
        this.defaultPrinter = '';       // holds the defailt printer
        this.printerToUse = '';         // if not default printer -> add the printer to print on in this property
                                        // is set to default printer during initialization and needs to be overwritten
                                        // if another printer has to be used.
        
        try {
            this.getAvailablePrinters((success) => {
                if (success) {
                    console.log(`CORE | PRINTING | Read available printers`);
                    this.getDefaultPrinter((successDefault) => {
                        if (successDefault) {
                            console.log('CORE | PRINTING | Identified default Printer: ' + this.defaultPrinter);
                        } else {
                            console.log('CORE | PRINTING | Could not identify default printer. Check if default is set at operating system lebel.')
                        }
                    })
                } else {
                    console.log('CORE | PRINTING | Could not read available printers. Check if a printer is installed at operating system level.')
                }
            });    // initialized list of available printers
        } catch (err) {
            console.log('CORE | PRINTING | Error initializing printing: ' + err.message);
        }
    }

    /**
     * Returns list of availbale printers
     * @param {function} callback success (true/false)
     */
    getAvailablePrinters(callback) {
        Printer
            .getPrinters()
            .then((printers) => {
                if (printers !== null) {
                    this.availablePrinters = printers;
                    callback(true);
                } else {
                    this.availablePrinters = [];
                    callback(false);
                }
            })
            .catch((err) => {
                console.log('CORE | PRINTING | ERROR: ' + err.message);
                callback(false);
            });
    }

    /**
     * gets the default printer from os and sets the printer to be used
     * @param {function} callback success (true/false)
     */
    getDefaultPrinter(callback) {
        Printer
            .getDefaultPrinter()
            .then((printer) => {
                this.defaultPrinter = printer;
                this.printerToUse = printer;

                callback(true);
            })
            .catch((err) => {
                console.log('CORE | PRINTING | getting Default Printer | ERROR: ' + err.message);
                callback(false);
            })
    }

    /**
     * Sends a PDF Document to default printer
     * @param {string} pdfPath path to pdf file to be printed
     * @param {function} callback success (true/false)
     */
    printPDFToDefaultPrinter(pdfPath, callback) {
        try {
            if (fs.existsSync(pdfPath)) {
                // Set page to be printed scaled to fit a page of the printer
                const options = {
                    printer: this.printerToUse,
                    unix: ["-o fit-to-page"],
                    win32: ['-print-settings "fit"']
                };

                Printer
                    .print(pdfPath, options)
                    .then((result) => {
                        console.log('CORE | PRINTING | Printjob dispatched: ' + result);
                        return callback(true);
                    })
                    .catch((err) => {
                        console.log('CORE | PRINTING | ERROR | Error printing document: ' + err.message);
                        return callback(false);
                    });
            } else {
                console.log('CORE | PRINTING | ERROR | PDF File to be printed can not be found: ' + pdfPath);
                return callback(false);
            }
        } catch (err) {
            console.log('CORE PRINTING | ERROR | Error while printing a pdf document: ' + err.message);
            return callback(false);
        }   
    }
}

module.exports = Printing;