WebModule.controller('SimpleSearchesController', ['$scope', 'WMService', 'LotService', 'LotViewState', 'AuctionService', 'FilterService', '$location', '$http', '$filter', '$timeout', function ($scope, WMService, LotService, LotViewState, AuctionService, FilterService, $location, $http, $filter, $timeout) {
  $scope.location = $location;
  $scope.WMService = WMService;
  $scope.AuctionService = AuctionService;
  $scope.LotService = LotService;
  $scope.LotViewState = LotViewState;
  $scope.FilterService = FilterService;
  $scope.lots = {};
  $scope.searchSaved = false;
  $scope.savingIndicator = false;
  $scope.newSearchEntryOpen = false;
  $scope.newSearchEntryValue = '';
  $scope.params = FilterService.queryParams(window.location.search);
  $scope.searchOptions = {
    notificationOptions: [
      {
        label: "Weekly",
        value: "weekly",
        saveToServer: {period: 'P7D'},
        compareWithServer: {period: 'P7D'}
      },
      {
        label: "Never",
        value: null,
        saveToServer: {period: null},
        compareWithServer: {period: null}
      }
    ],
  };

  $scope.convertNotificationToPeriod = function (search) {
    var period = null;
    Object.keys($scope.searchOptions.notificationOptions).forEach((key) => {
      if ($scope.searchOptions.notificationOptions[key].value === search.notification) {
        period = $scope.searchOptions.notificationOptions[key].saveToServer.period;
      }
    });
    return period;
  }

  $scope.convertPeriodToNotification = function (search) {
    var notification = "Never";
    Object.keys($scope.searchOptions.notificationOptions).forEach((key) => {
      if ($scope.searchOptions.notificationOptions[key].saveToServer.period === search.period) {
        notification = $scope.searchOptions.notificationOptions[key].value;
      }
    });
    return notification;
  }

  $scope.saveSimpleSearch = function (search) {
    var params;
    if (search === undefined) {
      params = $scope.params;
    } else {
      params = { 'search': search };
    }
    var url = viewVars.endpoints.saveSearch;
    if (typeof search !== 'undefined' && search.hasOwnProperty('row_id')){
      url += '/' + search.row_id;
      serverSearch = search;
      serverSearch.period = $scope.convertNotificationToPeriod(search);
    } else {
      serverSearch = {
        period: $scope.convertNotificationToPeriod({notification: 'weekly'}),
        base_url: '/v1/auction-lot/upcoming',
        query_params: {
          q: params.search,
        }
      };
    }
    var promise = $http.post(url, serverSearch);
    $scope.savingIndicator = true;
    promise.success(function (data) {
      $scope.searchSaved = true;
      if (typeof search !== 'undefined') {
        search.savedIndicator = true;
      }
      data.response.notification = $scope.convertPeriodToNotification(data.response);

      if (serverSearch.hasOwnProperty('row_id')){
        for (var i=0; i<$scope.searches.length; i++){
          if ($scope.searches[i].row_id == search.row_id){
            $scope.searches[i] = data.response;
            $scope.searches[i].savedIndicator = true;
          }
        }
        for (var i = 0; i < viewVars.searches.result_page.length; i++) {
          if (viewVars.searches.result_page[i].row_id == search.row_id) {
            viewVars.searches.result_page[i] = data.response;
            viewVars.searches.result_page[i].savedIndicator = true;
          }
        }
      } else {
        $scope.searches[$scope.searches.length] = data.response;
        viewVars.searches.result_page[viewVars.searches.result_page.length] = data.response;
      }
      $scope.savingIndicator = false;
      $scope.newSearchEntryOpen = false;
    });
    promise.error(function (response) {
      WMService.handleError(response);
      $scope.savingIndicator = false;
    });
  };

  $scope.deleteSearch = function (search) {
    var serverSearch = {
      period: null,
      base_url: '/v1/auction-lot/upcoming',
      query_params: {
        q: search.query_params.q,
      }
    };
    var promise = $http.delete(viewVars.endpoints.deleteSearch+'/'+search.row_id, serverSearch);
    promise.success(function (data) {
      var searchIndex = $scope.serverSearchByRowId(search.row_id, true);
      if (searchIndex > -1) {
        $scope.searches.splice(searchIndex, 1);
        viewVars.searches.result_page.splice(searchIndex, 1);
      }
      WMService.handleError({ message: 'Saved Search Deleted.', messageType: 'info' });
    });
    promise.error(WMService.handleError);
  }

  $scope.simpleSearchLotsUrl = function (search) {
    var url = viewVars.endpoints.lots + '?search=' + search + '&lots_range=upcoming';
    return url;
  }

  $scope.viewSimpleSearch = function (search) {
    window.location.href = $scope.simpleSearchLotsUrl(search);
  }

  $scope.checkForSavedSearch = function() {
    for (var index = 0; index < $scope.searches.length; index++) {
      if ($scope.searches[index].query_params.q === $scope.params.search) {
        return $scope.searches[index].query_params.q;
      }
    };
    return 'None Selected';
  }

  $scope.serverSearchByRowId = function (rowId, returnIndex) {
    for (var i=0;i<$scope.searches.length;i++) {
      if ($scope.searches[i].row_id == rowId) {
        if (typeof returnIndex != 'undefined' && returnIndex) {
          return i;
        }
        return $scope.searches[i];
      }
    }
    if (typeof returnIndex != 'undefined' && returnIndex) {
      return -1;
    }
    return null;
  }

  $scope.showNewSearchEntry = function (show) {
    $scope.newSearchEntryOpen = show;
  }

  $scope.angularToServerFormat = function(angularSearch, compareWithServer){
    var serverSearch = {query_params:{}};
    // queryParams will require a different kind of merge using $scope.mergeQueryParams
    // instead of the usual $.extend() that works for other server params.
    var queryParams = {};
    
    if (angularSearch.query){
      queryParams.q = angularSearch.query;
    }
    serverSearch.query_params = queryParams;

    if (angularSearch.hasOwnProperty('row_id')){
      serverSearch.row_id = angularSearch.row_id;
    }

    if (angularSearch.hasOwnProperty('notification')){

      serverSearch.period = $scope.convertNotificationToPeriod(angularSearch);
    }

    if (angularSearch.hasOwnProperty('query_params')){
      serverSearch.query_params = angularSearch.query_params;
    }
    serverSearch.name = angularSearch.name;
    return serverSearch;
  }
  $scope.searchIsDirty = function(angularSearch){
    // fixme this is not working right as we are not duplicating the search object. we need to do that
    if (!angularSearch.hasOwnProperty('row_id')){
      return true;
    }
    var serverSearch = $scope.serverSearchByRowId(angularSearch.row_id);
    if (!serverSearch){
      return true;
    }
    var generatedServerSearch = $scope.angularToServerFormat(angularSearch, true);
/*    console.log(serverSearch);
    console.log(angularSearch);
    console.log(generatedServerSearch);*/
    for (var key in generatedServerSearch){
      if (!serverSearch.hasOwnProperty(key) || JSON.stringify(generatedServerSearch[key]) !== JSON.stringify(serverSearch[key])){
        return true;
      }
    }

    if (generatedServerSearch.query_params.hasOwnProperty('q') && generatedServerSearch.query_params.q != angularSearch.query_params.q){
      return true;
    }
    return false;
  }

  if (viewVars.searches !== undefined) {
    $scope.searches = [];
    for (var i=0; i < viewVars.searches.result_page.length; i++) {
      $scope.searches.push(viewVars.searches.result_page[i]);
    }
    for (var i = 0; i < viewVars.searches.result_page.length; i++) {
      var currentSearch = viewVars.searches.result_page[i];
      currentSearch.notification = $scope.convertPeriodToNotification(currentSearch);
      viewVars.searches.result_page[i] = currentSearch;
    }
  }
  $scope.$watch('searchSaved', function(){
    viewVars.searchSaved = $scope.searchSaved;
  });
  $scope.$watch('savingIndicator', function(){
    viewVars.savingIndicator = $scope.savingIndicator;
  });
}]);