/*
* Copyright 2015-2016 IBM Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

var request = require('request');

function main(msg){
    // whisk trigger in payload
    var trigger = parseQName(msg.triggerName);

    var lifecycleEvent = msg.lifecycleEvent || 'CREATE';

    if (lifecycleEvent === 'CREATE'){

        var newTrigger = {
            name: trigger.name,
            namespace: trigger.namespace,
            pollingInterval: msg.pollingInterval,
            url: msg.url,
            filter:msg.filter,
            whiskhost: msg.apiHost
        };

        request({
            method: "POST",
            uri: msg.provider_endpoint,
            json: newTrigger,
            auth: {
                user: msg.authKey.split(':')[0],
                pass: msg.authKey.split(':')[1]
            }
        }, function(err, res, body) {
            console.log('rss: done http request');
            if (!err && res.statusCode === 200) {
                whisk.done();
            }
            else {
                if(res) {
                    console.log('rss: Error invoking whisk action:', res.statusCode, body);
                    whisk.error(body.error);
                }
                else {
                    console.log('rss: Error invoking whisk action:', err);
                    whisk.error();
                }
            }
        });
    }

    else if (lifecycleEvent === 'DELETE'){

        var trigger = {
            name: trigger.name,
            namespace: trigger.namespace
        }

        request({
            method: "DELETE",
            uri: msg.provider_endpoint,
            json: trigger,
            auth: {
                user: msg.authKey.split(':')[0],
                pass: msg.authKey.split(':')[1]
            }
        }, function(err, res, body) {
            console.log('rss: done http request');
            if (!err && (res.statusCode === 200 || res.statusCode === 404)) {
                whisk.done();
            }
            else {
                if(res) {
                    console.log('rss: Error invoking whisk action:', res.statusCode, body);
                    whisk.error(body.error);
                }
                else {
                    console.log('rss: Error invoking whisk action:', err);
                    whisk.error();
                }
            }
        });
    }

    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;
    }

    return whisk.async();
}
