/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 openwhisk = require('openwhisk');

/**
 * Analyze incoming message and generate a summary as a response
 */
function transform(events) {
    var average = 0;
    for (var i = 0; i < events.length; i++) {
        average += events[i].payload.category;
    }
    average = average / events.length;
    var result = {
        "agent": "OpenWhisk action",
        "events_count": events.length,
        "avg_category": average
    };
    return result;
}

/**
 * Process incoming message from the receive-messages action earlier
 * in the sequence and publish a new message to Message Hub.
 */
function main(params) {
    console.log("DEBUG: Received message as input: " + JSON.stringify(params));

    return new Promise(function(resolve, reject) {
        if (!params.topic || !params.messagehub_instance || !params.events || !params.events[0]) {
            reject("Error: Invalid arguments. Must include topic, events[], message hub service name.");
        }

        var transformedMessage = JSON.stringify(transform(params.events));
        console.log("DEBUG: Message to be published: " + transformedMessage);

        openwhisk().actions.invoke({
            name: params.messagehub_instance + '/messageHubProduce',
            blocking: true,
            result: true,
            params: {
                value: transformedMessage,
                topic: params.topic
            }
        }).then(result => {
            resolve({
                "result": "Success: Message was sent to Message Hub."
            });
        }).catch(error => {
            reject(error);
        });

    });
}
