// updateresults.js
var DEBUG_UPDATES = 0;
var AGENCYID = { "megabus" : 1, "boltbus" : 2, "peterpan" : 3, "amtrak" : 4, "greyhound" : 5 };
var MAX_UPDATE_REQUESTS = 10;
var threadCounter = 0;
var totalUpdateRequests = 0;
var updateData = new Object;
var updateState = 0;
var STATE_IDLE = 0;
var STATE_LOADED = 1;
var STATE_POLLING = 2;
var STATE_READY = 3;
var STATE_DONE = 4;
var waitForClosedThread;


function U_DEBUG(a_text) {
  if(DEBUG_UPDATES)
    console.log(a_text);
}

function enableRecalculatingBox() {
  $("#recalculating-wrapper").show();
}

function disableRecalculatingBox() {
  $("#recalculating-wrapper").hide();
}

function waitForClosedDetails() {
  waitingForRecalculate = 1;
  /*  waitForClosedThread = setInterval(function() { 
				      if(activeDetail == "") {
					sortDefault();
					clearInterval(waitForClosedThread);
				      } 
				      }, 500);*/
}

function getNewRequest(a_id, a_request) {
  var req =
    {      
      "resultid" : a_id, 
      "agency" : AGENCYID[a_request.agency],
      "fare" : a_request.fare, 
      "hopnum" : a_request.hopnum,
      "origin" : a_request.origin,
      "destination" : a_request.destination,
      "time" : a_request.departTime,
      "date" : a_request.departDate
    };
  return req;
}

// getNewRequest
// converts Result object to request object
function getNewRequestFromResult(result, hopnum, thedate) {
  var req =
    {      
      "resultid" : result.id, 
      "agency" : AGENCYID[result.hops[hopnum].agency],
      "fare" : result.hops[hopnum].fare, 
      "hopnum" : hopnum,
      "origin" : result.hops[hopnum].sourceNodeId,
      "destination" : result.hops[hopnum].destNodeId,
      "time" : result.hops[hopnum].departTime,
      "date" : thedate
    };
  return req;
}

// printRequestSummary
// debug function logging requests
function printRequestSummary(requestsArray) {
  var agencyCounts = new Array(0, 0, 0, 0, 0, 0);
  for(i = 0; i < requestsArray.length; i++) {
    agencyCounts[requestsArray[i].agency]++;
  }
  U_DEBUG("Requests 1: " + agencyCounts[1] + " 2: " + agencyCounts[2] + " 4: " + agencyCounts[4] + " TOTAL: " + requestsArray.length);
}

function printResponseSummary(responsesArray) {
  var agencyCounts = new Array(0, 0, 0, 0, 0, 0);  
  for(i = 0; i < responsesArray.length; i++) {
    agencyCounts[responsesArray[i].agencyId]++;
  }
  U_DEBUG("Responses 1: " + agencyCounts[1] + " 2: " + agencyCounts[2] + " 4: " + agencyCounts[4] + " TOTAL: " + responsesArray.length);
}

