var request = require('request');

module.exports = function(tid, logger, utils) {

    // Test Endpoint
    this.endPoint = '/cloudanttriggers/:id';

    // Update Logic
    this.update = function (req, res) {

        var method = 'PUT /cloudanttriggers';

        logger.info(tid, method);
        var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
        if (args.maxTriggers > utils.triggersLimit) {
            logger.warn(tid, method, 'maxTriggers > ' + utils.triggersLimit + ' is not allowed');
            res.status(400).json({
                error: 'maxTriggers > ' + utils.triggersLimit + ' is not allowed'
            });
            return;
        } else if (!args.callback || !args.callback.action || !args.callback.action.name) {
            logger.warn(tid, method, 'Your callback is unknown for cloudant trigger:', args.callback);
            res.status(400).json({
                error: 'Your callback is unknown for cloudant trigger.'
            });
            return;
        }
        //Check that user has access rights to create a trigger
        var triggerName = args.callback.action.name;
        var triggerObj = utils.parseQName(triggerName);
        var host = 'https://' + utils.routerHost +':'+ 443;
        var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
        var auth = args.apikey.split(':');

        logger.info(tid, method, 'Checking if user has access rights to create a trigger');
        request({
            method: 'get',
            url: triggerURL,
            auth: {
                user: auth[0],
                pass: auth[1]
            }
        }, function(error, response, body) {
            if (error || response.statusCode >= 400) {
                var errorMsg = 'Trigger authentication request failed.';
                logger.error(tid, method, errorMsg, error);
                if (error) {
                    res.status(400).json({
                        message: errorMsg,
                        error: error.message
                    });
                }
                else {
                    var info = JSON.parse(body);
                    res.status(response.statusCode).json({
                        message: errorMsg,
                        error: info.error
                    });
                }
            }
            else {
                var id = req.params.id;
                var trigger = utils.initTrigger(args, id);
                // 10 is number of retries to create a trigger.
                utils.createTrigger(trigger, 10)
                .then(function (newTrigger) {
                    logger.info(tid, method, 'Trigger was added and database is confirmed.', newTrigger);
                    utils.addTriggerToDB(newTrigger, res);
                }, function (err) {
                    logger.error(tid, method, 'Trigger could not be created.', err);
                    utils.deleteTrigger(id);
                    res.status(400).json({
                        message: 'Trigger could not be created.',
                        error: err
                    });
                });
            }
        });
    };

};
