<%
/*
 * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. 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 log = new Log("api/data-tables-invoker-api.jag");

var uri = request.getRequestURI();
var uriMatcher = new URIMatcher(String(uri));

var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"];
var utility = require("/app/modules/utility.js")["utility"];
var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"];
var EnrolmentInfo = Packages.org.wso2.carbon.device.mgt.common.EnrolmentInfo;

var DTYPE_CONF_DEVICE_TYPE_KEY = "deviceType";
var DTYPE_CONF_DEVICE_TYPE_LABEL_KEY = "label";

function appendQueryParam (url, queryParam , value) {
    if (url.indexOf("?") > 0) {
        return url + "&" + queryParam + "=" + value;
    }
    return url + "?" + queryParam + "=" + value;
}

if (uriMatcher.match("/{context}/api/data-tables/invoker/filters")) {
    var result = {};
    var i;
    //Fetching Status types
    var status = EnrolmentInfo.Status.values();
    var statusArr = [];
    for(i = 0; i < status.length; i++){
        statusArr.push(status[i].name());
    }
    result.status = statusArr;
    //Fetching Ownership types
    var ownership = EnrolmentInfo.OwnerShip.values();
    var ownershipArr = [];
    for(i = 0; i < ownership.length; i++){
        ownershipArr.push(ownership[i].name());
    }
    result.ownership = ownershipArr;
    //Fetching Device Types
    result.deviceTypes = [];
    var deviceTypesRes = deviceModule.getDeviceTypes();
    if (deviceTypesRes.status === "success") {
        var deviceTypes = deviceTypesRes["content"]["deviceTypes"];
        for (i = 0; i < deviceTypes.length; i++) {
            var deviceTypeName = deviceTypes[i];
            var deviceTypeLabel = deviceTypeName;
            var configs = utility.getDeviceTypeConfig(deviceTypeLabel);
            if (configs) {
                if (configs[DTYPE_CONF_DEVICE_TYPE_KEY][DTYPE_CONF_DEVICE_TYPE_LABEL_KEY]) {
                    deviceTypeLabel = configs[DTYPE_CONF_DEVICE_TYPE_KEY][DTYPE_CONF_DEVICE_TYPE_LABEL_KEY];
                }
            }
            result.deviceTypes.push({"name": deviceTypeLabel, "value": deviceTypeName});
        }
    }
    //Adding policy compliance
    result.compliance = ["MONITOR", "ENFORCE", "WARN", "BLOCK"];
    result.depStatus = ["Empty", "Assigned", "Pushed", "Removed"];
    response["status"] = 200;
    response["content"] =  result;
    response["contentType"] = "application/json";
} else if (uriMatcher.match("/{context}/api/data-tables/invoker")) {
    var url = request.getParameter("url");
    var targetURL = devicemgtProps["httpsURL"] + request.getParameter("url");
    //noinspection JSUnresolvedFunction getAllParameters
    var allParams = request.getAllParameters();

    for (var allParamsKey in allParams) {
        if (allParams.hasOwnProperty(allParamsKey)) {
            if (allParamsKey == "limit" || allParamsKey == "offset") {
                targetURL = appendQueryParam(targetURL, allParamsKey, allParams[allParamsKey]);
            } else if (allParamsKey == "filter") {
                if (allParams[allParamsKey]) {
                    var searchPayload = JSON.parse(allParams[allParamsKey]);
                    for (var searchPayloadKey in searchPayload) {
                        if (searchPayload.hasOwnProperty(searchPayloadKey)) {
                            targetURL = appendQueryParam(targetURL, searchPayloadKey, searchPayload[searchPayloadKey]);
                        }
                    }
                }
            }
        }
    }

    serviceInvokers.XMLHttp.get(
            targetURL,
            // response callback
            function (backendResponse) {
                response["status"] = backendResponse["status"];
                response["content"] =  utility.encodeJson(backendResponse["responseText"]);
                response["contentType"] = "application/json";
            }
    );
}