function updateMultipleResults(allResultUpdates) {
  var resultsIndexMap = {};
  for(var j=0; j < RESULTS.length; j++) {
    resultsIndexMap[RESULTS[j].id] = j;
  }

  for(var i=0; i < allResultUpdates.length; i++) {
    var rid     = allResultUpdates[i].resultId;
    var result_index = resultsIndexMap[rid];
    var hopnum  = allResultUpdates[i].hopNum;    

    // Get original data
    //var oldfare    = RESULTS[result_index].fare;
    //var oldhopfare = parseInt(RESULTS[result_index].hops[hopnum].fare);

    // Get data from update
    var newhopfare = parseInt(allResultUpdates[i].fare);
    var agencyid   = allResultUpdates[i].agencyId;

    // Calculate total fare difference
    //var farediff = newhopfare - oldhopfare;
    var newfare = 0; //oldfare + farediff;
    
    if(allResultUpdates[i].fare == null) {
      U_DEBUG("trip scrape failed -  id: " + RESULTS[result_index].id + " agencyid: " + agencyid + " start: " + RESULTS[result_index].hops[hopnum].sourceNodeId + " end: " + RESULTS[result_index].hops[hopnum].destNodeId + " departs: " + RESULTS[result_index].hops[hopnum].departTime);
      RESULTS[result_index].badscrape = 1;
    } else if(allResultUpdates[i].fare == -1) {
      U_DEBUG("FILTERED - trip sold out id: " + RESULTS[result_index].id + " agencyid: " + agencyid + " start: " + RESULTS[result_index].hops[hopnum].sourceNodeId + " end: " + RESULTS[result_index].hops[hopnum].destNodeId + " departs: " + RESULTS[result_index].hops[hopnum].departTime);
      // FIXME: Should delete trip from RESULTS!
      RESULTS[result_index].unavailable = 1;
    } else {
      U_DEBUG("updating fare for id: " + RESULTS[result_index].id + " agencyid: " + agencyid);

      RESULTS[result_index].badscrape = 0;

      // Update hop fare
      RESULTS[result_index].hops[hopnum].fare = newhopfare;
      
      // Recalculate total fare
      // Farediff wasn't being calculated correctly, so we may have to reiterate though trip to recalculate
      // FIXME: some trips filtered out afer this? null?
      newfare = RESULTS[result_index].origin.fare;
      for(var k=0; k < RESULTS[result_index].hops.length; k++) {
	// fare == -1 indicates transfer leg
	if(RESULTS[result_index].hops[k].fare != -1) {
	  newfare += parseInt(RESULTS[result_index].hops[k].fare);
	}
      }
      
      newfare += RESULTS[result_index].destination.fare;
      
      // Update total fare
      RESULTS[result_index].fare = newfare;
      /*    
	    console.log("rid" + result_index +": " + rid + " (hop" + hopnum
	    //		+ ") old hop fare: " + oldhopfare 
	    + " new hop fare: " + newhopfare 
	    //		+ " fare diff: " + farediff 
	    //		+ " old total fare: " + oldfare
	    + " new total fare: " + newfare);    
      */
    }
  }
}


// requestUpdate
// sends post command to fetch updated result data from database
function requestUpdate(requestsArray) {
  var i;
  var requests = { };
  var totalUpdateRequests = requestsArray.length;

  for(i = 0; i < requestsArray.length; i++) {
    requests['req'+i]=requestsArray[i];
  }
  if(requestsArray.length == 0) {
    U_DEBUG("updateresults.js::requestUpdate: no updates to request");
    updateState = STATE_DONE;
  }
  if(requestsArray.length != 0 && 
     updateState != STATE_DONE &&
     threadCounter < MAX_UPDATE_REQUESTS) {

    printRequestSummary(requestsArray);

    updateState = STATE_POLLING;
    threadCounter++;
    $.post(baseURL + 'ajax/updaterequest', { "requests": requests }, 
	   function(data) {

	     // update resultid entry
	     if(data != null) {
	       printResponseSummary(data);
	     }

	     // Save off these update and prompt user?
	     updateData = data;

	     updateState = STATE_READY;
	     if(data.length == totalUpdateRequests ||
		threadCounter >= MAX_UPDATE_REQUESTS) {
	       updateState = STATE_DONE;	       
	       enableRecalculatingBox();
	     } else if(data.length > 0) {
	       loadUpdates();
	       if(activeDetail == "") {
		 sortDefault();
	       } else {
		 waitForClosedDetails();
	       }
	     }

	     $("#num-results-waiting").html(totalUpdateRequests - data.length);

	   }, "json");
  }
}

function loadUpdates() {
  U_DEBUG("updateresults.js::loadUpdates: updating " + updateData.length + " results");
  updateMultipleResults(updateData);
  // applyFilters();
}

function updateSingleResult(resultid, newfare) {
  // Indexed Results
  // Install new fare
  // ordering results?
}

function markResults(allResultUpdates) {

}

function updateResultsRefresh() {
  // Prompt re-sort OR auto re-sort
  // Re-issue un-updated results
}

//function 
// recursive setTimeout?

function updateThreadStart() {
  setInterval(function() { console.log("call" + threadCounter); threadCounter++; }, 5000);
}

function userGetUpdates() {
  $("#updates-header-update-needed").css("display","none");
  sortDefault();
  waitingForRecalculate = 0;
}

