var O365OutageSync = Class.create(); 
O365OutageSync.prototype = { 
    initialize: function() { 
    }, 
    refreshO365OutageRecords: function(token){ 
        var date_now = gs.nowDateTime(); 
        var parser = new JSONParser(); 
        var json_responseBody = "failed to load"; 
        try {  
            var r = new sn_ws.RESTMessageV2('Microsoft Azure', 'Get Service Status'); 
            r.setStringParameterNoEscape('TenantID', gs.getProperty('AzureAccessToken.TenantID')); 
            r.setStringParameterNoEscape('Token', token); 
            var response = r.execute(); 
            var httpStatus = response.getStatusCode(); 
            if(httpStatus == '200'){ 
                //Success 
                var str_responseBody = response.getBody(); 
                json_responseBody = parser.parse(str_responseBody); 
            } else { 
                gs.log("Error requesting O365 Service Status.  httpStatus:" + httpStatus); 
            } 
        } catch(ex) { 
            var message = ex.message; 
            gs.log("Error requesting O365 Service Status.  Error Message:" + message); 
        } 
         
        if(json_responseBody != "failed to load"){ 
            for (s = 0; s < json_responseBody.value.length; s++) { 
                //gs.log(json_responseBody.value[s].WorkloadDisplayName + " : " + json_responseBody.value[s].StatusDisplayName); 
                var str_bs_sys_id = ""; 
                 
                //***Create Business Service Record if it does not already exist*** 
                var gr_bs = new GlideRecord('cmdb_ci_service'); 
                gr_bs.addQuery('name', 'O365 - ' + json_responseBody.value[s].WorkloadDisplayName); 
                gr_bs.query(); 
                if(gr_bs.next()){ 
                    str_bs_sys_id = gr_bs.sys_id + ""; 
                } else if (json_responseBody.value[s].IncidentIds.length > 0){ 
                    //Doesnt exist, create it 
                    var gr_new_bs = new GlideRecord('cmdb_ci_service'); 
                    gr_new_bs.initialize(); 
                    gr_new_bs.setValue('name', 'O365 - ' + json_responseBody.value[s].WorkloadDisplayName); 
                    gr_new_bs.setValue('used_for', 'Production'); 
                    str_bs_sys_id = gr_new_bs.insert(); 
                } 
                 
                 
                //***Create Outages for open incidents*** 
                var arr_openOutages = []; 
                for (i = 0; i < json_responseBody.value[s].IncidentIds.length; i++) { 
                    arr_openOutages.push(json_responseBody.value[s].IncidentIds[i]); 
                    var gr_existing_outage = new GlideRecord('cmdb_ci_outage'); 
                    gr_existing_outage.addQuery('u_number',json_responseBody.value[s].IncidentIds[i]); 
                    gr_existing_outage.query(); 
                    if(gr_existing_outage.next()){ 
                        //Set Outage Status for existing Outage Record 
                        switch(json_responseBody.value[s].Status){ 
                            case 'ServiceDegradation': 
                                gr_existing_outage.setValue('type', 'degradation'); 
                                break; 
                            case 'ServiceInterruption': 
                                gr_existing_outage.setValue('type', 'outage'); 
                                break; 
                        } 
                        gr_existing_outage.update(); 
                         
                         
                    } else { 
                        var gr_new_outage = new GlideRecord('cmdb_ci_outage'); 
                        gr_new_outage.initialize(); 
                        gr_new_outage.setValue('u_number', json_responseBody.value[s].IncidentIds[i]); 
                        gr_new_outage.setValue('cmdb_ci', str_bs_sys_id); 
                        gr_new_outage.begin = date_now; 
                         
                        //Set Outage Status for existing Outage Record 
                        switch(json_responseBody.value[s].Status){ 
                            case 'Investigating': 
                                gr_new_outage.setValue('type', 'degradation'); 
                                break; 
                            case 'ServiceDegradation': 
                                gr_new_outage.setValue('type', 'degradation'); 
                                break; 
                            case 'ServiceInterruption': 
                                gr_new_outage.setValue('type', 'outage'); 
                                break; 
                            case 'RestoringService': 
                                gr_new_outage.setValue('type', 'degradation'); 
                                break; 
                            case 'ExtendedRecovery': 
                                gr_new_outage.setValue('type', 'degradation'); 
                                break; 
                            case 'VerifyingService': 
                                gr_new_outage.setValue('type', 'degradation'); 
                                break; 
                        } 
                        gr_new_outage.insert(); 
                    } 
                } 
                     
                     
                //***End Outages for resolved incidents*** 
                //gs.log("Closing incidents for :" + json_responseBody.value[s].WorkloadDisplayName +", cisysid:" + str_bs_sys_id +  "Status:" + json_responseBody.value[s].Status + ", open outages:" + arr_openOutages.join(',')); 
                if(str_bs_sys_id.length > 0){ 
                    var arr_closedcodes = ['ServiceRestored', 'PostIncidentReportPublished', 'ServiceOperational', 'FalsePositive']; 
                    var arrUtil = new ArrayUtil(); 
                    var gr_active_outage = new GlideRecord('cmdb_ci_outage'); 
                    gr_active_outage.addQuery('cmdb_ci', str_bs_sys_id); 
                    gr_active_outage.addNullQuery('end'); 
                    gr_active_outage.query(); 
                    while(gr_active_outage.next()){ 
                        if((arrUtil.indexOf(arr_closedcodes, json_responseBody.value[s].Status) >= 0)||(arrUtil.indexOf(arr_openOutages, gr_active_outage.u_number) < 0)){ 
                            //Service is fully operational. 
                            //Close out all active outages 
                            gr_active_outage.end = date_now; 
                            gr_active_outage.update(); 
                        } else { 
                            
                        } 
                    } 
                } 
            } 
        }         
    }, 
    refreshO365OutageMessages: function(token){ 
        //***Pull Down Outage Messages*** 
        var parser = new JSONParser(); 
        var json_responseBody = "failed to load"; 
        try {  
            var r = new sn_ws.RESTMessageV2('Microsoft Azure', 'Get All Messages'); 
            r.setStringParameterNoEscape('TenantID', gs.getProperty('AzureAccessToken.TenantID')); 
            r.setStringParameterNoEscape('Token', token); 
            var response = r.execute(); 
            var httpStatus = response.getStatusCode(); 
            if(httpStatus == '200'){ 
                //Success 
                var str_responseBody = response.getBody(); 
                json_responseBody = parser.parse(str_responseBody); 
            } else { 
                gs.log("Error requesting O365 Service Messages.  httpStatus:" + httpStatus); 
            } 
        } catch(ex) { 
            var message = ex.message; 
            gs.log("Error requesting O365 Service Messages.  Error Message:" + message); 
        } 
        if(json_responseBody != "failed to load"){ 
            for (i = 0; i < json_responseBody.value.length; i++) { 
                if(json_responseBody.value[i].Messages.length > 0){ 
                    this.updateOutage(json_responseBody.value[i].Id, json_responseBody.value[i].Messages[json_responseBody.value[i].Messages.length-1].MessageText + "<BR><BR><u>Last Updated: " + json_responseBody.value[i].Messages[json_responseBody.value[i].Messages.length-1].PublishedTime + "</u>"); 
                } else { 
                    this.updateOutage(json_responseBody.value[i].Id, json_responseBody.value[i].ImpactDescription); 
                } 
            } 
        } 
    }, 
    updateOutage: function(str_number, str_details){ 
        var gr_outage = new GlideRecord('cmdb_ci_outage'); 
        gr_outage.addQuery('u_number', str_number); 
        gr_outage.query(); 
        if(gr_outage.next()){ 
            gr_outage.setValue('details', str_details); 
            gr_outage.update(); 
        } 
    }, 
    getAzureAPIAccessToken: function(){ 
        var token = ""; 
        try {  
            var r = new sn_ws.RESTMessageV2('Microsoft Azure', 'Get Access Token'); 
            r.setStringParameterNoEscape('ClientSecret', gs.getProperty('AzureAccessToken.ClientSecret')); 
            r.setStringParameterNoEscape('ClientID', gs.getProperty('AzureAccessToken.ClientID')); 
            r.setStringParameterNoEscape('TenantID', gs.getProperty('AzureAccessToken.TenantID')); 
            var response = r.execute(); 
            var httpStatus = response.getStatusCode(); 
            if(httpStatus == '200'){ 
                //Success 
                var str_responseBody = response.getBody(); 
                var parser = new JSONParser(); 
                var json_responseBody = parser.parse(str_responseBody); 
                token = json_responseBody.access_token; 
            } else { 
                gs.log("Error requesting Azure API Token.  httpStatus:" + httpStatus); 
            } 
        } catch(ex) { 
            var message = ex.message; 
            gs.log("Error requesting Azure API Token.  Error Message:" + message); 
        } 
             
        return token; 
    },     
    type: ‘O365OutageSync’ 
};