var express = require('express');
var router = new express.Router();
var config = require('../config.js');
var mail = require('../mail.js');
var template = require('../template.js');
var httpRequest = require('request');
var auth = require('../auth.js');

// Auth middleware
var requestToken = function(request, response, next) {
    auth.init(request, response, next);
};

// Printer setup
router.get('/printer-setup/:clientId', requestToken, function(request, response) {
    mail.sendWithTemplate('printer-setup', {clientId: request.params.clientId}, error => {
        if (error)
            return response.status(400).json({message: error.message});

        return response.json();
    });
});

// Printer setup preview
router.get('/printer-setup/:clientId/preview', requestToken, function(request, response) {
    template.get('printer-setup', {clientId: request.params.clientId, isPreview: true}, (error, result) => {
        if (error)
            return response.status(400).json({message: error.message});

        response.send(result.body);
    });
});

// Client welcome
router.get('/client-welcome/:clientId', requestToken, function(request, response) {
    mail.sendWithTemplate('client-welcome', {clientId: request.params.clientId}, error => {
        if (error)
            return response.status(400).json({message: error.message});
            
        return response.json();
    });
});

// Client welcome preview
router.get('/client-welcome/:clientId/preview', requestToken, function(request, response) {
    template.get('client-welcome', {clientId: request.params.clientId, isPreview: true}, (error, result) => {
        if (error)
            return response.status(400).json({message: error.message});

        response.send(result.body);
    });
});

// Client SEPA CORE
router.get('/sepa-core/:companyId/:clientId', requestToken, function(request, response) {
    let params = {
        clientId: request.params.clientId,
        companyId: request.params.companyId
    };

    let path = `${request.proxyHost}/print/manuscript/sepa-core/${params.companyId}/${params.clientId}`;
    let options = {
        url: path,
        method: 'GET',
        headers: {
            'Authorization': request.headers.authorization
        }
    }

    let httpStream = httpRequest(options, function(error, httpResponse, body) {
        if (error || httpResponse.statusCode != 200)
            return response.status(400).json({message: error});
    });

    if (httpStream)
        params.attachments = [{filename: 'sepa-core.pdf', content: httpStream}];

        mail.sendWithTemplate('sepa-core', params, error => {
            if (error)
                return response.status(400).json({message: error.message});
            
            return response.json();
        }); 
});

// Client SEPA CORE preview
router.get('/sepa-core/:companyId/:clientId/preview', requestToken, function(request, response) {
    let params = {
        clientId: request.params.clientId, 
        companyId: request.params.companyId, 
        token: request.user.token, 
        isPreview: true
    };

    template.get('sepa-core', params, (error, result) => {
            if (error)
                return response.status(400).json({message: error.message});

            response.send(result.body);
    });
});

// First debtor letter
router.get('/letter-debtor-st/:companyId/:clientId', requestToken, function(request, response) {
    let params = {
        clientId: request.params.clientId, 
        companyId: request.params.companyId,
        token: request.user.token
    };

    let path = `${request.proxyHost}/print/manuscript/letter-debtor/${params.companyId}/${params.clientId}`;
    let options = {
        url: path,
        method: 'GET',
        headers: {
            'Authorization': request.user.token
        }
    }

    let httpStream = httpRequest(options, function(error, httpResponse, body) {
        if (error || httpResponse.statusCode != 200)
            return response.status(400).json({message: error});
    });

    if (httpStream)
        params.attachments = [{filename: 'extracto.pdf', content: httpStream}];

        mail.sendWithTemplate('letter-debtor-st', params, error => {
            if (error)
                return response.status(400).json({message: error.message});
            
            return response.json();
        }); 
});

// First debtor letter preview
router.get('/letter-debtor-st/:companyId/:clientId/preview', requestToken, function(request, response) {
    template.get('letter-debtor-st', {
            clientId: request.params.clientId, 
            companyId: request.params.companyId,
            token: request.user.token, 
            isPreview: true
        }, (error, result) => {
            if (error)
                return response.status(400).json({message: error.message});

            response.send(result.body);
    });
});

