public async Task <IActionResult> Create(
            [Bind("DepartmentId,Name,LastName,Image,Gender,Email,Phone,Id")] Models.Lecturer lecturer)
        {
            if (ModelState.IsValid)
            {
                _context.Add(lecturer);
                await _context.SaveChangesAsync();

                // Here we will work on image
                var webRootPath    = _webHostEnvironment.WebRootPath;
                var files          = HttpContext.Request.Form.Files;
                var lecturerFromDb = await _context.Lecturers.FindAsync(lecturer.Id);

                //======================== ===================== mean we choose a photo for lecturer =============================================
                if (files.Any())
                {
                    // validate only the image is allowed
                    if (files[0].ContentType != "image/jpeg")
                    {
                        ModelState.AddModelError(string.Empty, "Failed! Only image type is allowed.");
                        ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name", lecturer.DepartmentId);
                        return(View(lecturer));
                    }
                    var upload   = Path.Combine(webRootPath, "images");
                    var fileName = files[0].FileName;

                    await using (var fileStream =
                                     new FileStream(Path.Combine(upload, lecturerFromDb.Id + "_" + fileName), FileMode.Create))
                    {
                        files[0].CopyTo(fileStream);
                    }

                    lecturerFromDb.Image = @"\images\" + lecturerFromDb.Id + "_" + fileName;
                }
                // mean we didn't upload photo, so we use the default one
                else
                {
                    if (lecturerFromDb.Gender.ToString() == "Male")
                    {
                        var upload = Path.Combine(webRootPath,
                                                  @"images\" + StaticDetails.ManTeacher);
                        System.IO.File.Copy(upload, webRootPath + @"\images\" + lecturerFromDb.Id + "_" + StaticDetails.ManTeacher);
                        lecturerFromDb.Image = @"\images\" + lecturerFromDb.Id + "_" + StaticDetails.ManTeacher;
                    }
                    else
                    {
                        var upload = Path.Combine(webRootPath,
                                                  @"images\" + StaticDetails.WomanTeacher);
                        System.IO.File.Copy(upload, webRootPath + @"\images\" + lecturerFromDb.Id + "_" + StaticDetails.WomanTeacher);
                        lecturerFromDb.Image = @"\images\" + lecturerFromDb.Id + "_" + StaticDetails.WomanTeacher;
                    }
                }
                await _context.SaveChangesAsync();

                //=================================================== End Of Image ============================================================

                return(RedirectToAction(nameof(Index)));
            }
            ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name", lecturer.DepartmentId);
            return(View(lecturer));
        }
        public async Task <IActionResult> Edit(int id, [Bind("DepartmentId,Name,LastName,Image,Gender,Email,Phone,Id")] Models.Lecturer lecturer)
        {
            if (id != lecturer.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    var webRootPath    = _webHostEnvironment.WebRootPath;
                    var lecturerFromDb = await _context.Lecturers.FindAsync(id);

                    var files = HttpContext.Request.Form.Files;

                    //mean we choose another image, so we have to update this and remove the old one

                    if (files.Any())
                    {
                        // validate only the image is allowed
                        if (files[0].ContentType != "image/jpeg")
                        {
                            ModelState.AddModelError(string.Empty, "Failed! Only image type is allowed.");
                            ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name", lecturer.DepartmentId);
                            return(View(lecturer));
                        }


                        var fileName = files[0].FileName;
                        var upload   = Path.Combine(webRootPath, "images");

                        // Now let's delete the old one
                        // because we have added the (\), we have to remove this first
                        var oldImagePath = Path.Combine(webRootPath, lecturerFromDb.Image.Trim('\\'));
                        if (System.IO.File.Exists(oldImagePath))
                        {
                            System.IO.File.Delete(oldImagePath);
                        }

                        // Now let's add teh new one
                        await using (var fileStream =
                                         new FileStream(Path.Combine(upload, id + "_" + fileName), FileMode.Create))
                        {
                            files[0].CopyTo(fileStream);
                        }

                        // If image is set we update the image
                        lecturerFromDb.Image = @"\images\" + id + "_" + fileName;
                    }

                    //here no image is choose we don't update the image field

                    lecturerFromDb.Name     = lecturer.Name;
                    lecturerFromDb.LastName = lecturer.LastName;
                    lecturerFromDb.Gender   = lecturer.Gender;

                    lecturerFromDb.DepartmentId = lecturer.DepartmentId;
                    lecturerFromDb.Email        = lecturer.Email;
                    lecturerFromDb.Phone        = lecturer.Phone;

                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!LecturerExists(lecturer.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            ViewData["DepartmentId"] = new SelectList(_context.Departments, "Id", "Name", lecturer.DepartmentId);
            return(View(lecturer));
        }