<%@language = "javascript" %>
<% /*
    $Revision$
    $Id$

    File:           get_exchange_info.asp
    Description:    Haalt events uit Exchange op en geeft deze terug
    Parameters:
    Context:
    Note:

*/
var JSON_Result = true;
%>
<!-- #include file="../../Shared/common.inc" -->
<%
    Session.Codepage = 65001; // We doen *uitsluitend* utf-8
    Response.Charset = "UTF-8";

    protectRequest.validateToken();

    user.checkAutorisation("WEB_FACTAB");

    function early_exit(err) {
        result.success = false;
        result.warning = err;
        ASPPAGE_END();
        Response.Write(JSON.stringify(result));
        Response.End;
    }

    function verifyMSGraphResult(response) {
        if (response === false || response === null) {
            early_exit("MS Graph [Generic Error] - Zie Logging voor details");
        }
    }

    // Minimaliseer het resultaat door alleen zeer relevante velden over te nemen
    function strip(result) {
        function _minify(event) {
            return {
                "createdDateTime": event.createdDateTime,
                "id": event.id,
                "iCalUId": event.iCalUId,
                "subject": event.subject,
                "isCancelled": event.isCancelled,
                "sensitivity": event.sensitivity,
                "isOnlineMeeting": event.isOnlineMeeting,
                "responseStatus": event.responseStatus,
                "start": event.start,
                "end": event.end,
                // "locations": event.locations,
                "attendees": event.attendees
            }
        }
        if (result.host) {
            if (result.host instanceof Array) {
                for (var i = 0; i < result.host.length; i++) {
                    result.host[i] = _minify(result.host[i]);
                }
            } else {
                result.host = _minify(result.host);
            }
        }
        if (result.room) {
            if (result.room instanceof Array) {
                for (var i = 0; i < result.room.length; i++) {
                    result.room[i] = _minify(result.room[i]);
                }
            } else {
                result.room = _minify(result.room);
            }
        }
        return result;
    }

    // Polyfill
    if (!Date.prototype.toISOString) {
        Date.prototype.toISOString = function () {
            function pad(n) { return n < 10 ? '0' + n : n }
            return this.getUTCFullYear() + '-'
                + pad(this.getUTCMonth() + 1) + '-'
                + pad(this.getUTCDate()) + 'T'
                + pad(this.getUTCHours()) + ':'
                + pad(this.getUTCMinutes()) + ':'
                + pad(this.getUTCSeconds()) + 'Z';
        };
    }

    var result = {
        info: []
    };

    if (!(S("msgraph_sync_level") > 0)) {
        result.info = ["S(\"msgraph_sync_level\") staat op '0'"];
    }

    // Initialize hook
    var hook = hookfunc.gethook("UTILS/Exchange/res_to_graph.wsc");
    var DEZE = this;
    try {
        var init = hook.initialize({
            DEZE: DEZE,
            custabspath: Server.MapPath(custpath)
        });
        if (init === null) { // Is alleen null als de exchange.config ontbreekt
            early_exit("Geen exchange.config aangetroffen");
        }
    } catch (e) {
        early_exit("Hook error: " + e.description);
    }

    var host_id = null;
    var room_id = null;
    var host_email = null;
    var room_email = null;
    var res_rsv_ruimte_key = null;
    var fallback_user = false;

    var compact = getFParam("compact", "off") == "on";
    var reservering_nr = getFParam("reservering", "");
    var userPrincipalName = getFParam("userPrincipalName", null);
    var date_from = getFParamDate("date_from", null);
    var date_to = getFParamDate("date_to", null);
    if (reservering_nr != "") {
        // We gaan het event ophalen met een reserveringsnr als informatie
        var res_reservering_key = parseInt(reservering_nr.split("/")[0], 10);
        var res_rsv_ruimte_volgnr = parseInt((reservering_nr.split("/")[1] || 1), 10);
        if (isNaN(res_reservering_key) || isNaN(res_rsv_ruimte_volgnr)) {
            early_exit("Ongeldig reserveringsnr, verwachte formaat; 12345/1");
        }
        var sql = "SELECT rrr.res_rsv_ruimte_externnr2     host_id,"
                + "       rrr.res_rsv_ruimte_externnr      room_id,"
                + "       p_host.prs_perslid_email         host_email,"
                + "       rr.res_ruimte_extern_id          room_email,"
                + "       rrr.res_rsv_ruimte_key           res_rsv_ruimte_key,"
                + "       p_host.prs_perslid_oslogin       host_login"
                + "  FROM res_rsv_ruimte  rrr"
                + "       JOIN prs_perslid p_host"
                + "           ON p_host.prs_perslid_key = rrr.res_rsv_ruimte_host_key"
                + "       JOIN res_ruimte_opstelling rro"
                + "           ON rro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key"
                + "       JOIN res_ruimte rr ON rr.res_ruimte_key = rro.res_ruimte_key"
                + " WHERE rrr.res_reservering_key = " + res_reservering_key
                + "   AND rrr.res_rsv_ruimte_volgnr = " + res_rsv_ruimte_volgnr;
        var oRs = Oracle.Execute(sql);
        if (!oRs.EoF) {
            host_id = oRs("host_id").Value;
            room_id = oRs("room_id").Value;
            host_email = oRs("host_email").Value;
            room_email = oRs("room_email").Value;
            res_rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
            fallback_user = oRs("host_login").Value === null ? false : !!oRs("host_login").Value.match(/^_MSGRAPH_FALLBACK_/);
        } else {
            early_exit("Reservering niet in Facilitor gevonden");
        }
        oRs.Close();

        // Wat error-handling
        if (host_id === null && room_id === null) {
            if (room_email === null) {
                early_exit("Ruimte is geen Exchange-gekoppelde ruimte");
            } else {
                early_exit("Reservering is niet aan Exchange gekoppeld");
            }
        } else if (fallback_user) {
            early_exit("Deze reservering is geboekt op een fallback user, we kunnen hiervan niets uitlezen op basis van de reservering. Probeer de reservering zelf op te zoeken mbv een datum bereik");
        }

        // Haal nu de eigenlijke Exchange-events op
        if (host_id && host_id != "##PENDING##" && host_email) {
            var method = host_id.match(/^##iCalUId##/) ? "iCalUId" : "id";
            result.host = hook.getCalendarEvent(method, host_email, host_id);
            verifyMSGraphResult(result.host);
        }
        if (room_id && room_email) {
            room_id = room_id.split("|")[1] || room_id.split("|")[0];
            var method = room_id.match(/^##iCalUId##/) ? "iCalUId" : "id";
            if (method == "iCalUId") {
                room_id = room_id.slice(11); // Strip de '##iCalUId##'
            }
            result.room = hook.getCalendarEvent(method, room_email, room_id);
            verifyMSGraphResult(result.room);
        }

        // Niet gevonden, nog eens proberen obv res_rsv_ruimte_key
        if (!result.host && !result.room) {
            if (host_id == "##PENDING##" && host_email) {
                result.info.push("Deze reservering heeft nog geen antwoord van MSGraph ontvangen");
                result.host = hook.getCalendarEvent("res_rsv_ruimte_key", host_email, res_rsv_ruimte_key);
                verifyMSGraphResult(result.host);
                if (!result.host) {
                    early_exit("Reservering niet in Exchange gevonden op basis van res_rsv_ruimte_key");
                }
            } else {
                result.info.push("Reservering niet in Exchange gevonden");
            }
            if (!result.host) {
                early_exit("Reservering niet in Exchange gevonden");
            }
        }
        // Klaar
    } else if (userPrincipalName && date_from != null && date_to != null) {
        // We gaan het event ophalen met een (ruimte of gastheer)email en een datum bereik
        var id = date_from.toISOString() + "##" + date_to.toISOString();
        var response = hook.getCalendarEvent("date", userPrincipalName, id);
        verifyMSGraphResult(response);

        // Verwerk het resultaat
        if (response.value) {
            // Convert een javascript Array naar een JSON Array
            var events = [];
            for (var x in response.value) {
                events.push(response.value[x]);
            }
            if (events.length != 1) {
                result.info.push("Er zijn " + events.length + " events gevonden");
            }
            var sql = "SELECT 1"
                    + "  FROM res_ruimte"
                    + " WHERE UPPER(res_ruimte_extern_id) = " + safe.quoted_sql_upper(userPrincipalName);
            var oRs = Oracle.Execute(sql);
            if (oRs.EoF) {
                result.host = events;
            } else {
                result.room = events;
            }
            oRs.Close();
        }
    } else {
        early_exit("Onvoldoende parameters meegegeven; zoek op reserveringsnr, of de combinatie; email/datum-van/datum-tot");
    }

    result.success = true;
    // Strip onnodige velden
    if (compact) {
        result = strip(result);
    };

    Response.Write(JSON.stringify(result));
    Response.End;
%>
<% ASPPAGE_END(); %>
