//Here we store the different details of a given user in the background script memory and not in any sstorage.
//chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/login.html
var ImageData = [];
var username;           //arcosadmin
var pass;               //password
var arconToken;         //to store the srcon token
var userId;             //to store the user ID
var userSessionId;      //To store the user session ID

var loginStatus=0;      //this is a status which is kept to acknoledge if a user is logged in so that once again when the plugin is opend 
                        //and the browser isn't closed then the user gets redirected to the home page instead of the login page
var pageIsActive=0;

var services=[];
var serviceId=[];
var myArray;
var domainList=[];
var sessionTabIDs=[];
var sessionTabIDsessionID=[];


function serviceSessionPunchLogout(){
    chrome.tabs.query({},
        function(tabs){
            var i = 0;
            for (;i<tabs.length;i++){
                var j = 0;
                for(;j<sessionTabIDs.length;j++){
                    if(tabs[i].id==sessionTabIDs[j]){
                        console.log("call the session logout request here");
                        //sessionTabIDs.splice(j,1)
                    }
                }
            }
        }
    );
}

function clearData(){

    var callback = function () {
       //if required any specific callback in the future
      };
      
      var millisecondsPerWeek = 1000 * 60 * 60 * 24 ;
      var oneWeekAgo = (new Date()).getTime() - millisecondsPerWeek;
      chrome.browsingData.remove({
        "since": oneWeekAgo
      }, {
        "appcache": true,
        "cache": true,
        "cacheStorage": true,
        "cookies": true,
        "downloads": true,
        "fileSystems": true,
        "formData": true,
        "history": true,
        "indexedDB": true,
        "localStorage": true,
        "pluginData": true,
        "passwords": true,
        "serviceWorkers": true,
        "webSQL": true
      }, callback);
}

function imagePunchout(tabs){
    intervalId = setInterval(()=>{
   
    chrome.tabs.query({
        active: true,
        currentWindow: true
    }, function (tabs) {
        if(Array.isArray(tabs)  && tabs.length>0)
        {
            if (tabs[0].hasOwnProperty('url')){
                var k = tabs[0].url;
            }
            else{
                if(tabs[0].hasOwnProperty('pendingUrl'))
                    var k = tabs[0].pendingUrl;
            }
            for (index = 0; index < services.length; index++) {
                var substring = String(domainList[index]);
                if (k.includes(substring) == true && substring.length>0) {         
                    captureImages(myArray[index][4]);
                }
            }
        }
    });
    },5000);
}

function getMasterArray(){
    var length = services.length;
    
        myArray=new Array(length);        
        for (i=0; i < length; i++){
        myArray[i]=new Array(5);                
        }  
           
        for (i = 0; i< length; i++){
            myArray[i][0] = services[i];
           myArray[i][1] = serviceId[i];
           var flag = getAPICallForPassword(i);
            if(flag == 0)
                return false;
            
        }
        //console.log(myArray);
        return true;
}


function fillPasswords(tabs){
    chrome.tabs.query({
        active: true,
        currentWindow: true
    }, function (tabs) {
        if (tabs[0].hasOwnProperty('url')){
            var k = tabs[0].url;
        }
        else{
            if(tabs[0].hasOwnProperty('pendingUrl'))
                var k = tabs[0].pendingUrl;
        }
        
        var tab_id = tabs[0].id;
        
        for (index = 0; index < services.length; index++) {
            substring = myArray[index][0];
            if (k.includes(substring) == true) {
                
               // ServiceSessionId = myArray[index][4];
                chrome.tabs.sendMessage(tab_id,{username: myArray[index][2], password :myArray[index][3], gotUserName: "true"});
                var t=0;
                var tabstoreflag=0;
                for (;t<sessionTabIDs;t++){
                    if(sessionTabIDs[t]==tab_id){
                        tabstoreflag=1;
                    }
                }
                if(tabstoreflag==0){
                    sessionTabIDs.push(tab_id);
                    sessionTabIDsessionID.push(index);
                }
                break;
            }
        }

    });
}

