public bool RegisterUser(Model.NewUser newUser)
        {
            try {
                SqlCommand cmd = new SqlCommand(cmdText: "INSERT INTO tbl_users (Id,FullName,UserName,ContactCode,ProfilePhoto) VALUES (@id,@name,@user,@contact,@image)", connection: SqlConnection);
                cmd.Parameters.AddWithValue(parameterName: "@id", value: newUser.Id);
                cmd.Parameters.AddWithValue(parameterName: "@name", value: newUser.FullName);
                cmd.Parameters.AddWithValue(parameterName: "@user", value: newUser.UserName);
                cmd.Parameters.AddWithValue(parameterName: "@contact", value: newUser.ContactCode);
                cmd.Parameters.AddWithValue(parameterName: "@image", value: Utilities.Helper.GetBytesFromImage(image: newUser.ProfilePicture));
                cmd.ExecuteNonQuery();

                cmd = new SqlCommand(cmdText: "INSERT INTO tbl_requests (Id,Request) VALUES (@id,@req)", connection: SqlConnection);
                cmd.Parameters.AddWithValue("@id", value: newUser.Id);
                cmd.Parameters.AddWithValue("@req", value: UserRequests.empty);
                cmd.ExecuteNonQuery();
                return(true);
            } catch (Exception ex) {
                ErrorHandler.SetError(source: "RegisterUser", error: ex.Message);
                return(false);
            }
        }
 public RegisterUser(Model.NewUser newUser)
 {
     this.newUser = newUser;
 }
        public async Task ReadTextMessageFromUpdateAsync(Update update)
        {
            User   senderUser;
            ChatId chatId;
            string updateMessage = string.Empty;

            try {
                updateMessage = update.Message.Text;
                updateMessage = updateMessage.StartsWith("/") ? updateMessage.ToLower() : updateMessage;
                senderUser    = update.Message.From;
                chatId        = update.Message.Chat.Id;
                DatabaseHandler.GetCurrentRequest(chatId.Identifier);
                // Update UI
                DataGridView.Invoke((MethodInvoker) delegate {
                    // From,Name,To,ReceiverName,Message
                    DataGridView.Rows.Add(chatId.Identifier, senderUser.FirstName, "BOT", "BOT", updateMessage);
                });

                if (updateMessage.StartsWith(BotConfigs.CMD_START))
                {
                    if (updateMessage.Equals(BotConfigs.CMD_START))  //----------------------------------------------------------------- '/start'
                    {
                        if (DatabaseHandler.UserExists(id: chatId.Identifier))
                        {
                            BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_RECEIVE_CMD); //------------------------------------ Send "what can i do for u?"
                        }
                        else                                                                                         //---------------------------------------------------------------------------------------------------- Register new user
                        {
                            Image profileImage = await BotApiMethods.GetProfileImageAsync(senderUser.Id);

                            Model.NewUser newUser = new Model.NewUser(chatId, senderUser, profileImage);
                            if (DatabaseHandler.RegisterUser(newUser: newUser))
                            {
                                BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_WELCOME); //------------------- Send "welcome message"
                            }
                            else
                            {
                                BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_EXCEPTION);
                                // send to admin
                            }
                        }
                    }
                    else     //--------------------------------------------------------------------------------------------------------  '/start contactcode'

                    {
                        if (!DatabaseHandler.UserExists(chatId.Identifier))  // ------------------------------ Register new user
                        {
                            Image profileImage = await BotApiMethods.GetProfileImageAsync(senderUser.Id);

                            Model.NewUser newUser = new Model.NewUser(chatId, senderUser, profileImage);
                            if (!DatabaseHandler.RegisterUser(newUser: newUser))
                            {
                                BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_EXCEPTION);//--------------------------------- sending a message to user that shows we are aware of the problem, we'll fix it soon
                                //------------------------------------------------------------------------------------------------------ send the problem to admin(s)
                                return;
                            }
                        }
                        string contactCode = updateMessage.Split(separator: ' ')[1]; //------ updateMessage = '/start contactCode'.splitBySpace ----> contactCode
                        if (DatabaseHandler.UserExists(contactCode: contactCode))
                        {
                            string fullName = DatabaseHandler.GetFullNameByContactCode(contactCode: contactCode);
                            BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_SENDING_ANONYMOUS_TO.Replace("X", fullName));  //---- "you're going to send an anonymous message for 'fullName' please type your message"
                            DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.sendMessage, contactCode: contactCode); /* ---Update tbl_requests for chatId with request "sendMessage" and "contactCode",
                                                                                                                                                       * if user types anymessage and press enter, we will send it to target, (exception: user press BackButton)*/
                            // <REQUEST ADDED TO DATABASE, NOW WE NEED TO ANALYZE THE NEXT USER'S MESSAGE>
                        }
                        else
                        {
                            BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_USER_NOT_FOUND);//--------------- user not found
                        }
                    }
                }
                else if (updateMessage.Equals(BotConfigs.CMD_LINK))     //------------------------------------------- Request contact links

                {
                    if (DatabaseHandler.IsContactNameSet(id: chatId.Identifier))                  //---------------------------------------------------------------------- If user's name is set to database
                    {
                        string links = BotApiMethods.CreateAnonymousLinks(id: chatId.Identifier); //-------------------------------------------- Receive links
                        BotApiMethods.SendTextMessageAsync(chatId: chatId, message: links);
                    }
                    else                                                                                                          //---------------------------------------------------------------------------------------------------------------------------------- before sending links, set user's name to database
                    {
                        if (DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: Model.UserRequests.contactCode)) // Add a request to database, user wants to enter his/her own name.
                        {
                            BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_GET_NAME, keyboard: Keyboards.Back);
                        }
                        else
                        {
                            BotApiMethods.SendTextMessageAsync(chatId: chatId, message: BotConfigs.MSG_EXCEPTION);
                            // send to admin
                        }
                    }
                }
                else if (updateMessage.Equals(BotConfigs.CMD_INBOX))     // ------------------- receive inbox Messages from database.

                {
                    System.Data.SqlClient.SqlDataReader userMessages = DatabaseHandler.GetAllMessagesFor(id: chatId.Identifier); // -- request to database for returning messages.
                    if (userMessages != null)
                    {
                        string messages      = string.Empty; // User messages.
                        int    messageNumber = 0;            // ------------------------ messages count.
                        while (userMessages.Read())
                        {
                            messages = messages + $"{++messageNumber}- {userMessages.GetString(0)}\n"; // Model -> 1- HereIsMessageOne ... \n 2- HereIsMessageTwo ... and etc..
                        }

                        userMessages.Close();
                        BotApiMethods.SendTextMessageAsync(chatId: chatId, message: $"{BotConfigs.MSG_SHOW_INBOX.Replace("X", messageNumber.ToString())}{messages}", keyboard: Keyboards.Inbox); // Send messages to user.
                    }
                }
                else if (updateMessage.StartsWith(BotConfigs.CMD_HELP))
                {
                    BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_HELP);
                }
                else if (updateMessage.StartsWith(BotConfigs.CMD_REPLY))
                {
                    BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_ENTER_REPLY_NUMBER, keyboard: Keyboards.Back);
                    DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.replyToMessage);
                }
                else if (updateMessage.Equals(BotConfigs.CMD_BACK))     // ---- We need to clean user's request from database for preventing future errors/exceptions.
                {
                    if (DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.empty))
                    {
                        BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_RECEIVE_CMD);
                    }
                }
                else     // --------------------------------------------------------------------------------------------------------------- Handling user requests like sendMessage, replyMessage and etc..
                {
                    UserRequests request = DatabaseHandler.GetCurrentRequest(id: chatId.Identifier);
                    if (request == UserRequests.empty)
                    {
                        return;
                    }
                    if (request == UserRequests.contactCode)  // If user requests the contact links.

                    {
                        if (DatabaseHandler.SetContactName(id: chatId.Identifier, name: updateMessage))
                        {
                            string links = BotApiMethods.CreateAnonymousLinks(id: chatId.Identifier); // --------- Receive links
                            BotApiMethods.SendTextMessageAsync(chatId: chatId, message: links);       //  Send links to user
                        }
                    }
                    else if (request == UserRequests.sendMessage)                                                                                                                                                                                /* If user requests to send anonymous Message to anotherone. We already saved the target's contactCode in database when
                                                                                                                                                                                                                                                  * setting up the sendMessage request(line 75)*/
                    {
                        string rContact = DatabaseHandler.GetContactCodeFromRequests(id: chatId.Identifier);                                                                                                                                     // receiver contactCode
                        long   rId      = DatabaseHandler.GetIdByContactCode(contactCode: rContact);                                                                                                                                             // reciver id
                        string rName    = DatabaseHandler.GetFullNameByContactCode(contactCode: rContact);                                                                                                                                       // receiver name
                        string rUser    = DatabaseHandler.GetUsernameById(id: rId);                                                                                                                                                              // receiver username
                        string sContact = DatabaseHandler.GetContactCode(id: chatId.Identifier);                                                                                                                                                 // sender contactCode
                        string sName    = DatabaseHandler.GetFullNameByContactCode(contactCode: sContact);                                                                                                                                       // sender name
                        string sUser    = DatabaseHandler.GetUsernameById(id: chatId.Identifier);                                                                                                                                                // sender username, we could also get it from senderUser object too(line 29)
                        DatabaseHandler.AddMessage(receiverId: rId, receiverName: rName, receiverContactCode: rContact, receiverUsername: rUser, message: updateMessage, senderId: chatId.Identifier, senderName: sName, senderUsername: sUser); // Add message to database.
                        DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.empty);                                                                                                                                // Clean senderUser request from database.

                        BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_SENT);                                                                                                                             // Notif sender that your message sent.
                        BotApiMethods.SendTextMessageAsync(chatId: rId, message: BotConfigs.MSG_NEW_MESSAGE);                                                                                                                                    // Notif receiver that you received a new message.
                    }
                    else if (request == UserRequests.replyToMessage)
                    {
                        /* We need to get all messages from database for current user
                         * then we have to pick the number which user told us want to reply it.(it saved in tbl_requests, column contactCode.
                         * after that, we find the senderId from database where selected message and receiverId equals to user info*/
                        int    messageNumber;
                        string messageToSearch = string.Empty;
                        if (int.TryParse(s: updateMessage, result: out messageNumber))
                        {
                            System.Data.SqlClient.SqlDataReader userMessages = DatabaseHandler.GetAllMessagesFor(id: chatId.Identifier);
                            int counter = 1;
                            while (userMessages.Read())
                            {
                                if (counter++ == messageNumber)
                                {
                                    messageToSearch = userMessages.GetString(0);
                                    break;
                                }
                            }

                            userMessages.Close();
                            if (!string.IsNullOrEmpty(value: messageToSearch))
                            {
                                long senderId = DatabaseHandler.GetSenderIdByMessage(receiverId: chatId.Identifier, message: messageToSearch);
                                if (senderId != 0)
                                {
                                    if (DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.pickReplyMessage, contactCode: senderId.ToString()))
                                    {
                                        BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_ENTER_REPLY_MESSAGE, keyboard: Keyboards.Back);
                                    }
                                }
                            }
                        }
                    }
                    else if (request == UserRequests.pickReplyMessage)
                    {
                        // NEXT UPDATE STARTS HERE. replyToMessage didnt tested.
                        long id;
                        if (long.TryParse(s: DatabaseHandler.GetContactCodeFromRequests(id: chatId.Identifier), result: out id))
                        {
                            BotApiMethods.SendTextMessageAsync(chatId: id, message: $"{BotConfigs.MSG_REPLY_ANSWERED}{updateMessage}");
                            BotApiMethods.SendTextMessageAsync(chatId: chatId.Identifier, message: BotConfigs.MSG_SENT);
                            DatabaseHandler.EditUserRequest(id: chatId.Identifier, userRequests: UserRequests.empty);
                        }
                    }
                }
            } catch (Exception ex) {
                ErrorHandler.SetError(source: "ReadMessageFromUpdateAsync", error: ex.Message);
                return;
            }
        }