<%
/*
 * 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.
 *
 */
include('metering-authentication.jag');

(function () {

    var TIME_INTERVAL_1 = '30 Min';
    var TIME_INTERVAL_2 = '1 Hour';
    var TIME_INTERVAL_3 = '1 Day';
    var TIME_INTERVAL_4 = '1 Week';
    var TIME_INTERVAL_5 = '1 Month';
    var TIME_INTERVAL_6 = '6 Month';
    var TIME_INTERVAL_7 = '1 Year';
    var ALL_CLUSTERS = 'All Clusters';

    var db = new Database("WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB");

    try {
        var result;
        var timeInterval = request.getParameter("time");
        var interval;
        var time_format = 'yyyy-mm-dd hh24:mi:ss';
        if (timeInterval === TIME_INTERVAL_1) {
            interval = 1800;
        } else if (timeInterval === TIME_INTERVAL_2) {
            interval = 3600;
        } else if (timeInterval === TIME_INTERVAL_3) {
            interval = 86400;
        } else if (timeInterval === TIME_INTERVAL_4) {
            interval = 604800;
        } else if (timeInterval === TIME_INTERVAL_5) {
            interval = 2419200;
        } else if (timeInterval === TIME_INTERVAL_6) {
            interval = 2419200 * 6;
        } else if (timeInterval === TIME_INTERVAL_7) {
            interval = 2419200 * 12;
        }

        var applicationId = request.getParameter("applicationId");
        var clusterId = request.getParameter("clusterId");

        if (clusterId == ALL_CLUSTERS) {
            result = db.query("SELECT TO_CHAR((TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + NUMTODSINTERVAL" +
                    "(CEIL(Time/1000), 'second')) AT LOCAL, '" + time_format + "') as \"Time\", MemberId" +
                    "\"MemberId\", MemberStatus \"MemberStatus\" FROM MEMBER_STATUS WHERE ApplicationId=? AND TO_CHAR" +
                    "((TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + NUMTODSINTERVAL(Time/1000,'second')) AT " +
                    "LOCAL, 'yyyy-mm-dd hh24:mi') BETWEEN TO_CHAR(LOCALTIMESTAMP - NUMTODSINTERVAL(" + interval + "," +
                    "'second'),'yyyy-mm-dd hh24:mi') AND TO_CHAR(LOCALTIMESTAMP,'yyyy-mm-dd hh24:mi') ORDER BY Time," +
                    "MemberID", applicationId);
        } else {
            result = db.query("SELECT TO_CHAR((TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + NUMTODSINTERVAL" +
                    "(CEIL(Time/1000), 'second')) AT LOCAL, '" + time_format + "') as \"Time\", MemberId" +
                    " \"MemberId\", MemberStatus \"MemberStatus\" FROM MEMBER_STATUS WHERE ApplicationId=? AND" +
                    " ClusterAlias=? AND TO_CHAR((TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + " +
                    "NUMTODSINTERVAL(Time/1000,'second')) AT LOCAL, 'yyyy-mm-dd hh24:mi') BETWEEN TO_CHAR" +
                    "(LOCALTIMESTAMP - NUMTODSINTERVAL(" + interval + ", 'second'),'yyyy-mm-dd hh24:mi') AND TO_CHAR" +
                    "(LOCALTIMESTAMP, 'yyyy-mm-dd hh24:mi') ORDER BY Time, MemberID", applicationId, clusterId);
        }
        print(result);
    }
    catch (e) {
        print(e.toString());
    }
    finally {
        db.close();
    }
}());
%>