var request = require('request');

function main(msg) {
    console.log("cloudant trigger feed: ", msg);

    // lifecycleEvent is one of [ create, delete ]
    var lifecycleEvent = (msg.lifecycleEvent || 'CREATE').trim().toUpperCase();

    var namespace = process.env.__OW_NAMESPACE;
    var triggerName = parseQName(msg.triggerName).name;

    var trigger = '/' + namespace + '/' + triggerName;
    var replaceNameTrigger = trigger.replace(/\//g, ":");

    // configuration parameters
    var provider_endpoint = msg.package_endpoint;
    var dbname = msg.dbname;
    var user = msg.username;
    var pass = msg.password;
    var host = msg.host;
    var protocol = msg.protocol || 'https';
    var port = msg.port;
    var maxTriggers = msg.maxTriggers;

    if (lifecycleEvent === 'CREATE') {

    	// check for parameter errors
        if (msg.includeDoc) {
            return Promise.reject('cloudant trigger feed: includeDoc parameter is no longer supported');
        }
        if (!dbname) {
        	return Promise.reject('cloudant trigger feed: missing dbname parameter - ' + dbname);
        }
        if (!host) {
        	return Promise.reject('cloudant trigger feed: missing host parameter - ' + host);
        }
        if (!user) {
        	return Promise.reject('cloudant trigger feed: missing username parameter - ' + user);
        }
        if (!pass) {
        	return Promise.reject('cloudant trigger feed: missing password parameter - ' + pass);
        }
        if (namespace === "_") {
            return Promise.reject('You must supply a non-default namespace.');
        }

        // auth key for trigger
        var apiKey = msg.authKey;
        var input = {};
        input.accounturl = "https://" + host;
        input.host = host;
        input.port = port;
        input.protocol = protocol;
        input.dbname = dbname;
        input.user = user;
        input.pass = pass;
        input.apikey = apiKey;
        input.maxTriggers = maxTriggers;
        input.callback = {};
        input.callback.action = {};
        input.callback.action.name = trigger;

        return cloudantHelper(provider_endpoint, 'put', replaceNameTrigger, input);
    } else if (lifecycleEvent === 'DELETE') {

        var jsonOptions = {};
        jsonOptions.apikey = msg.authKey;

        return cloudantHelper(provider_endpoint, 'delete', replaceNameTrigger, jsonOptions);
    } else {
    	return Promise.reject('operation is neither CREATE or DELETE');
    }
}

function cloudantHelper(endpoint, verb, name, input) {
    var url = 'http://' + endpoint + '/cloudanttriggers/' + name;
    var promise = new Promise(function(resolve, reject) {
        request({
            method : verb,
            url : url,
            json: input
        }, function(error, response, body) {
            console.log('cloudant trigger feed: done http request');
            if (!error && response.statusCode === 200) {
                console.log(body);
                resolve();
            }
            else {
                if (response) {
                    console.log('response code:', response.statusCode);
                    reject(body);
                } else {
                    console.log('no response');
                    reject(error);
                }
            }
        });
    });

    return promise;
}

function parseQName(qname) {
    var parsed = {};
    var delimiter = '/';
    var defaultNamespace = '_';
    if (qname && qname.charAt(0) === delimiter) {
        var parts = qname.split(delimiter);
        parsed.namespace = parts[1];
        parsed.name = parts.length > 2 ? parts.slice(2).join(delimiter) : '';
    } else {
        parsed.namespace = defaultNamespace;
        parsed.name = qname;
    }
    return parsed;
}
