/// <summary>
        /// Get All User
        /// </summary>
        /// <returns></returns>
        #region Get Method


        /// <summary>
        /// Get the user details by user id
        /// </summary>
        /// <param name="customerId"></param>
        /// <returns>user model</returns>
        public async Task <Users> GetUserByIdAsync(Guid customerId)
        {
            if (customerId == null || customerId == Guid.Empty)
            {
                return(null);
            }

            var user = await _userRepository.SelectAsync(u => u.UserId == customerId);

            if (user.Any())
            {
                Users newUser = new Users();
                newUser.UserId            = user[0].UserId;
                newUser.UserName          = user[0].UserName;
                newUser.Password          = Convert.ToString(EncryptionandDecryption.Decrypt(user[0].Password));
                newUser.MobileNo          = user[0].MobileNo;
                newUser.Address           = user[0].Address;
                newUser.Email             = user[0].Email;
                newUser.Name              = user[0].Name;
                newUser.SecurityAnswerOne = user[0].SecurityAnswerOne;
                newUser.SecurityAnswerTwo = user[0].SecurityAnswerTwo;
                newUser.PromoCode         = user[0].PromoCode;
                newUser.PromoCodePoints   = user[0].PromoCodePoints;

                return(newUser);
            }
            else
            {
                return(null);
            }
        }
        public async Task <List <AdminAgentUserViewModel> > GetAdminAgentOperatorUsersAsync(List <string> userType)
        {
            var userList = await _userRepository.GetAdminAgentOperatorUsersAsync(userType);

            if (userList.Count() > 0)
            {
                for (int i = 0; i < userList.Count(); i++)
                {
                    userList[i].Password = Convert.ToString(EncryptionandDecryption.Decrypt(userList[i].Password));
                }
            }
            return(userList.ToList());
        }
        /// <summary>
        /// add the admin or agent user
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <int> AddAdminAgentUsersAsync(AdminAgentUserViewModel user)
        {
            if (string.IsNullOrEmpty(user.UserName) || user.Password == null || user.Name == null || user.MobileNo == null)
            {
                return((int)StatusCode.ExpectationFailed);
            }

            var existingTemplate = await _userRepository.SelectAsync(u => u.UserName == user.UserName || u.MobileNo == user.MobileNo);

            if (existingTemplate.Any())
            {
                return((int)StatusCode.ConflictStatusCode);
            }

            var userTypes = new List <UserTypes>();

            if (user.IsAdmin == false && user.IsAgent == true && user.IsOperator == false)
            {
                userTypes = (await _userTypesRepository.SelectAsync(u => u.UserType == UserTypesConstants.Agent)).ToList();
            }
            else if (user.IsAdmin == true && user.IsAgent == false && user.IsOperator == false)
            {
                userTypes = (await _userTypesRepository.SelectAsync(u => u.UserType == UserTypesConstants.Admin)).ToList();
            }
            else if (user.IsAdmin == false && user.IsAgent == false && user.IsOperator == true)
            {
                userTypes = (await _userTypesRepository.SelectAsync(u => u.UserType == UserTypesConstants.Operator)).ToList();
            }

            var newuser = new Users();

            newuser.UserId           = Guid.NewGuid();
            newuser.UserName         = user.UserName;
            newuser.Password         = Convert.ToString(EncryptionandDecryption.Encrypt(user.Password));
            newuser.Name             = user.Name;
            newuser.MobileNo         = user.MobileNo;
            newuser.Address          = user.Address;
            newuser.Email            = user.Email;
            newuser.CreatedAt        = DateTime.UtcNow;
            newuser.UserTypeId       = userTypes[0].UserTypeId;
            newuser.DateOfBirth      = user.DateOfBirth;
            newuser.AadharNo         = user.AadharNo;
            newuser.DrivingLicenceNo = user.DrivingLicenceNo;


            await _userRepository.AddAsync(newuser);

            await _userRepository.Uow.SaveChangesAsync();

            return((int)StatusCode.SuccessfulStatusCode);
        }
        /// <summary>
        /// Add new user
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <int> AddUserAsync(Users user)
        {
            if (string.IsNullOrEmpty(user.UserName) || user.Password == null || user.Name == null || user.MobileNo == null)
            {
                return((int)StatusCode.ExpectationFailed);
            }

            var existingTemplate = await _userRepository.SelectAsync(u => u.UserName == user.UserName || u.MobileNo == user.MobileNo);

            var userTypes = await _userTypesRepository.SelectAsync(u => u.UserType == UserTypesConstants.Customer);

            if (string.IsNullOrWhiteSpace(user.PromoCode))
            {
                if (existingTemplate.Any())
                {
                    return((int)StatusCode.ConflictStatusCode);
                }
                user.Password        = Convert.ToString(EncryptionandDecryption.Encrypt(user.Password));
                user.CreatedAt       = DateTime.UtcNow;
                user.UserId          = Guid.NewGuid();
                user.UserTypeId      = userTypes[0].UserTypeId;
                user.PromoCode       = null;
                user.PromoCodePoints = null;
            }
            else
            {
                var promocodes = (await _promoCodesRepository.SelectAsync(x => x.PromoCode == user.PromoCode)).ToList();
                if (existingTemplate.Any())
                {
                    return((int)StatusCode.ConflictStatusCode);
                }
                user.Password        = Convert.ToString(EncryptionandDecryption.Encrypt(user.Password));
                user.CreatedAt       = DateTime.UtcNow;
                user.UserId          = Guid.NewGuid();
                user.UserTypeId      = userTypes[0].UserTypeId;
                user.PromoCode       = Convert.ToString(promocodes[0].PromoCode);
                user.PromoCodePoints = Convert.ToString(promocodes[0].PromoCodePoints);
                await _promoCodesRepository.DeleteAsync(promocodes[0]);
            }

            await _userRepository.AddAsync(user);

            await _userRepository.Uow.SaveChangesAsync();

            return((int)StatusCode.SuccessfulStatusCode);
        }
        /// <summary>
        /// Check user exists
        /// </summary>
        /// <param name="login"></param>
        /// <returns></returns>
        public async Task <Users> GetUserDetailsAsync(Login login)
        {
            try
            {
                if (string.IsNullOrEmpty(login.UserName) || login.Password == null)
                {
                    return(new Users());
                }

                decimal result         = 0;
                var     user           = new List <Users>();
                var     isMobileNumber = decimal.TryParse(login.UserName, out result);
                if (isMobileNumber)
                {
                    user = (await _userRepository.SelectAsync(u => u.MobileNo == login.UserName)).ToList();
                }
                else
                {
                    user = (await _userRepository.SelectAsync(u => u.UserName == login.UserName)).ToList();
                }
                var pasword = EncryptionandDecryption.Decrypt(user[0].Password);
                if (user.Count() > 0)
                {
                    if (pasword == login.Password)
                    {
                        return(user[0]);
                    }
                    else
                    {
                        return(new Users());
                    }
                }
                else
                {
                    return(new Users());
                }
            }
            catch (Exception)
            {
                return(new Users());
            }
        }
        /// <summary>
        /// Update the user password
        /// </summary>
        /// <param name="newPass"></param>
        /// <param name="conPass"></param>
        /// <param name="mob"></param>
        /// <returns></returns>
        public async Task <int> UpdateUserPasswordAsync(string newPass, string conPass, string mob)
        {
            if (string.IsNullOrEmpty(newPass) || string.IsNullOrEmpty(conPass) || string.IsNullOrEmpty(mob))
            {
                return((int)StatusCode.ExpectationFailed);
            }
            var existingUser = await _userRepository.SelectAsync(u => u.MobileNo == mob);

            if (existingUser.Any() && newPass == conPass)
            {
                existingUser[0].Password = Convert.ToString(EncryptionandDecryption.Encrypt(newPass));
                await _userRepository.UpdateAsync(existingUser[0]);

                await _userRepository.Uow.SaveChangesAsync();

                return((int)StatusCode.SuccessfulStatusCode);
            }
            else
            {
                return((int)StatusCode.NoContent);
            }
        }
        /// <summary>
        /// Update the customer profile
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <int> UpdateCustomerProfileAsync(CustomerProfileViewModel user)
        {
            if (string.IsNullOrEmpty(user.UserName) || user.Password == null || user.Name == null || user.MobileNo == null)
            {
                return((int)StatusCode.ExpectationFailed);
            }

            var existingTemplate = await _userRepository.SelectAsync(u => u.UserId == Guid.Parse(user.UserId));

            if (existingTemplate.Any())
            {
                var existingMobile = await _userRepository.SelectAsync(u => u.MobileNo == user.MobileNo && u.UserId != Guid.Parse(user.UserId));

                if (existingMobile.Any())
                {
                    return((int)StatusCode.ConflictStatusCode);
                }

                existingTemplate[0].Password          = Convert.ToString(EncryptionandDecryption.Encrypt(user.Password));
                existingTemplate[0].Name              = user.Name;
                existingTemplate[0].Address           = user.Address;
                existingTemplate[0].MobileNo          = user.MobileNo;
                existingTemplate[0].Email             = user.EmailId;
                existingTemplate[0].SecurityAnswerOne = user.SecurityAnsOne;
                existingTemplate[0].SecurityAnswerTwo = user.SecurityAnsTwo;
                existingTemplate[0].CreatedAt         = DateTime.UtcNow;

                await _userRepository.UpdateAsync(existingTemplate[0]);

                await _userRepository.Uow.SaveChangesAsync();

                return((int)StatusCode.SuccessfulStatusCode);
            }
            else
            {
                return((int)StatusCode.NoContent);
            }
        }