app.controller('holidayCtrl', function(ErrorSvc, $scope, $holiday) {
  $scope.getError = function(holiday, holidays) {
    $scope.nextOccurrence = null;

    if (!holiday) {
      return ErrorSvc.validationArgs(true);
    }

    if (!holiday.name) {
      return ErrorSvc.validationArgs(true, "Introduza um nome do feriado");
    }

    if (holiday.name.trim() === "") {
      return ErrorSvc.validationArgs(true, "Introduza um nome do feriado");
    }

    for (var i = 0; i < holidays.length; i++) {
      if (holidays[i].name == holiday.name && holiday._id != holidays[i]._id) {
        return ErrorSvc.validationArgs(true, "Feriado já existente");
      }
    }

    if (!holiday.date && !holiday.formula) {
      return ErrorSvc.validationArgs(true, "Impossivel calcular próxima ocorrência para este feriado");
    }

    if (holiday.date) {
      var pattern = /^(?:(?:[12][0-9]|0[1-9])\/(02)|(?:30|[12][0-9]|0[1-9])\/(?:(?:0[469]|11))|(?:3[01]|[12][0-9]|0[1-9])\/(?:(?:0[13578]|1[02])))$/;
      if (!pattern.test(holiday.date)) {
        return ErrorSvc.validationArgs(true, "A data deve ser no formato dd/mm");
      }
    }
    else if (holiday.formula) {
      try {
        var currentYear = new Date().getFullYear();
        eval('my_function = ' + holiday.formula);
        var d = my_function(currentYear);
        if (Object.prototype.toString.call(d) === "[object Date]" ) {
          //it is a date
          if (isNaN(d.getTime())) {
            return ErrorSvc.validationArgs(true, "Data inválida");
          }
        }
        else {
          return ErrorSvc.validationArgs(true, "Data inválida");
        }
      }
      catch(err) {
        return ErrorSvc.validationArgs(true, "A formula que introduziu contém um erro: " + err);
      }
    }

    return ErrorSvc.validationArgs(false);
  };

  $scope.calculateNextOccurrence = $holiday.calculateNextOccurrence;
});
