(function () {

var facebookAppId = '878434192277580';
var roleArn = 'arn:aws:iam::802694931986:role/facebookBackSpace';
var bucketName = 'lab.backspace.academy';
AWS.config.region = 'us-east-1';
var userLoggedIn = false;
var userSync = false;
var S3 = new AWS.S3({
    params: {
        Bucket: bucketName
    }
});
var fbUserId = '0';
var fbToken = '0';
var prefix = '0'
var objKeys = [];
var objKeysList = '';


/********************  Startup functions   ***********************************/

$.jGrowl.defaults.closerTemplate = '<div class="alert alert-info">Close All</div>';
loadObjKeys();
loadModals();

/********************  Button Events   ***************************************/

$('#btnCreate').on('click', function (event) {
  createShoppingList();
});

$('#btnSync').on('click', function (event) {
  console.log('Starting sync...');
  syncShoppingList();
});

$('#btnDelete').on('click', function (event) {
  deleteShoppingList($('#dropdownDeleteList')[0].selectedIndex);
});

$('#dropdownReadList').on('click', function (event) {
  readShoppingList($('#dropdownReadList')[0].selectedIndex);
});

/*******************  Facebook Login   ***************************************/

function statusChangeCallback(response) {
  console.log('Facebook response: ')
  console.log(response);
  
  if (response.status === 'connected') {
    // Logged into your app and Facebook. Pass details to app.
    testAPI();   
    setupAWS(response);
  } else if (response.status === 'not_authorized') {
    document.getElementById('status').innerHTML = 'Please log ' +
      'into this app.';
  } else {
    document.getElementById('status').innerHTML = 'Please log ' +
      'into Facebook.';
  }
}

function checkLoginState() {
  FB.getLoginStatus(function(response) {
    statusChangeCallback(response);
  });
}

window.fbAsyncInit = function() {
FB.init({
  appId      : facebookAppId,
  cookie     : true,
  xfbml      : true,
  version    : 'v2.2'
});

FB.getLoginStatus(function(response) {
  statusChangeCallback(response);
});

};

(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = '//connect.facebook.net/en_US/sdk.js';
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

function testAPI() {
  console.log('Welcome!  Fetching your information.... ');
  FB.api('/me', function(response) {
    console.log('Successful login for: ' + response.name);
    document.getElementById('status').innerHTML =
      'Thanks for logging in, ' + response.name + '!';
  });
  document.getElementById('status').innerHTML = 'Logged ' +
    'into Facebook.';
}

function validLogin(){
  // Checks you have logged in and token hasn't expired
	var tempDate = new Date();
  var tempValid = true;
  if (!userLoggedIn){
    tempValid = false;
    growl('danger', 'Facebook Error', 'You are currently not logged in with Facebook!');
  }
  else if (tempDate >= fbTokenExpires){
    tempValid = false;
    growl('danger', 'Facebook Error', 'Facebook token expired. Please log in again');
  }
  return tempValid;
}

/*******************  Create temporary AWS credentials  *********************/

Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
};

function setupAWS(response){
  fbToken = response.authResponse.accessToken;
  console.log('Facebook token: ' + JSON.stringify(fbToken)) 
  fbTokenExpires = new Date().addHours(response.authResponse.expires/3600);
  fbUserId = response.authResponse.userID;
  prefix = 'facebook-' + fbUserId;
  S3.config.credentials = new AWS.WebIdentityCredentials({
      ProviderId: 'graph.facebook.com',
      RoleArn: roleArn,
      WebIdentityToken: fbToken
  });
  userLoggedIn = true;
  console.log('Finished creating AWS credentials for account: ' + fbUserId);
  syncShoppingList();
}


/********************  Create a new shopping list  ***************************/

function createShoppingList(){
  if (validLogin()){
    var listName = $('#inputCreateName')[0].value;
    if (listName == ''){
      growl('danger', 'List Name Error', 'Please enter a valid name for your shopping list!');
      return;
    }
    $('#btnCreate').attr("disabled", "disabled");
    showSpinner();
    data = {
      listName: listName,
      itemList: $('#inputCreateList')[0].value,
      lastUpdated: new Date()
    };
    var key = prefix + '/' +  listName + '.json';
    saveLocalStorage(data,key);
    var keyDetails =     {
      'key': key,
      'lastUpdated': new Date()
    }
    objKeys.push(keyDetails);
    saveLocalStorage(objKeys,'objKeysBSL');
    hideSpinner();
    $('#btnCreate').removeAttr("disabled");
    loadModals();
    growl('success', 'List Created', 'Shopping list successfully created');
  }
}

/****************  Delete an existing shopping list   ************************/

function deleteShoppingList(shoppingList){
  if (objKeys.length>0){
    $('#btnDelete').attr("disabled", "disabled");
    var key = objKeys[shoppingList].key;
    deleteLocalStorage(key);
    objKeys.splice(shoppingList, 1);
    saveLocalStorage(objKeys,'objKeysBSL');
    loadModals();
    growl('success','Deleted.','Shopping list successfully deleted');
    $('#btnDelete').removeAttr("disabled");
  }
  else{
    growl('danger','Error.','You have no shopping lists to delete!');
  }
}

/******************  Read an existing shopping list  *************************/

function readShoppingList(shoppingList){
  if (objKeys.length>0){
      var key = objKeys[shoppingList].key;
      $('#inputReadList')[0].innerHTML = readLocalStorage(key).itemList;
  }
  else{
    $('#inputReadList')[0].innerHTML = 'You currently have no shopping lists.'
  }
}

/*************************  S3 functions  ************************************/

function saveS3(data,key){

}

function deleteS3(key){

}

function syncShoppingList(){

}

function checkLocal(){

}

function syncS3Local(objKeyS3, emptyS3){

}

/***********************  Local Storage Functions  ***************************/

function saveLocalStorage(data,key){
  localStorage.setItem(key, JSON.stringify(data));
}

function readLocalStorage(key){
  if (localStorage.getItem(key)){
    return JSON.parse(localStorage.getItem(key));
  }
}

function deleteLocalStorage(key){
    localStorage.removeItem(key);
}

function loadObjKeys(){
  // Get objKeys from local storage
  console.log('Retrieving database index from local storage...');
  objKeys = readLocalStorage('objKeysBSL');
  // Check objKeys is null.
  try
    {
      if ((objKeys === null)||(objKeys === undefined))
      {
        objKeys =[];
      }
    }
  catch (e)
  {
    // Problem with objKeys
    objKeys =[];
  }
  console.log('Retrieved local objKeys: ' + JSON.stringify(objKeys));
  growl('success','Completed','Retrieved database index from local storage... ');
}

/***************************  User Interface  ********************************/

function loadModals(){
  console.log('load Modals with :'+ JSON.stringify(objKeys))
  var tempStr = '';
  var option;
  var x = $('#dropdownReadList')[0];
  var y = $('#dropdownDeleteList')[0];
  x.innerHTML = ''; // Clear dropdown lists
  y.innerHTML = '';
  // Load dropdown lists with object names
  for (var a=0; a<objKeys.length;a++){
    tempStr = objKeys[a].key.substring(objKeys[a].key.indexOf('/') + 1);
    tempStr = tempStr.replace('.json', '');
    console.log('load Modals with :'+ tempStr)
    option = document.createElement('option');
    option.text = tempStr;
    x.add(option);
    option = document.createElement('option');
    option.text = tempStr;
    y.add(option);
  }
}

function growl(alertType,title,message){
  $('#jGrowl-container1').jGrowl({
      header: title,
      message: message,
      group: 'alert-' + alertType,
      life: 5000
  });
}

function showSpinner(){
  $('#pageSpinner').css('display', 'block');
}

function hideSpinner(){
  $('#pageSpinner').css('display', 'none');
}

/***************************  END  *******************************************/
})();