public async Task <ServiceResponseResult> CreateAdmin(long locationId, long userId, AdministratorReqModel model)
        {
            Logger.WriteInformation("Creating admin data.");
            var tempPwd = Guid.NewGuid().ToString();
            var user    = UserMapper.ToUser(model, tempPwd, _appSettings.Secret);

            user = user.UpdateLastUpdatedBy(userId);
            _context.Add(user);
            await _context.SaveChangesAsync();

            var userLocation = new UserLocation
            {
                CreatedBy     = userId,
                CreatedOn     = DateTime.UtcNow,
                LocationId    = locationId,
                LastUpdatedBy = userId,
                LastUpdatedOn = DateTime.UtcNow,
                UserId        = user.Id,
                State         = (int)AdministratorState.Invited
            };

            _context.Add(userLocation);
            await _context.SaveChangesAsync();

            var response = new AdministratorResult(user, userLocation);

            if (model.Permissions != null)
            {
                var userPermission = UserPermissionMapper.ToUserPermission(model.Permissions);
                userPermission = userPermission.UpdateLastUpdatedBy(userId)
                                 .UpdateLastUpdatedOn(DateTime.UtcNow)
                                 .UpdateUserLocationId(userLocation.Id);

                _context.Add(userPermission);
                await _context.SaveChangesAsync();

                response.AddPermission(userPermission);
            }


            var key = await _context.KeyHolder.FirstOrDefaultAsync(x => x.KeySerialNumber == model.KeySerialNumber);

            if (key != null)
            {
                var userKeyMapping = new UserKeyMapping
                {
                    AppliedOn       = DateTime.UtcNow,
                    KeySerialNumber = key.KeySerialNumber,
                    LocationId      = locationId,
                    UserId          = user.Id
                };

                userLocation.UpdateIsToolKitEnabled(true);
                _context.Update(userLocation);

                _context.Add <UserKeyMapping>(userKeyMapping);
                await _context.SaveChangesAsync();

                response.AddToolkit(key);
            }

            var emailData = await _emailService.ConstructResetPassword(tempPwd);

            await _emailSender.SendMailViaSmtpClientAsync(new string[] { user.Email }, new string[] { }, new string[] { }, emailData);

            Logger.WriteInformation("Creating admin data completed.");
            return(new ServiceResponseResult
            {
                Result = response,
                StatusCode = System.Net.HttpStatusCode.OK
            });
        }
        public async Task <ServiceResponseResult> UpdatedAdmin(long locationId, long userId, long adminUserId, AdministratorUpdateReqModel model)
        {
            Logger.WriteInformation("Getiing admin activity data.");
            var userLoc = await _context.UserLocation.FirstOrDefaultAsync(x => x.UserId == adminUserId && x.LocationId == locationId);

            if (userLoc == null)
            {
                return(new ServiceResponseResult
                {
                    Result = new { Message = $"User does not exists in this location {locationId}" },
                    StatusCode = System.Net.HttpStatusCode.NotFound
                });
            }

            var user = await _context.User.FindAsync(adminUserId);

            if (!string.IsNullOrEmpty(model.Email) && model.Email != user.Email)
            {
                var doesEmailExists = await _context.ChangeEmailRequest.AnyAsync(x => x.Email == model.Email.ToLower()) || await _context.User.AnyAsync(x => x.Email == model.Email.ToLower());

                if (doesEmailExists)
                {
                    return(new ServiceResponseResult
                    {
                        Result = new { Message = $"Could not update the email as it is already exists" },
                        StatusCode = System.Net.HttpStatusCode.BadRequest
                    });
                }


                var emailChange = new ChangeEmailRequest
                {
                    Email                   = model.Email,
                    RequestedOn             = DateTime.UtcNow,
                    UserId                  = adminUserId,
                    VerificationToken       = Guid.NewGuid().ToString(),
                    VerificationTokenExpiry = DateTime.UtcNow.AddHours(24)
                };
                _context.ChangeEmailRequest.Add(emailChange);

                var emailData = await _emailService.ConstructEmailVerification(emailChange.VerificationToken);

                await _emailSender.SendMailViaSmtpClientAsync(new string[] { emailChange.Email }, new string[] { }, new string[] { }, emailData);
            }

            if (!string.IsNullOrEmpty(model.Name))
            {
                user = user.UpdateName(model.Name).UpdateLastUpdatedBy(userId)
                       .UpdateLastUpdatedOn(DateTime.UtcNow);
            }

            _context.Update <User>(user);

            if (model.State.HasValue)
            {
                if (model.State.Value == AdministratorState.Disabled && string.IsNullOrEmpty(model.DisabledReason))
                {
                    return(new ServiceResponseResult
                    {
                        Result = new { Message = $"DisabledReason is required for disable state." },
                        StatusCode = System.Net.HttpStatusCode.BadRequest
                    });
                }

                userLoc.State         = (int)model.State.Value;
                userLoc.LastUpdatedBy = userId;
                userLoc.LastUpdatedOn = DateTime.UtcNow;
                _context.Update(userLoc);
            }

            var response = new AdministratorResult(user, userLoc);

            if (model.Status != null)
            {
                var status = await _context.UserStatus.FirstOrDefaultAsync(x => x.Id == model.Status.Id && x.LocationId == locationId);

                if (status != null)
                {
                    userLoc.StatusId      = status.Id;
                    userLoc.LastUpdatedBy = userId;
                    userLoc.LastUpdatedOn = DateTime.UtcNow;
                    _context.Update(userLoc);
                    response.AddStatus(status);
                }
            }

            var userPermission = await _context.UserPermission.FirstOrDefaultAsync(x => x.UserLocationId == userLoc.Id);

            if (userPermission == null)
            {
                userPermission = UserPermissionMapper.ToUserPermission(model.Permissions)
                                 .UpdateLastUpdatedOn(DateTime.UtcNow)
                                 .UpdateUserLocationId(userLoc.Id);
                _context.Add <UserPermission>(userPermission);
            }
            else
            {
                userPermission = UserPermissionMapper.ToUserPermission(model.Permissions);
                userPermission = userPermission.UpdateLastUpdatedBy(userId)
                                 .UpdateId(userPermission.Id)
                                 .UpdateLastUpdatedOn(DateTime.UtcNow)
                                 .UpdateUserLocationId(userLoc.Id);

                _context.Update <UserPermission>(userPermission);
            }

            response.AddPermission(userPermission);

            var key = await _context.KeyHolder.FirstOrDefaultAsync(x => x.KeySerialNumber == model.KeySerialNumber);

            var userKeyMapping = await _context.UserKeyMapping
                                 .FirstOrDefaultAsync(x => x.UserId == adminUserId && x.LocationId == locationId && x.KeySerialNumber == model.KeySerialNumber);

            if (key != null)
            {
                if (userKeyMapping == null)
                {
                    userKeyMapping = new UserKeyMapping
                    {
                        AppliedOn       = DateTime.UtcNow,
                        KeySerialNumber = key.KeySerialNumber,
                        LocationId      = locationId,
                        UserId          = user.Id
                    };

                    userLoc.UpdateIsToolKitEnabled(true);
                    _context.Update(userLoc);

                    _context.Add <UserKeyMapping>(userKeyMapping);
                }
                response.AddToolkit(key);
            }
            await _context.SaveChangesAsync();

            Logger.WriteInformation("Updating admin activity data completed.");

            return(new ServiceResponseResult
            {
                StatusCode = System.Net.HttpStatusCode.OK,
                Result = response
            });
        }
        public async Task <ServiceResponseResult> UpdatedAdmin(long locationId, long userId, AdministratorReqModel model)
        {
            Logger.WriteInformation("Updating admin data.");
            var user = await _context.User.FirstOrDefaultAsync(x => x.Email == model.Email);

            var userLoc = await _context.UserLocation.FirstOrDefaultAsync(x => x.UserId == user.Id && x.LocationId == locationId);

            if (userLoc == null)
            {
                return(new ServiceResponseResult
                {
                    Result = new { Message = $"User does not exists in this location {locationId}" },
                    StatusCode = System.Net.HttpStatusCode.NotFound
                });
            }

            user = user.UpdateName(model.Name)
                   .UpdateLastUpdatedBy(userId)
                   .UpdateLastUpdatedOn(DateTime.UtcNow);

            _context.Update <User>(user);

            var userPermission = await _context.UserPermission.FirstOrDefaultAsync(x => x.UserLocation.LocationId == locationId && x.UserLocation.UserId == user.Id);

            if (userPermission != null)
            {
                return(new ServiceResponseResult
                {
                    Result = new { Message = "User permission for location already added" },
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                });
            }

            await _context.SaveChangesAsync();

            var response = new AdministratorResult(user, userLoc);

            if (model.Permissions != null)
            {
                userPermission = UserPermissionMapper.ToUserPermission(model.Permissions);
                userPermission = userPermission.UpdateLastUpdatedBy(userId)
                                 .UpdateLastUpdatedOn(DateTime.UtcNow)
                                 .UpdateUserLocationId(userLoc.Id);

                _context.Add <UserPermission>(userPermission);
                await _context.SaveChangesAsync();

                response.AddPermission(userPermission);
            }


            var key = await _context.KeyHolder.FirstOrDefaultAsync(x => x.KeySerialNumber == model.KeySerialNumber);

            if (key != null)
            {
                var userKeyMapping = new UserKeyMapping
                {
                    AppliedOn       = DateTime.UtcNow,
                    KeySerialNumber = key.KeySerialNumber,
                    LocationId      = locationId,
                    UserId          = user.Id
                };

                userLoc.UpdateIsToolKitEnabled(true);
                _context.Update(userLoc);

                _context.Add <UserKeyMapping>(userKeyMapping);
                await _context.SaveChangesAsync();

                response.AddToolkit(key);
            }
            Logger.WriteInformation("Updating admin activity data completed.");
            return(new ServiceResponseResult
            {
                Result = response,
                StatusCode = System.Net.HttpStatusCode.OK
            });
        }