// Second debtor letter
router.get('/letter-debtor-nd/:companyId/:clientId', requestToken, function(request, response) {
    let params = {
        clientId: request.params.clientId, 
        companyId: request.params.companyId,
        token: request.user.token
    };

    let path = `${request.proxyHost}/print/manuscript/letter-debtor/${params.companyId}/${params.clientId}`;
    let options = {
        url: path,
        method: 'GET',
        headers: {
            'Authorization': request.headers.authorization
        }
    }

    let httpStream = httpRequest(options, function(error, httpResponse, body) {
        if (error || httpResponse.statusCode != 200)
            return response.status(400).json({message: error});
    });

    if (httpStream)
        params.attachments = [{filename: 'extracto.pdf', content: httpStream}];

        mail.sendWithTemplate('letter-debtor-nd', params, error => {
            if (error)
                return response.status(400).json({message: error.message});
            
            return response.json();
        }); 
});

// Second debtor letter preview
router.get('/letter-debtor-nd/:companyId/:clientId/preview', requestToken, function(request, response) {
    template.get('letter-debtor-nd', {
            clientId: request.params.clientId, 
            companyId: request.params.companyId, 
            token: request.user.token, 
            isPreview: true
        }, (error, result) => {
            if (error)
                return response.status(400).json({message: error.message});

            response.send(result.body);
    });
});

// Payment method changes
router.get('/payment-update/:clientId', requestToken, function(request, response) {
    mail.sendWithTemplate('payment-update', {clientId: request.params.clientId}, error => {
        if (error)
            return response.status(400).json({message: error.message});
            
        return response.json();
    });
});

// Send notification to alias creditInsurance on client deactivate
router.get('/client-deactivate/:clientId', requestToken, function(request, response) {
    var params = {
        alias: 'creditInsurance',
        code: 'clientDeactivate',
        bodyParams: {
            clientId: request.params.clientId
        }
    };

    mail.sendWithTemplate('notification-alias', params, error => {
        if (error)
            response.status(400).json({message: error.message});
            
        return response.json();
    });
});

module.exports = router;


// Single user notification
/* router.post('/:recipient/noticeUserSend', function(request, response) {
    var params = {
        recipient: request.params.recipient,
        sender: request.body.sender,
        category: request.body.category,
        message: request.body.message
    };

    if (params.sender == params.recipient)
        return;

    let query = `SELECT COUNT(*) isEnabled 
                FROM noticeSubscription s 
                    JOIN noticeCategory c ON c.id = s.noticeCategoryFk AND c.isEnabled 
                WHERE c.keyName = ? AND s.userFk = ?`;

    database.pool.query(query, [params.category, params.recipient, params.sender], (error, result) => {
        mail.sendWithTemplate('notification-notice', params, result => {
            return response.json(result);
        });
    });
}); */

// Send notification to all user subscribed to category
/* router.post('/:category/noticeCategorySend', function(request, response) {
    var params = {
        sender: request.body.sender,
        category: request.params.category,
        message: request.body.message
    };

    let query = `SELECT s.userFk id FROM noticeSubscription s JOIN noticeCategory
                 c ON c.id = s.noticeCategoryFk AND c.isEnabled WHERE c.keyName = ? AND s.userFk != ?`;

    database.pool.query(query, [params.category, params.sender], (error, result) => {
        result.forEach(function(user) {
            params.recipient = user.id;

            mail.sendWithTemplate('notification-notice', params, result => {
                return response.json(result);
            });
        }, this);
    });
}); */

// Send system notification
/* router.post('/:recipient/noticeSystemSend', function(request, response) {
    var params = {
        recipient: request.params.recipient,
        sender: settings.smtp().auth.id,
        category: request.body.category,
        message: request.body.message
    };

    mail.sendWithTemplate('notification-notice', params, result => {
        return response.json(result);
    });
}); */