public void ReturnBook_Click(object sender, EventArgs e)
        {
            var actuallLease = _leasesRepository.GetByQuery(x => x.Copy.Id == selectedBook.Id);
            var actuallReserved = _reservationsRepository.GetByQuery(x => x.ReservedCopy.Id == selectedBook.Id);
            foreach (var lease in actuallLease)
            {
                if (lease.ActualReturn == DateTime.MinValue)
                {
                    //add return date
                    lease.ActualReturn = System.DateTime.Now;
                    lease.Copy.Available = true;

                    if (actuallReserved.Count() != 0)
                    {
                        foreach (var reseved in actuallReserved)
                        {

                            if (reseved != null)
                            {
                                var reservToLease = new DataInterface.Entities.Lease(1, DateTime.Now, DateTime.Now.AddDays(14.0), DateTime.MinValue, _usersRepository.GetById(reseved.ReservedBy.Id), _booksRepository.GetById(selectedBook.Id), new DataInterface.Entities.Fine());
                                lease.Copy.Available = false;
                                _leasesRepository.Save(reservToLease);
                                _reservationsRepository.DeleteById(reseved.Id);
                                MessageBox.Show("Copy returned");
                                return;
                            }
                        }
                    }

                }
                MessageBox.Show("Copy returned");

            }
        }
        public void Borrow_Click(object sender, EventArgs e)
        {
            int userID = GetUserId();
            var user = _usersRepository.GetById(userID);
            var book = _booksRepository.GetById(selectedBook.Id);
            var allLease = _leasesRepository.GetAll();
            var allReserved = _reservationsRepository.GetAll();
            var oneLease = _leasesRepository.GetByQuery(x => x.Copy.Id == book.Id).Where(x => x.User.Id == user.Id);
            var oneReserved = _reservationsRepository.GetByQuery(x => x.ReservedCopy.Id == book.Id).Where(x => x.ReservedBy.Id == user.Id);

            if (allLease != null)
            {
                foreach (var lease in allLease)
                {
                    foreach (var onelease in oneLease)
                    {
                        if (lease.Copy.Id == selectedBook.Id && lease.User.Id == user.Id && onelease.ActualReturn == DateTime.MinValue)
                        {
                            MessageBox.Show("You already borrowed this book");
                            return;
                        }
                    }
                }

            }

            if (allReserved != null)
            {
                foreach (var reseved in allReserved)
                {
                    if (reseved.ReservedCopy.Id == book.Id && reseved.ReservedBy.Id == user.Id)
                    {
                        MessageBox.Show("You already reserved this book");
                        return;
                    }
                    else if (reseved.ReservedCopy.Id == book.Id && reseved.ReservedBy.Id != user.Id)
                    {
                        MessageBox.Show("You cannot reserved this book\n Because is already reserved by other user");
                        return;
                    }
                }

            }

            if (selectedBook.Id != -1)
            {

                if (selectedBook.Available)
                {

                    var lease = new DataInterface.Entities.Lease();
                    lease.StartDate = DateTime.Now;
                    lease.ExpectedReturn = DateTime.Now.AddDays(selectedBook.Book.CategorySetting.BorrowTime);
                    lease.ActualReturn = DateTime.MinValue;
                    lease.User = _usersRepository.GetById(userID);
                    lease.Copy = _booksRepository.GetById(selectedBook.Id);
                    lease.Fine = new DataInterface.Entities.Fine();
                    lease.Fine.Paid = false;
                    lease.Fine.Amount = selectedBook.Book.CategorySetting.FinePerTardinessDay;

                    selectedBook.Available = false;
                    _leasesRepository.Save(lease);
                    if (lease.Copy.Id == selectedBook.Id && lease.User.Id == user.Id)
                    {
                        MessageBox.Show("Book Borrowed");
                        return;
                    }
                }
                else
                {
                    var reserved = new DataInterface.Entities.Reservation();
                    reserved.ReservedBy = _usersRepository.GetById(userID);
                    reserved.ReservedCopy = _booksRepository.GetById(selectedBook.Id);
                    reserved.ReservationTime = DateTime.Now;
                    _reservationsRepository.Save(reserved);
                    MessageBox.Show("Book Reserved");
                    return;
                }
            }
            else
            {
                MessageBox.Show("No user Selected");
                return;
            }

            if (allLease != null && oneLease != null)
            {
                foreach (var lease in allLease)
                {
                    foreach (var onelease in oneLease)
                    {
                        if (lease.Copy.Id == book.Id && lease.User.Id == user.Id && onelease.ActualReturn == DateTime.MinValue)
                        {
                            MessageBox.Show("You already borrowed this book");
                            return;
                        }
                    }
                }

            }

            if (allReserved != null)
            {
                foreach (var reseved in allReserved)
                {

                    if (reseved.ReservedCopy.Id == selectedBook.Id && reseved.ReservedBy.Id == user.Id)
                    {
                        MessageBox.Show("You already reserved this book");
                        return;
                    }
                    else if (reseved.ReservedCopy.Id == selectedBook.Id && reseved.ReservedBy.Id != user.Id)
                    {
                        MessageBox.Show("You cannot reserved this book\n Because is already reserved by other user");
                        return;
                    }

                }

            }

            if (selectedBook.Id != -1)
            {
                if (selectedBook.Available)
                {

                    var lease = new DataInterface.Entities.Lease(1, DateTime.Now, DateTime.Now.AddDays(14.0), DateTime.MinValue, _usersRepository.GetById(userID), _booksRepository.GetById(selectedBook.Id), new DataInterface.Entities.Fine());
                    selectedBook.Available = false;
                    _leasesRepository.Save(lease);
                    MessageBox.Show("Book Borrowed");

                }
                else
                {
                    var reserved = new DataInterface.Entities.Reservation();
                    reserved.ReservedBy = _usersRepository.GetById(userID);
                    reserved.ReservedCopy = _booksRepository.GetById(selectedBook.Id);
                    reserved.ReservationTime = DateTime.Now;
                    _reservationsRepository.Save(reserved);
                    MessageBox.Show("Book Reserved");
                }
            }
            else
            {
                MessageBox.Show("No user Selected");
            }
        }
        private void ChangeCopyState(DataInterface.Entities.User selectedUser, bool isRegistered)
        {
            var userReservedBooks = _reservationsRepository.GetByQuery(x => x.ReservedBy.Id == selectedUser.Id);
            var allLease = _leasesRepository.GetAll();

            if (allLease != null)
            {
                foreach (var leasedCopy in allLease)
                {
                    if (userReservedBooks.Count() != 0)
                    {
                        foreach (var reseved in userReservedBooks)
                        {
                            if (reseved != null)
                            {
                                if (!isRegistered)
                                {
                                    if (leasedCopy.Copy.Id == reseved.ReservedCopy.Id && leasedCopy.ActualReturn != DateTime.MinValue && leasedCopy.Copy.Available)
                                    {
                                        if (reseved.ReservedBy.Id == selectedUser.Id)
                                        {
                                            //var reservToLease = new DataInterface.Entities.Lease(1, DateTime.Now, DateTime.Now.AddDays(14.0), DateTime.MinValue, _usersRepository.GetById(reseved.ReservedBy.Id), _bookCopiesRepository.GetById(id), new DataInterface.Entities.Fine());
                                            var reservToLease = new DataInterface.Entities.Lease();
                                            reservToLease.StartDate = DateTime.Now;
                                            reservToLease.ExpectedReturn = DateTime.Now.AddDays(reseved.ReservedCopy.Book.CategorySetting != null ? reseved.ReservedCopy.Book.CategorySetting.BorrowTime : 14);
                                            reservToLease.ActualReturn = DateTime.MinValue;
                                            reservToLease.User = _usersRepository.GetById(reseved.ReservedBy.Id);
                                            reservToLease.Copy = _bookCopiesRepository.GetById(reseved.ReservedCopy.Id);
                                            reservToLease.Copy.Available = false;
                                            reservToLease.Fine = new DataInterface.Entities.Fine();
                                            reservToLease.Fine.Paid = false;
                                            reservToLease.Fine.Amount = reseved.ReservedCopy.Book.CategorySetting != null ? reseved.ReservedCopy.Book.CategorySetting.FinePerTardinessDay : 1.0;
                                            _leasesRepository.Save(reservToLease);
                                            _reservationsRepository.DeleteById(reseved.Id);
                                            MessageBox.Show("All your reserved copy, are now borrowed by you");
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (selectedUser.IsRegistered == false && isRegistered == true)
            {
                List<int> leaseToDelete = new List<int>();
                List<int> reservationToDelete = new List<int>();
                if (allLease != null)
                {
                    foreach (var leasedCopy in allLease)
                    {
                        if (leasedCopy.User.Id == selectedUser.Id)
                        {
                            leaseToDelete.Add(leasedCopy.Id);
                            leasedCopy.Copy.Available = true;
                        }
                    }

                    foreach (var toDelete in leaseToDelete)
                    {
                        _leasesRepository.DeleteById(toDelete);
                    }
                }

                if (userReservedBooks.Count() != 0)
                {
                    foreach (var reseved in userReservedBooks)
                    {
                        if (reseved.ReservedBy.Id == selectedUser.Id)
                            reservationToDelete.Add(reseved.Id);
                    }
                    foreach (var toDelete in reservationToDelete)
                    {
                        _reservationsRepository.DeleteById(toDelete);
                    }

                }
            }
        }
        private void ReturnBook_Click(object sender, EventArgs eventArgs)
        {
            var select = (BorrowedBookCopies.SelectedItems.Count != 0) ? BorrowedBookCopies.SelectedItems[0].SubItems[6].Text : null;
            if (select != null)
            {
                // var id = Convert.ToInt32(BorrowedBookCopies. Rows[BookCopiesDataGrid.SelectedRows[0].Index].Cells[0].Value.ToString());
                int id = Convert.ToInt16(select);
                var selectedCopy = _bookCopiesRepository.GetById(id);
                var actuallLease = _leasesRepository.GetByQuery(x => x.Copy.Id == id);
                var actuallReserved = _reservationsRepository.GetByQuery(x => x.ReservedCopy.Id == id);
                foreach (var lease in actuallLease)
                {
                    if (lease.ActualReturn == DateTime.MinValue)
                    {
                        //add return date
                        lease.ActualReturn = DateTime.Now;
                        lease.Copy.Available = true;

                        if (actuallReserved.Count() != 0)
                        {
                            foreach (var reseved in actuallReserved)
                            {

                                if (reseved != null && reseved.ReservedBy.IsRegistered)
                                {
                                    //var reservToLease = new DataInterface.Entities.Lease(1, DateTime.Now, DateTime.Now.AddDays(14.0), DateTime.MinValue, _usersRepository.GetById(reseved.ReservedBy.Id), _bookCopiesRepository.GetById(id), new DataInterface.Entities.Fine());
                                    var reservToLease = new DataInterface.Entities.Lease();
                                    reservToLease.StartDate = DateTime.Now;
                                    reservToLease.ExpectedReturn = DateTime.Now.AddDays(reseved.ReservedCopy.Book.CategorySetting != null ? reseved.ReservedCopy.Book.CategorySetting.BorrowTime : 14);
                                    reservToLease.ActualReturn = DateTime.MinValue;
                                    reservToLease.User = _usersRepository.GetById(reseved.ReservedBy.Id);
                                    reservToLease.Copy = _bookCopiesRepository.GetById(id);
                                    reservToLease.Fine = new DataInterface.Entities.Fine();
                                    reservToLease.Fine.Paid = false;
                                    reservToLease.Fine.Amount = selectedCopy.Book.CategorySetting != null ? selectedCopy.Book.CategorySetting.FinePerTardinessDay : 1.0;

                                    lease.Copy.Available = false;
                                    _leasesRepository.Save(reservToLease);
                                    _reservationsRepository.DeleteById(reseved.Id);
                                    MessageBox.Show("Copy returned");
                                    return;
                                }
                            }
                        }

                    }

                }
                MessageBox.Show("Copy returned");
            }
            else
                MessageBox.Show("First you must select copy to return");
        }
        public void Borrow_Click(object sender, EventArgs e)
        {
            if (BookCopiesDataGrid.SelectedRows.Count <= 0) return;

            var id = Convert.ToInt32(BookCopiesDataGrid.Rows[BookCopiesDataGrid.SelectedRows[0].Index].Cells[0].Value.ToString());
            var selectedBook = _bookCopiesRepository.GetById(id);

            int userID = GetUserId();
            if (userID == -1)
             				return;
            var book = _bookCopiesRepository.GetById(id);
            var user = _usersRepository.GetById(userID);
            var allLease = _leasesRepository.GetAll();
            var allReserved = _reservationsRepository.GetAll();
            var oneLease = _leasesRepository.GetByQuery(x => x.Copy.Id == book.Id).Where(x => x.User.Id == user.Id);
            var oneReserved = _reservationsRepository.GetByQuery(x => x.ReservedCopy.Id == book.Id).Where(x => x.ReservedBy.Id == user.Id);

            if (allLease != null && oneLease != null)
            {
                foreach (var lease in allLease)
                {
                    foreach (var onelease in oneLease)
                    {
                        if (lease.Copy.Id == book.Id && lease.User.Id == user.Id && onelease.ActualReturn == DateTime.MinValue)
                        {
                            MessageBox.Show("You already borrowed this copy");
                            return;
                        }
                    }
                }

            }

            if (allReserved != null)
            {
                foreach (var reseved in allReserved)
                {

                    if (reseved.ReservedCopy.Id == book.Id && reseved.ReservedBy.Id == user.Id)
                    {
                        MessageBox.Show("You already reserved this copy");
                        return;
                    }
                    else if (reseved.ReservedCopy.Id == book.Id && reseved.ReservedBy.Id != user.Id && reseved.ReservedBy.IsRegistered==true)

                    {
                        MessageBox.Show("You cannot reserved this copy\n Because is already reserved by other user");
                        return;
                    }

                }

            }

            if (id != -1)
            {
                if (user.IsRegistered)
                {
                    if (selectedBook.Available)
                    {
                        var userr = _usersRepository.GetById(userID);
                        Debug.WriteLine(userr.Name);

                        var lease = new DataInterface.Entities.Lease();
                        lease.StartDate = DateTime.Now;
                    lease.ExpectedReturn = DateTime.Now.AddDays(selectedBook.Book.CategorySetting != null ? selectedBook.Book.CategorySetting.BorrowTime : 14);
                        lease.ActualReturn = DateTime.MinValue;
                        lease.User = _usersRepository.GetById(userID);
                        lease.Copy = _bookCopiesRepository.GetById(id);
                        lease.Fine = new Fine();
                        lease.Fine.Paid = false;
                    lease.Fine.Amount = selectedBook.Book.CategorySetting != null ? selectedBook.Book.CategorySetting.FinePerTardinessDay : 1.0;

                        selectedBook.Available = false;
                        _leasesRepository.Save(lease);
                        MessageBox.Show("Copy Borrowed");

                    }
                    else
                    {
                        var reserved = new Reservation();
                        reserved.ReservedBy = _usersRepository.GetById(userID);
                        reserved.ReservedCopy = _bookCopiesRepository.GetById(id);
                        reserved.ReservationTime = DateTime.Now;
                        _reservationsRepository.Save(reserved);
                        MessageBox.Show("Copy Reserved");
                    }
                }
                else
                {
                    if (selectedBook.Available)
                    {
                        var reserved = new Reservation();
                        reserved.ReservedBy = _usersRepository.GetById(userID);
                        reserved.ReservedCopy = _bookCopiesRepository.GetById(id);
                        reserved.ReservationTime = DateTime.Now;
                        _reservationsRepository.Save(reserved);
                        MessageBox.Show("Copy Reserved");
                        return;
                    }
                    else
                    {
                        MessageBox.Show("You cannot reserved this copy");
                        return;
                    }
                }
            }
            else
            {
                MessageBox.Show("No user Selected");
            }
        }