var request = require('request');

module.exports = function(logger, utils) {

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

    // Delete Logic
    this.delete = function (req, res) {

        var method = 'DELETE /cloudanttriggers';

        var id = req.params.id;
        var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);

        //Check that user has access rights to delete a trigger
        var triggerObj = utils.parseQName(id);
        var host = 'https://' + utils.routerHost +':'+ 443;
        var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
        var auth = args.apikey.split(':');

        logger.info(method, 'Checking if user has access rights to delete trigger', id);
        request({
            method: 'get',
            url: triggerURL,
            auth: {
                user: auth[0],
                pass: auth[1]
            }
        }, function(error, response, body) {
            //delete from database if user is authenticated (200) or if trigger has already been deleted (404)
            if (!error && (response.statusCode === 200 || response.statusCode === 404)) {
                utils.deleteTriggerFromDB(id, res);
            }
             else {
                var errorMsg = 'Cloudant data trigger ' + id  + ' cannot be deleted.';
                logger.error(method, errorMsg, error);
                if (error) {
                    res.status(400).json({
                        message: errorMsg,
                        error: error.message
                    });
                }
                else {
                    var info;
                    try {
                        info = JSON.parse(body);
                    }
                    catch (e) {
                        info = 'Authentication request failed with status code ' + response.statusCode;
                    }
                    res.status(response.statusCode).json({
                        message: errorMsg,
                        error: typeof info === 'object' ? info.error : info
                    });
                }
            }
        });
    };

};
