//
        // Aceitar um pedido de amizade
        //
        public static bool AceitarPedido(string username1, string username2, int forca, string tag)
        {
            Ligacao ligacao = AddLigacao(username1, username2, tag, forca);

            if (ligacao != null)
            {
                ligacao.Estado = 1;
                ligacao.Save();

                var x = new IA_AR.Utils();

                ligacao = Ligacao.LoadByUserNames(username2, username1);
                if (ligacao != null)
                {
                    ligacao.Estado = 1;
                    ligacao.Save();

                    x.insertLig(username1.ToLower(), username2.ToLower(), forca);
                    x.insertLig(username2.ToLower(), username1.ToLower(), ligacao.ForcaDeLigacao);

                    return(true);
                }
                return(false);
            }
            return(false);
        }
        public static IList <User> LoadAllPedidosUser(string username)
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao WHERE UserId ='"
                                      + LoadByUserName(username).UniqueIdentifierUserId + "' AND ELIMINADO ='" + 0 + "' AND ESTADO ='"
                                      + 0 + "'");

            IList <Ligacao> lista = new List <Ligacao>();

            Ligacao ligacao   = null;
            int     idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                ligacao = new Ligacao(row);
                lista.Add(ligacao);

                idLigacao = (int)row["ID_LIG"];
            }

            IList <User> pedidos = new List <User>();

            foreach (Ligacao lig in lista)
            {
                if (lig.Estado == 0 && lig.ForcaDeLigacao == -1)
                {
                    pedidos.Add(User.LoadByUserLigadoId(lig.IdUserLigado));
                }
            }

            return(pedidos);
        }
        //
        // Mudar Forca de uma Relação
        //
        public static bool MudarTagRelacao(string username1, string username2, int forca)
        {
            Ligacao ligacao = Ligacao.LoadByUserNames(username1, username2);

            if (ligacao != null && forca < 6 && forca > 0)
            {
                ligacao.ForcaDeLigacao = forca;

                return(true);
            }

            return(false);
        }
        //
        // Mudar Tag de uma Relação
        //
        public static bool MudarTagRelacao(string username1, string username2, string tagS)
        {
            Ligacao ligacao = Ligacao.LoadByUserNames(username1, username2);

            if (ligacao != null)
            {
                Tag tag = Tag.LoadTagByNome(tagS);

                if (tag != null)
                {
                    ligacao.IdTagRelacao = tag.ID;

                    return(true);
                }
            }

            return(false);
        }
        //
        // Rejeitar um pedido de amizade
        //
        public static bool RejeitarPedido(string username1, string username2)
        {
            Ligacao ligacao = AddLigacao(username1, username2, "", -1);

            if (ligacao != null)
            {
                ligacao.Estado = -1;
                ligacao.Save();

                ligacao = Ligacao.LoadByUserNames(username2, username1);
                if (ligacao != null)
                {
                    ligacao.Estado = -1;
                    ligacao.Save();
                    return(true);
                }
                return(false);
            }
            return(false);
        }
        // Load de todas as entradas na Tabela Ligacao
        //
        // Retorna uma IList com elementos ou vazia, se não existir nenhuma Ligacao

        public static IList <Ligacao> LoadAll()
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao ELIMINADO ='" + 0 + "'");

            IList <Ligacao> lista = new List <Ligacao>();

            Ligacao ligacao   = null;
            int     idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                if ((int)row["ID_LIG"] != idLigacao)
                {
                    ligacao = new Ligacao(row);
                    lista.Add(ligacao);

                    idLigacao = (int)row["ID_LIG"];
                }
            }

            return(lista);
        }
        //
        //
        // Pedidos de amizade ( Ligações estado = 0 ) por username
        //
        public static bool PedidoAmizade(string username1, string username2, int forca, string tag)
        {
            Ligacao ligacao = AddLigacao(username1, username2, tag, forca);

            if (ligacao != null)
            {
                ligacao.Estado = 0;
                ligacao.Save();

                ligacao = AddLigacao(username2, username1, "", -1);

                if (ligacao != null)
                {
                    ligacao.Estado = 0;
                    ligacao.Save();
                    return(true);
                }
                return(false);
            }

            return(false);
        }
        // Load de ligações de um User dono por Username

        public static IList <Ligacao> LoadAllByUserName(string username)
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao WHERE UserId ='"
                                      + User.LoadByUserName(username).UniqueIdentifierUserId + "' AND ELIMINADO ='" + 0 + "'");

            IList <Ligacao> lista = new List <Ligacao>();

            Ligacao ligacao   = null;
            int     idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                if ((int)row["ID_LIG"] != idLigacao)
                {
                    ligacao = new Ligacao(row);
                    lista.Add(ligacao);

                    idLigacao = (int)row["ID_LIG"];
                }
            }

            return(lista);
        }
        // Metodos
        //
        //
        // Adicionar ligação através de dois Usernames e um nome de Tag
        public static Ligacao AddLigacao(string username1, string username2, string tagS, int forca)
        {
            Ligacao ligacao = Ligacao.LoadByUserNames(username1, username2);
            Tag     tag     = Tag.LoadTagRelacaoByNome(tagS);

            if (ligacao == null)
            {
                if (tag != null)
                {
                    ligacao = new Ligacao(User.LoadByUserName(username1).UniqueIdentifierUserId,
                                          User.LoadByUserName(username2).IdUserLigado,
                                          forca,
                                          tag.ID);
                }
                else
                {
                    ligacao = new Ligacao(User.LoadByUserName(username1).UniqueIdentifierUserId,
                                          User.LoadByUserName(username2).IdUserLigado,
                                          forca,
                                          -1);
                }
            }
            else
            {
                if (tag == null)
                {
                    ligacao.IdTagRelacao = -1;
                }
                else
                {
                    ligacao.IdTagRelacao = tag.ID;
                }
                ligacao.ForcaDeLigacao = forca;
            }
            return(ligacao);
        }
        // Delete
        //
        //
        // Se retirarmos um user temos que remover primeiro a UserLigado e depois das tabelas do Membership
        //
        // Para remover do Membership existe um método próprio, por isso não temos que eliminar aqui
        //      Membership.DeleteUser
        //
        public bool Delete()
        {
            SqlCommand sql = new SqlCommand();

            if (IdUserLigado != -1)
            {
                BeginTransaction();

                sql.CommandText = "UPDATE FROM UserLigado SET ELIMINADO=@ELIMINADO WHERE ID_ULIG=@ID_ULIG";

                sql.Transaction = CurrentTransaction;

                IDataParameter param = sql.Parameters.Add("@ID_ULIG", SqlDbType.Int);
                param.Value = IdUserLigado;

                param       = sql.Parameters.Add("@ELIMINADO", SqlDbType.Int);
                param.Value = 1;

                Eliminado = true;

                int rowsAfectadas = ExecuteTransactedNonQuery(sql);



                // Através do rowsAfectadas conseguiremos saber se foi gravado ou não

                if (rowsAfectadas == 0)
                {
                    CommitTransaction();
                    return(false);
                }

                // Para remover um User temos que remover as ligações do mesmo e em que ele está presente

                // Ligações em que ele é User dono
                IList <Ligacao> lista = Ligacao.LoadAllByUserId(UniqueIdentifierUserId);

                bool delete = false;

                foreach (Ligacao ligacao in lista)
                {
                    delete = ligacao.Delete();
                    if (!delete)
                    {
                        return(false);
                    }
                }


                // Ligações em que ele é o UserLigado
                lista = Ligacao.LoadAllByUserLigadoId(IdUserLigado);


                delete = false;

                foreach (Ligacao ligacao in lista)
                {
                    delete = ligacao.Delete();
                    if (!delete)
                    {
                        return(false);
                    }
                }

                return(true);
            }

            return(false);
        }
        // Load de ligações de um User dono por Username
        public static IList<Ligacao> LoadAllByUserName(string username)
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao WHERE UserId ='"
                +User.LoadByUserName(username).UniqueIdentifierUserId + "' AND ELIMINADO ='" + 0 + "'");

            IList<Ligacao> lista = new List<Ligacao>();

            Ligacao ligacao = null;
            int idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                if ((int)row["ID_LIG"] != idLigacao)
                {
                    ligacao = new Ligacao(row);
                    lista.Add(ligacao);

                    idLigacao = (int)row["ID_LIG"];
                }
            }

            return lista;
        }
        //
        //
        // Load de ligações de um User Ligado por IdUserLigado
        public static IList<Ligacao> LoadAllByUserLigadoId(int IdUserLigado)
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao WHERE ID_ULIG ='"
                + IdUserLigado + "' AND ELIMINADO ='" + 0 + "'");

            IList<Ligacao> lista = new List<Ligacao>();

            Ligacao ligacao = null;
            int idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                if ((int)row["ID_LIG"] != idLigacao)
                {
                    ligacao = new Ligacao(row);
                    lista.Add(ligacao);

                    idLigacao = (int)row["ID_LIG"];
                }
            }

            return lista;
        }
        // Metodos
        //
        //
        // Adicionar ligação através de dois Usernames e um nome de Tag
        public static Ligacao AddLigacao(string username1, string username2, string tagS, int forca)
        {
            Ligacao ligacao = Ligacao.LoadByUserNames(username1,username2);
            Tag tag = Tag.LoadTagRelacaoByNome(tagS);

            if(ligacao == null){

                if(tag != null)
                    ligacao = new Ligacao(User.LoadByUserName(username1).UniqueIdentifierUserId,
                        User.LoadByUserName(username2).IdUserLigado,
                        forca,
                        tag.ID);
                else
                {
                    ligacao = new Ligacao(User.LoadByUserName(username1).UniqueIdentifierUserId,
                        User.LoadByUserName(username2).IdUserLigado,
                        forca,
                        -1);
                }

            }
            else{
                if(tag == null){
                    ligacao.IdTagRelacao = -1;
                }
                else{
                    ligacao.IdTagRelacao = tag.ID;
                }
                ligacao.ForcaDeLigacao = forca;

            }
            return ligacao;
        }
        public static IList<User> LoadAllPedidosUser(string username)
        {
            DataSet ds = ExecuteQuery(GetConnection(false), "SELECT * FROM Ligacao WHERE UserId ='"
                + LoadByUserName(username).UniqueIdentifierUserId + "' AND ELIMINADO ='" + 0 + "' AND ESTADO ='"
                + 0 + "'");

            IList<Ligacao> lista = new List<Ligacao>();

            Ligacao ligacao = null;
            int idLigacao = -1;

            foreach (DataRow row in ds.Tables[0].Rows)
            {

                ligacao = new Ligacao(row);
                lista.Add(ligacao);

                idLigacao = (int)row["ID_LIG"];
            }

            IList<User> pedidos = new List<User>();

            foreach (Ligacao lig in lista)
            {
                if(lig.Estado==0 && lig.ForcaDeLigacao==-1)
                    pedidos.Add(User.LoadByUserLigadoId(lig.IdUserLigado));
            }

            return pedidos;
        }