function getAPICallForPassword(itera)
{
    var servic_id = serviceId[itera];
    var settings = {
        "url": "http://10.10.0.130:6970/api/ServiceDetails/GetServiceDetails",
        "method": "POST",
        "timeout": 0,
        "headers": {
          "Content-Type": "application/json",
          "Authorization": "bearer " + arconToken
        },
        "data": JSON.stringify({"UserId":userId,"ServiceTypeId":"36","ServiceId":servic_id,"UserSessionId":userSessionId}),
    };
      
    $.ajax(settings).done(function (response) {
        var result = response.Success;
        var fetchResult = response.Result;
        if(result==true){
            //if(fetchResult.ServiceUsername!=null && fetchResult.ServicePassword!=null && fetchResult.ServiceSesssionId!=null){
            myArray[itera][2] = fetchResult.ServiceUsername;
            myArray[itera][3] = fetchResult.ServicePassword;
            myArray[itera][4] = fetchResult.ServiceSessionId;
            //}
            //else{
            //    myArray[itera][2] = -1;
            //    myArray[itera][3] = -1;
            //    myArray[itera][4] = -1;    
            //}
            
        
            return 1;
        }
        else{
            return 0;
        }     
    });
}


function captureImages(indu) {

	//intervalId = setInterval(()=>{
	chrome.tabs.captureVisibleTab(function (screenshotUrl) {
        img = screenshotUrl;
        
		var ss = img.split(',');
		saveImageInDB(ss[1], indu);
        ImageData.push(img);
		img = "";
	});
	//},5000)
}

function saveImageInDB(image, indu) {

    var data = JSON.stringify({ "ServiceSessionId": indu, "Base64Image": image });
    
    var settings = {
        "url": "http://10.10.0.130:6970/api/ServiceDetails/SetSessionVideoLog",
        "method": "POST",
        "timeout": 0,
        "headers": {
          "Content-Type": "application/json",
          "Authorization": "bearer " + arconToken
        },
        "data":data      
    };
      
    $.ajax(settings).done(function (response) {
        if(!response.Success)
        {
            clearbackGroundData();
            clearData(); 
        }
    });
    
}

function clearbackGroundData(){
    loginStatus=0;
    userId=null;
    userSessionId=null;
    arconToken=null;
    username=null;
    domainList = null;
    pass=null;
    myArray = null;
    services = null;
    serviceId = null;
    sesssionTabIDsessionID=null;
    sessionTabIDs=null;
}

