public static int Create_Trading_Deal(string i_username, TreadingDeal td)
        {
            if (DBManagment.has_session(i_username))
            {
                if (DBManagment.Has_Specific_Card(i_username, td.CardToTrade) == 1) //check if user owns the card
                {
                    if (CheckIfCardNotInDeck(i_username, td.CardToTrade) == true)
                    {
                        //insert into trading_erea_offer
                        using var con = new NpgsqlConnection(DBManagment.cs);
                        con.Open();
                        string sql = "Insert into trading_erea_offer (offer_id, username, card_id) values (@id, @username, @card_id)";
                        using var cmd = new NpgsqlCommand(sql, con);
                        cmd.Parameters.AddWithValue("username", i_username);
                        cmd.Parameters.AddWithValue("id", td.ID);
                        cmd.Parameters.AddWithValue("card_id", td.CardToTrade);
                        cmd.Prepare();
                        cmd.ExecuteNonQuery();
                        con.Close();


                        //insert into trading_erea_req
                        con.Open();
                        sql            = "Insert into trading_erea_req (offer_id, min_damage, card_type) values (@id, @min_damage, @card_type)";
                        using var cmd2 = new NpgsqlCommand(sql, con);
                        cmd2.Parameters.AddWithValue("id", td.ID);
                        cmd2.Parameters.AddWithValue("min_damage", td.MinimumDamage);
                        cmd2.Parameters.AddWithValue("card_type", td.Type);
                        cmd2.Prepare();
                        cmd2.ExecuteNonQuery();
                        con.Close();

                        return(0);
                    }
                    else
                    {
                        // card is in users deck
                        return(3);
                    }
                }
                else
                {
                    //User doesnt own the card he wanna sell
                    return(2);
                }
            }
            else
            {
                //invalid token, doesnt have session
                return(1);
            }
        }
        public static int Trade(string i_username, int trading_id, string card_id)
        {
            if (DBManagment.has_session(i_username))
            {
                if (DBManagment.Has_Specific_Card(i_username, card_id) == 1)
                {
                    if (Check_trade_exists(trading_id) == 1)
                    {
                        //fetching min damage and type from request
                        double req_min_damage = 0;
                        string req_card_type  = "";
                        using var con = new NpgsqlConnection(DBManagment.cs);
                        string sql = "Select min_damage, card_type from trading_erea_req where offer_id = @offer_id";
                        using var cmd = new NpgsqlCommand(sql, con);
                        con.Open();
                        cmd.Parameters.AddWithValue("offer_id", trading_id);
                        cmd.Prepare();

                        using NpgsqlDataReader rdr = cmd.ExecuteReader();
                        rdr.Read();
                        req_min_damage = rdr.GetDouble(0);
                        req_card_type  = rdr.GetString(1);
                        rdr.Close();
                        ////////////////

                        //Fetching the data from the offered card
                        double offered_card_damage = 0;
                        string offered_card_type   = "";
                        string offered_card_id     = "";
                        string owner = "";
                        sql            = "Select card_type, damage, trading_erea_offer.username, trading_erea_offer.card_id from all_user_cards, trading_erea_offer where trading_erea_offer.offer_id = @offer_id";
                        using var cmd2 = new NpgsqlCommand(sql, con);
                        cmd2.Parameters.AddWithValue("card_id", card_id);
                        cmd2.Parameters.AddWithValue("offer_id", trading_id);

                        cmd2.Prepare();
                        using NpgsqlDataReader rdr2 = cmd2.ExecuteReader();
                        rdr2.Read();
                        offered_card_damage = rdr2.GetDouble(1);
                        offered_card_type   = rdr2.GetString(0);
                        owner           = rdr2.GetString(2);
                        offered_card_id = rdr2.GetString(3);
                        rdr2.Close();

                        //fetching the card that is given to trade
                        double given_card_damage = 0;
                        string given_card_type   = "";
                        sql            = "Select damage, card_type from all_user_cards WHERE card_id = @card_id";
                        using var cmd3 = new NpgsqlCommand(sql, con);
                        cmd3.Parameters.AddWithValue("card_id", card_id);
                        cmd3.Prepare();
                        using NpgsqlDataReader rdr3 = cmd3.ExecuteReader();
                        rdr3.Read();
                        given_card_damage = rdr3.GetDouble(0);
                        given_card_type   = rdr3.GetString(1);
                        rdr3.Close();
                        if (owner != i_username)
                        {
                            if (given_card_damage > req_min_damage && given_card_type == req_card_type)
                            {
                                sql            = "UPDATE all_user_cards set username = @username where card_id = @card_id";
                                using var cmd4 = new NpgsqlCommand(sql, con);
                                cmd4.Parameters.AddWithValue("card_id", card_id);
                                cmd4.Parameters.AddWithValue("username", owner);
                                cmd4.Prepare();
                                cmd4.ExecuteNonQuery();
                                Delete_Trade(owner, trading_id);

                                sql            = "UPDATE all_user_cards set username = @username where card_id = @card_id";
                                using var cmd5 = new NpgsqlCommand(sql, con);
                                cmd5.Parameters.AddWithValue("card_id", offered_card_id);
                                cmd5.Parameters.AddWithValue("username", i_username);
                                cmd5.Prepare();
                                cmd5.ExecuteNonQuery();
                                Delete_Trade(owner, trading_id);
                                return(0);
                            }
                            else
                            {
                                return(5);
                                //doesn't have the correct card
                            }
                        }
                        else
                        {
                            //can't trade with yourself
                            return(4);
                        }
                    }
                    else
                    {
                        //trade doesnt exists
                        return(3);
                    }
                }
                else
                {
                    //You dont own the card
                    return(2);
                }
            }
            else
            {
                //doesnt have session / invalid token
                return(1);
            }
        }
        public static int Configure_Deck(string i_username, List <string> cards_id)
        {
            if (DBManagment.has_session(i_username))
            {
                Stack <int> has_added_deck = new Stack <int>()
                {
                };                                                 //here it will store the return value of each card from the method has_specific card to see if the player has the card
                if (cards_id.Count == 4)
                {
                    foreach (string card in cards_id)
                    {
                        has_added_deck.Push(DBManagment.Has_Specific_Card(i_username, card));
                    }

                    if (!has_added_deck.Contains(0))
                    {
                        if (!Has_Deck(i_username)) // if he doesn't have a deck, just inserting the 4 cards in the deck
                        {
                            foreach (string card in cards_id)
                            {
                                using var con = new NpgsqlConnection(DBManagment.cs);
                                con.Open();
                                var sql_insert = "Insert into deck (card_id, username) values (@card_id, @username)";
                                using var cmd = new NpgsqlCommand(sql_insert, con);
                                //prepared statment
                                cmd.Parameters.AddWithValue("card_id", card);
                                cmd.Parameters.AddWithValue("username", i_username);
                                cmd.Prepare();
                                //
                                cmd.ExecuteNonQuery();
                                con.Close();
                            }

                            return(0);
                        }
                        else  // if he has a deck, the old one is getting deleted and the new ones are getting inserted
                        {
                            //Delete the old cards
                            using var con = new NpgsqlConnection(DBManagment.cs);
                            con.Open();
                            var sql_delete = "delete from deck where username = @username";
                            using var cmd2 = new NpgsqlCommand(sql_delete, con);
                            //prepared statment
                            cmd2.Parameters.AddWithValue("username", i_username);
                            cmd2.Prepare();
                            //
                            cmd2.ExecuteNonQuery();
                            con.Close();
                            //////////////////////////
                            //insert the new cards
                            foreach (string card in cards_id)
                            {
                                using var con2 = new NpgsqlConnection(DBManagment.cs);
                                con.Open();
                                var sql_insert2 = "Insert into deck (card_id, username) values (@card_id, @username)";
                                using var cmd3 = new NpgsqlCommand(sql_insert2, con);
                                //prepared statment
                                cmd3.Parameters.AddWithValue("card_id", card);
                                cmd3.Parameters.AddWithValue("username", i_username);
                                cmd3.Prepare();
                                //
                                cmd3.ExecuteNonQuery();
                                con.Close();
                            }
                            return(0);
                        }
                    }
                    else
                    {
                        //one or more cards is not obtained by the user
                        return(3);
                    }
                }
                else
                {
                    //must be 4 Cards to create or replace deck!
                    return(2);
                }
            }
            else
            {
                // NO session / invalid Token
                return(1);
            }
        }