public List<TabHistorico> RankingExemplares()
        {
            List<TabHistorico> exRank = new List<TabHistorico>();

            var teste = (from p in db.TabHistorico
                         where p.dsStatus == 5
                         group p by p.fkIdExemplar into g
                         select new { fkIdExemplar = g.Key, Quantidade = g.Count() }
                        ).OrderByDescending(c => c.Quantidade);
            var count = 1;
            foreach (var registro in teste)
            {
                TabHistorico exemplar = new TabHistorico();
                TabExemplar tbex = new TabExemplar();
                TabTitulo tbTit = new TabTitulo();
                tbex = db.TabExemplar.Where(model => model.idExemplar == registro.fkIdExemplar).FirstOrDefault();
                tbTit = db.TabTitulo.Where(model => model.idTitulo == tbex.fkIdTitulo).FirstOrDefault();

                tbex.TabTitulo = tbTit;
                exemplar.idHistorico = count;
                count++;
                exemplar.fkIdExemplar = registro.fkIdExemplar;
                exemplar.dsStatus = registro.Quantidade;
                exemplar.TabExemplar = tbex;
                exRank.Add(exemplar);
            }
            return exRank;
        }
        public Tuple<bool, string> Doar(string email, string login, int idExemplar, int idDoador)
        {
            var receptor = db.TabLeitor.Where(model => model.dsLogin.ToLower() == login.ToLower() && model.dsEmail.ToLower() == email.ToLower()).FirstOrDefault();
            var doador = db.TabLeitor.Where(model => model.idLeitor == idDoador).FirstOrDefault();
            var exemplar = db.TabExemplar.Where(model => model.idExemplar == idExemplar).FirstOrDefault();

            //Verifica se o leitor digitou um login ou email desconhecidos ou de um leitor que está inativo
            if (receptor == null || receptor.dsStatus == (int)EnumStatusLeitor.INATIVO)
            {
                return new Tuple<bool, string>(false, "Leitor não encontrado");
            }

            if (receptor.dsLogin.Equals(doador.dsLogin) && receptor.dsEmail.Equals(doador.dsEmail))
            {
                return new Tuple<bool, string>(false, "Não é possível doar para si mesmo");
            }

            TabHistorico historico = new TabHistorico()
            {
                fkIdExemplar = idExemplar,
                fkIdLeitor = idDoador,
                fkIdReceptor = receptor.idLeitor,
                dtHistorico = DateTime.Now,
                dsStatus = (int)EnumStatusHistorico.PENDENTE
            };

            exemplar.dsStatus = (int)StatusRegistroExemplar.INDISPONIVEL;

            db.TabHistorico.Add(historico);
            db.SaveChanges();

            return new Tuple<bool, string>(true, "Notificação enviada com sucesso");
        }
        public List<TabHistorico> RankingLeitores(long idLeitor)
        {
            List<TabHistorico> ltrRank = new List<TabHistorico>();

            var teste = (from p in db.TabHistorico
                         where p.dsStatus == 3
                         group p by p.fkIdLeitor into g
                         select new { fkIdLeitor = g.Key, Quantidade = g.Count() }
                        ).OrderByDescending(c => c.Quantidade);
            var count = 1;

            foreach (var registro in teste)
            {
                TabHistorico exemplar = new TabHistorico();

                TabLeitor tbleitor = new TabLeitor();
                tbleitor = db.TabLeitor.Where(model => model.idLeitor == registro.fkIdLeitor).FirstOrDefault();

                exemplar.idHistorico = count;
                count++;
                exemplar.fkIdLeitor = registro.fkIdLeitor;
                exemplar.dsStatus = registro.Quantidade;
                exemplar.TabLeitor = tbleitor;
                ltrRank.Add(exemplar);
            }
            var Posicao = ltrRank.Where(model => model.fkIdLeitor == idLeitor).FirstOrDefault();
            if (Posicao == null)
            {
                TabHistorico exemplar = new TabHistorico();

                TabLeitor tbleitor = new TabLeitor();
                tbleitor = db.TabLeitor.Where(model => model.idLeitor == idLeitor).FirstOrDefault();

                exemplar.idHistorico = count;
                count++;
                exemplar.fkIdLeitor = (int)idLeitor;
                exemplar.dsStatus = 0;
                exemplar.TabLeitor = tbleitor;
                ltrRank.Add(exemplar);
            }
            return ltrRank;
        }
        public string VerificaResposta(int idReceptor,int idDoador, int idExemplar, string resposta)
        {
            TabHistorico resultado = new TabHistorico();
            if (resposta.Equals("aceito"))
            {
                //registra a aceitação
                resultado.fkIdLeitor = idDoador;
                resultado.fkIdExemplar = idExemplar;
                resultado.fkIdReceptor = idReceptor;
                resultado.dsStatus = (int)EnumStatusHistorico.ACEITO;
                resultado.dtHistorico = DateTime.Now;
                db.TabHistorico.Add(resultado);
                db.SaveChanges();

                //registra a doação
                TabHistorico historico = new TabHistorico();
                historico.fkIdLeitor = idReceptor;
                historico.fkIdExemplar = idExemplar;
                historico.dsStatus = (int)EnumStatusHistorico.DOADO;
                historico.dtHistorico = DateTime.Now;
                db.TabHistorico.Add(historico);
                db.SaveChanges();
            }
            else
            {
                var exemplar = db.TabExemplar.Where(model => model.idExemplar == idExemplar).FirstOrDefault();
                //altera o status para disponível
                exemplar.dsStatus = (int)StatusRegistroExemplar.DISPONIVEL;

                //registra a aceitação
                resultado.fkIdLeitor = idDoador;
                resultado.fkIdExemplar = idExemplar;
                resultado.fkIdReceptor = idReceptor;
                resultado.dsStatus = (int)EnumStatusHistorico.RECUSADO;
                resultado.dtHistorico = DateTime.Now;
                db.TabHistorico.Add(resultado);
                db.SaveChanges();
            }

            return "Uma notificação foi enviada ao Doador";
        }
        public Tuple<TabExemplar, string> Criar(TabExemplar exemplar, string titulo,int idLeitor)
        {
            TabExemplar novoExemplar = new TabExemplar();
            TabHistorico novoHistorico = new TabHistorico();

            //Pesquisa no banco se o título informado já existe
            var _titulo = db.TabTitulo.Where(model => model.nmTitulo.ToLower() == titulo.ToLower()).FirstOrDefault();

            //Senão NÃO existir, preenche a TabTitulo e TabExemplar com as informações passada como parâmetro
            if (_titulo == null)
            {
                //Monta o objeto TabTitulo
                TabTitulo novoTitulo = new TabTitulo();
                novoTitulo.nmTitulo = titulo;
                //Adiciona o titulo no contexto do EF
                novoTitulo = db.TabTitulo.Add(novoTitulo);

                //Monta o objeto TabExemplar
                novoExemplar.nmEditora = exemplar.nmEditora;
                novoExemplar.nmAutor = exemplar.nmAutor;
                novoExemplar.dsEdicao = exemplar.dsEdicao;
                novoExemplar.fkIdTitulo = novoTitulo.idTitulo;
                novoExemplar.dsStatus = (int)StatusRegistroExemplar.DISPONIVEL;
                novoExemplar.dsObs = exemplar.dsObs;
                //Adiciona o exemplar no contexto do EF
                novoExemplar = db.TabExemplar.Add(novoExemplar);

                //Monta o objeto historico
                novoHistorico.dtHistorico = DateTime.Now;
                novoHistorico.dsStatus = (int)EnumStatusHistorico.CADASTRADO;
                novoHistorico.fkIdExemplar = novoExemplar.idExemplar;
                novoHistorico.fkIdLeitor = idLeitor;
                novoHistorico.fkIdReceptor = null;
                //Adiciona o historico no contexto do EF
                db.TabHistorico.Add(novoHistorico);

                db.SaveChanges();

            }
            //Mas se JÁ existir, preenche somente a tabela exemplar
            else
            {
                //Monta o objeto TabExemplar
                novoExemplar.nmEditora = exemplar.nmEditora;
                novoExemplar.nmAutor = exemplar.nmAutor;
                novoExemplar.dsEdicao = exemplar.dsEdicao;
                novoExemplar.fkIdTitulo = _titulo.idTitulo;
                novoExemplar.dsStatus = (int)StatusRegistroExemplar.DISPONIVEL;
                //Persiste o exemplar
                novoExemplar = db.TabExemplar.Add(novoExemplar);

                //Monta o objeto historico
                novoHistorico.dtHistorico = DateTime.Now;
                novoHistorico.dsStatus = (int)EnumStatusHistorico.CADASTRADO;
                novoHistorico.fkIdExemplar = novoExemplar.idExemplar;
                novoHistorico.fkIdLeitor = idLeitor;
                novoHistorico.fkIdReceptor = null;
                 //Adiciona o historico no contexto do EF
                db.TabHistorico.Add(novoHistorico);

                db.SaveChanges();
            }

            return new Tuple<TabExemplar, string>(novoExemplar, "Corrente iniciada !! :D");
        }