//This function is used to get the list of assigned services
function getServicesList(flag){
    var settings = {
        "url": "http://10.10.0.130:6970/api/ServiceDetails/GetAssignedServiceList",
        "method": "POST",
        "timeout": 0,
        "headers": {
            "Content-Type": "application/json",
            "Authorization": "bearer "+arconToken,
    },
        //"data": JSON.stringify({"UserId":userId,"ServiceTypeId":"36","ServiceId":"48","UserSessionId":userSessionId}),
        "data": JSON.stringify({"UserId":userId,"ServiceTypeId":"36","UserSessionId":userSessionId}),   
    };
    
    $.ajax(settings).done(function (response) {
        var result = response.Success;
        if(result==true){
            var array=response.Result;
            array.forEach(element => {
                var url_unfiltered= element.Field4;
                var url_array = url_unfiltered.split("<");
                var url = url_array[0];
                services.push(url);
                serviceId.push(element.ServiceId);
                domainList[services.length - 1] = services[services.length-1].replace('http://','').replace('https://','').split(/[/?#]/)[0];
                
                
            });
            
           
            if(!flag)
                chrome.runtime.sendMessage({addPass: 'addPass', servicelist :services, servicelistId: serviceId});
            else{
                var flaggu =getMasterArray();
                   
                    if (flaggu)
                        chrome.runtime.sendMessage({"success":"success"});
                    else
                        chrome.runtime.sendMessage({"success":"fail"});
            }
        }
    });
}

//This function makes call to two api's namely arconUserAuth and the Gettoken of the ARCON PAM 
function completelogin(){
    var settings = {
        "url": "http://10.10.0.130:6970/arconToken",
        "method": "POST",
        "timeout": 0,
        "headers": {
          "Content-Type": "application/x-www-form-urlencoded"
        },
        "data": {
          "grant_type": "password",
          "username": "R2VuZXJpY1NjaGVkdWxlcg==",
          "password": "R2VuZXJpY1NjaGVkdWxlcjEyMw=="
        }
      };
    
    $.ajax(settings).done(function (response) { 
        try{
            arconToken=response.access_token;
            var settings = {
                "url": "http://10.10.0.130:6970/api/ServiceDetails/AuthenticateUser",
                "method": "POST",
                "timeout": 0,
                "headers": {
                "Content-Type": "application/json",
                "Authorization": "bearer "+arconToken
            },
                "data": JSON.stringify({"UserName":username,"DomainName":"ARCOSAUTH","Password":pass,"IPAddress":"10.10.1.209","IPMACAddress":"58-8A-5A-2A-89-3D","BIOSSerialID":"/8KD35L2/CNWSC0081V01EA/","ProcessorID":"BFEBFBFF000406E3"}),
            };
            
            $.ajax(settings).done(function (response) {
                
                userId=response.Result.UserId;
                userSessionId=response.Result.UserSessionId;

                if(userSessionId!==null && userId!==null && arconToken!==null){
                    //Sending a success message to the login.js which then redirects to the home.html by reading this success message
                    loginStatus=1;
                    getServicesList(1);
                    var flaggu = getMasterArray();
                   
                    if (flaggu)
                        chrome.runtime.sendMessage({"success":"success"});

                    else
                        chrome.runtime.sendMessage({"success":"fail"});
                }
                else{
                    //if code reaches here it means that the credentails were invaid
                    //sending a failure message to the login.js
                    chrome.runtime.sendMessage({"success":"fail"});
                    
                }
            });
        }
        catch(err){
            //If the code catches here then thre is lightly to be a server issue
            chrome.runtime.sendMessage({"success":"serverFail"});
        }
    });
}

function loginChecker(){
    chrome.tabs.query(
        {
            active: true,
            currentWindow: true
        }, 
        function(tabs) {
          
            var i = 0;
            for (;i<tabs.length;i++){
                if(tabs[i].url=="chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/vault.html"){
                    pageIsActive=1;
                }
            }
            i = 0;
            for (;i<tabs.length;i++){
                if(tabs[i].pendingUrl=="chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/vault.html"){
                    pageIsActive=1;
                }
            }           
            // if(tabs[0].pendingUrl=="chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/vault.html"){
            //    pageIsActive=1;
            // }
        }
    );
}

function blocking(){
    chrome.tabs.query({},
        function(tabs){
            var i = 0;
            for (;i<tabs.length;i++){
                var url = tabs[i].url;
                var serviceurl="youtube.com"
                if(url.includes(serviceurl)){
                    
                    chrome.tabs.sendMessage(tabs[i].id, {action: "erranous page"}); 
                    return ;
                }
            }
        }
    )
}

chrome.tabs.onUpdated.addListener(function (tabs) {
    fillPasswords(tabs);
    imagePunchout(tabs);
    serviceSessionPunchLogout();   
});

// chrome.tabs.onActivated.addListener(function (tabs) {
// });



chrome.tabs.onUpdated.addListener( function () {
    //if(loginStatus==0){
    blocking();
    //}
    loginChecker();
});

chrome.runtime.onMessage.addListener(function(message){
    if(message.getService=="sendServiceData"){
        if(pageIsActive==1){
            if(serviceId.length==0){
                getServicesList(0);
            }
            else{
                chrome.runtime.sendMessage({addPass: 'addPass', servicelist :services, servicelistId: serviceId});         
            }
            //chrome.runtime.sendMessage({addPass: 'addPass'});
        }
        else{
            if(pageIsActive==0){
                chrome.runtime.sendMessage({addPass: 'noPass'});
            }
         }
    }
 });

//This is a listner and waits for the validate funtion in the login.js to send the user detatils so as to complete the login process
chrome.runtime.onMessage.addListener(function(message){
    if(message.message=="start"){
        username=message.username;
        pass=message.pass;
        clearData();
        completelogin();
    }
});

chrome.runtime.onMessage.addListener(function(message){
   if(message.message=="checkLogin"){
       if(loginStatus==1){
            chrome.runtime.sendMessage({"status":"true"});
        }
        else{
            if(loginStatus==0){
                chrome.runtime.sendMessage({"status":"false"});
            }
        }
   }
});


chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    if(message.logout=="true"){
        if(loginStatus==1){
            clearbackGroundData()   
            sendResponse({logout: "true"});
            clearData();
        }
    }
});

