//
// Service for keeping track of which memberships are selected
//

angular.module('artfully').factory('membershipSelections', function() {
  // Map of selected membership ids
  var map = {};

  // Initial values
  $('input[name=membership_ids\\[\\]]:checked').each(function(i,input) { map[input.value] = true });

  // Watch for changes
  $('body').on('change', 'input[name=membership_ids\\[\\]]', function(change) {
    var e = $(change.target);
    var membership_id = e.val();

    if ($(e).prop( "checked" )) {
      // Add the membership id if it's not already in the list
      var row   = e.closest('tr');
      var type  = $(row.find('.item-description')[0]);
      var price = $(row.find('.price')[0]);

      if (map[membership_id] === undefined) {
        map[membership_id] = {
          id: membership_id,
          type: type.text(),
          price: price.text()
        };
      }

    } else {
      // Remove the membership id
      delete map[membership_id];
    }
  });

  return map;
});

//
// Controller
//

angular.module('artfully').controller('MembershipActionsCtrl', ['$scope', 'membershipSelections', function($scope, membershipSelections) {
  $scope.loading      = false;
  $scope.error        = false;
  $scope.errorMessage = '';

  $scope.checkSelected = function() {
    $scope.error = false;
    $scope.errorMessage = '';

    if (Object.keys(membershipSelections).length == 0 ) {
      $scope.error = true;
      $scope.errorMessage = "Select one or more memberships.";
      return false;
    }
    return true;
  }

  $scope.change = function(click) {
    click.preventDefault();

    if (!$scope.checkSelected()) {
      return false;
    }

    // Open the modal
    $('#change').modal('show');
    return false;
  }

  $scope.cancel = function(click) {
    click.preventDefault();

    if (!$scope.checkSelected()) {
      return false;
    }

    $scope.loading = true;

    // Get membership_cancellations/new (fetches and displays the modal)
    $.ajax({
      url: 'membership_cancellations/new.js',
      data: {membership_ids: Object.keys(membershipSelections)},
      dataType: 'script',
      success: function (script, status, xhr) {
        $scope.$apply(function() {
          $scope.loading = false;
        });
      },
      error: function (xhr, text, error) {
        $scope.$apply(function() {
          $scope.loading = false;
          $scope.error = true;

          var message = error;
          if (xhr &&
            xhr.responseText !== undefined &&
            xhr.responseText != '' &&
            xhr.responseText != ' ') {
            message = xhr.responseText;
          }
          $scope.errorMessage = message;
        });
      }
    });
  }

}]);

angular.module('artfully').controller('ChangeMembershipController', ['$scope', 'membershipSelections', function($scope, membershipSelections) {

  // Template variables
  $scope.payment_method = '';
  $scope.price          = 0;
  $scope.total          = '$0.00';
  $scope.selected       = {};

  // Helpers
  $scope.comped = function() {
    return !!('' == $scope.payment_method || 'comp' == $scope.payment_method);
  }

  $scope.updateTotal = function() {
    var price = parseFloat($scope.price.substr(1).replace(/,/, ""));
    var total = (Object.keys($scope.selected).length * price);

    $scope.total = '$'+total.toFixed(2);
  }

  // Update the list of selected ids when the modal is shown
  $("#change").on('shown', function(shown) {
    $scope.selected = membershipSelections;

    // Mask the price field
    touchCurrency();
  });

  // Clear the list of selected ids when the modal is hidden
  $("#change").on('hidden', function(hidden) {
    $scope.payment_method = '';
    $scope.price = 0;
    $scope.updateTotal();
    $scope.selected = {};

    // Reset the form
    var form = $(this).find('form')[0];
    if (form) { form.reset(); }
  });
}]);