/// <summary>
        /// Tạo mới 1 người dùng hệ thống - tương tác 2 chiều với local và server:
        ///    1. Tạo mới người dùng đi kèm tài khoản đăng nhập trên server
        /// -> 2. Lấy thông tin người dùng đã được tạo trên server về local
        /// -> 3. Đưa thông tin người dùng đã tạo vào local
        /// </summary>
        /// <param name="hoTen">Họ và tên</param>
        /// <param name="ngaySinh">Ngày sinh</param>
        /// <param name="email">Email đăng ký</param>
        /// <param name="soDienThoai">Số điện thoại liên lạc</param>
        /// <param name="tenDangNhap">Tên đăng nhập</param>
        /// <param name="matKhau">Mật khẩu đăng nhập</param>
        /// <returns>True nếu tạo thành công, ngược lại false</returns>
        public async Task<bool> createNewNguoiDung(string hoTen, DateTime ngaySinh, string email, string soDienThoai,
            string tenDangNhap, string matKhau)
        {
            try
            {
                ServerDatabaseService.NguoiDung nguoiDung = new ServerDatabaseService.NguoiDung();
                nguoiDung.MaNguoiDung = -1;     // auto create in server
                nguoiDung.HoTen = hoTen;
                nguoiDung.NgaySinh = CustomDateTime.ToIntegerTime(ngaySinh);
                nguoiDung.Email = email;
                nguoiDung.SoDienThoai = soDienThoai;

                var result1 = await _serverModel.insertNguoiDungAsync(nguoiDung, tenDangNhap, matKhau);
                var result2 = await _serverModel.getNguoiDungByEmailAsync(email);
                var nguoiDungServer = result2.Body.getNguoiDungByEmailResult;
                var result3 = await _localModel.insertNguoiDung(new NGUOIDUNG(nguoiDungServer.MaNguoiDung,
                    nguoiDungServer.HoTen, nguoiDungServer.NgaySinh, nguoiDungServer.Email, nguoiDungServer.SoDienThoai));
                return result3;
            }
            catch (EndpointNotFoundException e)
            {
                throw new HttpRequestException("Không thể kết nối đến server. Vui lòng kiểm tra kết nối internet và thử lại.");
            }
            catch (HttpRequestException e)
            {
                throw new HttpRequestException("Không thể kết nối đến server. Vui lòng kiểm tra kết nối internet và thử lại.");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private async Task<bool> asyncDataNguoiDung(int maNguoiDung)
        {
            try
            {
                NGUOIDUNG localNguoiDung = await _localModel.getNguoiDung(maNguoiDung);
                ServerDatabaseService.NguoiDung serverNguoiDung = new ServerDatabaseService.NguoiDung();
                serverNguoiDung.MaNguoiDung = maNguoiDung;
                if (localNguoiDung != null)
                {
                    serverNguoiDung.MaNguoiDung = localNguoiDung.MaNguoiDung;
                    serverNguoiDung.HoTen = localNguoiDung.HoTen;
                    serverNguoiDung.NgaySinh = (localNguoiDung.NgaySinh);
                    serverNguoiDung.Email = localNguoiDung.Email;
                    serverNguoiDung.SoDienThoai = localNguoiDung.SoDienThoai;
                    var respone = await _serverModel.dataSyncNguoiDungAsync(serverNguoiDung);
                    serverNguoiDung = respone.Body.dataSyncNguoiDungResult;

                    await _localModel.updateNguoiDung(serverNguoiDung.MaNguoiDung, serverNguoiDung.HoTen,
                        serverNguoiDung.NgaySinh, serverNguoiDung.SoDienThoai);
                }
                else
                {
                    var respone = await _serverModel.getNguoiDungByMaNguoiDungAsync(maNguoiDung);
                    serverNguoiDung = respone.Body.getNguoiDungByMaNguoiDungResult;
                    localNguoiDung = new NGUOIDUNG(serverNguoiDung.MaNguoiDung, serverNguoiDung.HoTen,
                        serverNguoiDung.NgaySinh, serverNguoiDung.Email, serverNguoiDung.SoDienThoai);
                    await _localModel.insertNguoiDung(localNguoiDung);
                }

                return true;
            }
            catch (EndpointNotFoundException e)
            {
                throw new HttpRequestException("Không thể kết nối đến server. Vui lòng kiểm tra kết nối internet và thử lại.");
            }
            catch (HttpRequestException e)
            {
                throw new HttpRequestException("Không thể kết nối đến server. Vui lòng kiểm tra kết nối internet và thử lại.");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private async Task<bool> asyncDataNguoiDung(int maNguoiDung)
        {
            try
            {
                NGUOIDUNG localNguoiDung = await _localModel.getNguoiDung(maNguoiDung);
                ServerDatabaseService.NguoiDung serverNguoiDung = new ServerDatabaseService.NguoiDung();
                serverNguoiDung.MaNguoiDung = maNguoiDung;
                if (localNguoiDung != null)
                {
                    serverNguoiDung.MaNguoiDung = localNguoiDung.MaNguoiDung;
                    serverNguoiDung.HoTen = localNguoiDung.HoTen;
                    serverNguoiDung.NgaySinh = (localNguoiDung.NgaySinh);
                    serverNguoiDung.Email = localNguoiDung.Email;
                    serverNguoiDung.SoDienThoai = localNguoiDung.SoDienThoai;
                    var respone = await _serverModel.dataSyncNguoiDungAsync(serverNguoiDung);
                    serverNguoiDung = respone.Body.dataSyncNguoiDungResult;

                    await _localModel.updateNguoiDung(serverNguoiDung.MaNguoiDung, serverNguoiDung.HoTen,
                        serverNguoiDung.NgaySinh, serverNguoiDung.SoDienThoai);
                }
                else
                {
                    var respone = await _serverModel.getNguoiDungByMaNguoiDungAsync(maNguoiDung);
                    serverNguoiDung = respone.Body.getNguoiDungByMaNguoiDungResult;
                    localNguoiDung = new NGUOIDUNG(serverNguoiDung.MaNguoiDung, serverNguoiDung.HoTen,
                        serverNguoiDung.NgaySinh, serverNguoiDung.Email, serverNguoiDung.SoDienThoai);
                    await _localModel.insertNguoiDung(localNguoiDung);
                }
                
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }