/// <summary>
        /// This is the default method for this controller it will load the employees out the database apply these to the
        /// view and then return it to the client.
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var employees = _context.Employees.Take(10).ToList();
            var vm        = new EmployeeLandingViewModels {
                Employees = employees, PageNum = 1, IsSearch = false
            };

            //returns the home view
            return(PartialView("EmployeeLanding", vm));
        }
        /// <summary>
        /// this method is used when the the user either clicks the next or previous buttons on the paging.
        /// it will return the next 10 or the previous 10 records in the datbase depedning on what page of the table the user is on.
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public ActionResult LoadTablePage(int page)
        {
            var skipAmount = (page - 1) * 10;
            var employees  = _context.Employees.OrderBy(e => e.EmployeeId).Skip(skipAmount).Take(10).ToList();
            var vm         = new EmployeeLandingViewModels()
            {
                Employees = employees, PageNum = page
            };

            return(PartialView("EmployeeLanding", vm));
        }
        /// <summary>
        /// this method will be used to remove a employee from the datbase.
        /// the main validation in this is making sure that the user cannot
        /// delete themselves is there are signed in as that employee.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Remove(int id)
        {
            var employee = _context.Employees.FirstOrDefault(e => e.EmployeeId == id);

            if (employee.EmployeeNumber == CurrentUser.EmployeeLogin.Employee.EmployeeNumber)
            {
                return(new HttpStatusCodeResult(500, "You cannot delete yourself as your are logged in."));
            }
            _context.Employees.Remove(employee);
            _context.SaveChanges();
            var vm = new EmployeeLandingViewModels()
            {
                Employees = _context.Employees.Take(10).ToList()
            };

            Logger.LogAction("Employee Deleted", employee.FirstName + employee.SecondName + "Deleted.");
            return(PartialView("EmployeeLanding", vm));
        }
        /// <summary>
        /// this method will be used in order to allow the user to search within the database.
        /// this will return the first 10 results that contain the string that the user has searched for.
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public ActionResult Search(string str)
        {
            EmployeeLandingViewModels vm;
            List <Employee>           employees;

            if (str.IsNullOrWhiteSpace())
            {
                employees = _context.Employees.Take(10).ToList();

                vm = new EmployeeLandingViewModels()
                {
                    Employees = employees,
                    PageNum   = 1,
                    IsSearch  = false
                };
            }
            else
            {
                employees = _context.Employees.ToList();
                var listToReturn = new List <Employee>();
                foreach (var emp in employees)
                {
                    var fullName = emp.FirstName + emp.SecondName;
                    if (fullName.ToUpper().Contains(str.ToUpper()))
                    {
                        listToReturn.Add(emp);
                    }
                }

                vm = new EmployeeLandingViewModels()
                {
                    Employees = listToReturn, PageNum = 1, IsSearch = true
                };
            }

            return(PartialView("EmployeeLanding", vm));
        }
        public ActionResult Save(Employee emp)
        {
            int errorCounter = 0;

            Error error = new Error();

            error.ErrorMessages = new List <string>();
            error.Property      = emp;

            Regex lettersOnly = new Regex("[a-z]");

            if (!emp.FirstName.IsNullOrWhiteSpace() || !emp.SecondName.IsNullOrWhiteSpace())
            {
                if (!lettersOnly.IsMatch(emp.FirstName) || !lettersOnly.IsMatch(emp.SecondName))
                {
                    error.ErrorMessages.Add("Please do not enter special characters or number in the name fields.");
                    errorCounter++;
                }
            }

            if (emp.FirstName.IsNullOrWhiteSpace() || emp.SecondName.IsNullOrWhiteSpace())
            {
                error.ErrorMessages.Add("Please enter a first and last name.");
                errorCounter++;
            }

            if (errorCounter != 0 && emp.EmployeeId != 0)
            {
                var obj = JsonConvert.SerializeObject(error);
                return(new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, obj));
            }

            //new so add them to the database
            if (emp.EmployeeId == 0)
            {
                if (_context.Employees.FirstOrDefault(e => e.EmployeeNumber == emp.EmployeeNumber) != null)
                {
                    error.ErrorMessages.Add("The Employee Number has already been assigned.");

                    var obj = JsonConvert.SerializeObject(error);

                    return(new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, obj));
                }

                if (errorCounter != 0)
                {
                    if (emp.EmployeeNumber.ToString().Trim().Length != 6)
                    {
                        error.ErrorMessages.Add("The Employee number must be 6 digits.");
                        errorCounter++;
                    }

                    var obj = JsonConvert.SerializeObject(error);

                    return(new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, obj));
                }

                var employee = new Employee
                {
                    Admin          = emp.Admin,
                    EmployeeNumber = emp.EmployeeNumber,
                    FirstName      = emp.FirstName,
                    SecondName     = emp.SecondName,
                    AccountCreated = false
                };
                _context.Employees.Add(employee);
                _context.SaveChanges();
                var vm = new EmployeeLandingViewModels()
                {
                    Employees = _context.Employees.Take(10).ToList()
                };
                Logger.LogAction("Employee Added", employee.FirstName + employee.SecondName + " Added.");
                return(View("EmployeeLanding", vm));
            }
            else if (errorCounter == 0)
            {
                //if the users id is already in the database
                if (_context.Employees.FirstOrDefault(e => e.EmployeeNumber == emp.EmployeeNumber) != null)
                {
                    if (emp.EmployeeNumber != EmployeeNumber)
                    {
                        error.ErrorMessages.Add("The Employee Number has already been assigned.");

                        var obj = JsonConvert.SerializeObject(error);

                        return(new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, obj));
                    }
                }

                var employee = _context.Employees.FirstOrDefault(e => e.EmployeeId == emp.EmployeeId);
                employee.Admin      = emp.Admin;
                employee.FirstName  = emp.FirstName;
                employee.SecondName = emp.SecondName;
                _context.SaveChanges();
                var vm = new EmployeeLandingViewModels()
                {
                    Employees = _context.Employees.Take(10).ToList()
                };
                Logger.LogAction("Employee Edited ", employee.FirstName + employee.SecondName + " Edited.");
                return(PartialView("EmployeeLanding", vm));
            }

            var ob1j = JsonConvert.SerializeObject(error);

            return(new HttpStatusCodeResult(HttpStatusCode.ExpectationFailed, ob1j));
        }