public IActionResult Galeria(int page = 1, int id = 4)
        {
            var pagination = new PagingInfoFotografias
            {
                CurrentPage = page,
                PageSize    = PagingInfoFotografias.TAM_PAGINA,
                TotalItems  = _context.Fotografia
                              .Where(p => p.MiradouroId == id).Count()
            };

            return(View(
                       new ListaFotografias
            {
                Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                              .OrderBy(p => p.Classificacao)
                              .Where(p => p.MiradouroId == id)
                              .Where(p => p.Aprovada)
                              .Skip((page - 1) * pagination.PageSize)
                              .Take(pagination.PageSize),
                pagination = pagination
            }
                       ));
        }
        public async Task <IActionResult> Apagar(int?id, int page = 1)
        {
            var fotografia = await _context.Fotografia.FindAsync(id);

            _context.Fotografia.Remove(fotografia);
            await _context.SaveChangesAsync();

            // todo: informar o utilizador que a foto foi apagada com sucesso
            if (page == 0)
            {
                page = 1;
                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = page,
                    PageSize    = PagingInfoFotografias.TAM_PAGINA,
                    TotalItems  = _context.Fotografia.Count()
                };

                return(View(
                           new ListaFotografias
                {
                    Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                  .OrderBy(p => p.FotografiaId)
                                  .Skip((page - 1) * pagination.PageSize)
                                  .Take(pagination.PageSize),
                    pagination = pagination
                }
                           ));
            }

            if (auxaprovacao == 1)
            {
                int tamanho    = PagingInfoFotografias.TAM_PAGINA;
                int totalitems = _context.Fotografia.Count();
                int paginaatual;
                if ((int)Math.Ceiling((double)totalitems / tamanho) < page)
                {
                    paginaatual = page - 1;
                }
                else
                {
                    paginaatual = page;
                }

                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = paginaatual,
                    PageSize    = tamanho,
                    TotalItems  = totalitems
                };

                if (auxdirecaoordena == 1)
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderBy(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
                else
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderByDescending(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
            }
            else
            {
                bool auxaprovado;
                if (auxaprovacao == 2)
                {
                    auxaprovado = true;
                }
                else
                {
                    auxaprovado = false;
                }

                int tamanho    = PagingInfoFotografias.TAM_PAGINA;
                int totalitems = _context.Fotografia
                                 .Where(p => p.Aprovada == auxaprovado)
                                 .Count();
                int paginaatual;
                if ((int)Math.Ceiling((double)totalitems / tamanho) < page)
                {
                    paginaatual = page - 1;
                }
                else
                {
                    paginaatual = page;
                }

                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = paginaatual,
                    PageSize    = tamanho,
                    TotalItems  = totalitems
                };

                if (auxdirecaoordena == 1)
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderBy(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
                else
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderByDescending(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
            }
            //return RedirectToAction(nameof(Index));
        }
        public async Task <IActionResult> Aprova(int?id, int page = 1)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var fotografia = await _context.Fotografia.FindAsync(id);

            if (fotografia == null)
            {
                // todo: talvez alguem tenha apagado essa Hora. " mostrar uma mensagem apropriada ao utilizador"
                return(NotFound());
            }

            fotografia.Aprovada = !fotografia.Aprovada;

            try
            {
                _context.Update(fotografia);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!FotografiaExists(fotografia.FotografiaId))
                {
                    // todo: talvez alguem apagou essa Foto
                    // pergunta ao utilizador se quer criar um novo com os mesmos dados
                    return(NotFound());
                }
                else
                {
                    // todo: mostrar o erro e perguntar se quer tentar outra vez
                    throw;
                }
            }

            //return RedirectToAction(nameof(Index(0,"0",0,0)));
            if (auxaprovacao == 1)
            {
                int tamanho    = PagingInfoFotografias.TAM_PAGINA;
                int totalitems = _context.Fotografia.Count();
                int paginaatual;
                if ((int)Math.Ceiling((double)totalitems / tamanho) < page)
                {
                    paginaatual = page - 1;
                }
                else
                {
                    paginaatual = page;
                }

                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = paginaatual,
                    PageSize    = tamanho,
                    TotalItems  = totalitems
                };

                if (auxdirecaoordena == 1)
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderBy(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
                else
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderByDescending(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
            }
            else
            {
                bool auxaprovado;
                if (auxaprovacao == 2)
                {
                    auxaprovado = true;
                }
                else
                {
                    auxaprovado = false;
                }

                int tamanho    = PagingInfoFotografias.TAM_PAGINA;
                int totalitems = _context.Fotografia
                                 .Where(p => p.Aprovada == auxaprovado)
                                 .Count();
                int paginaatual;
                if ((int)Math.Ceiling((double)totalitems / tamanho) < page)
                {
                    paginaatual = page - 1;
                }
                else
                {
                    paginaatual = page;
                }

                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = paginaatual,
                    PageSize    = tamanho,
                    TotalItems  = totalitems
                };

                if (auxdirecaoordena == 1)
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderBy(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
                else
                {
                    return(View("Index",
                                new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderByDescending(p => EF.Property <Object>(p, auxordenar))
                                      .Skip((paginaatual - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination
                    }
                                ));
                }
            }

            /*ViewData["EstacaoAnoId"] = new SelectList(_context.EstacaoAno, "EstacaoAnoId", "Nome_estacao", fotografia.EstacaoAnoId);
             * ViewData["MiradouroId"] = new SelectList(_context.Miradouro, "MiradouroId", "Nome", fotografia.MiradouroId);
             * ViewData["PessoaId"] = new SelectList(_context.Set<Pessoa>(), "PessoaId", "Nome", fotografia.PessoaId);
             * ViewData["TipoImagemId"] = new SelectList(_context.TipoImagem, "TipoImagemId", "Descricao", fotografia.TipoImagemId);
             */
        }
        // GET: Fotografias
        public async Task <IActionResult> Index(int page = 1, string ordenacao = "FotografiaId", int direcaoordena = 1, int aprovacao = 1)
        {
            if (page == 0)
            {
                page = auxpage;
            }
            else
            {
                auxpage = page;
            }

            if (direcaoordena == 0)
            {
                direcaoordena = auxdirecaoordena;
            }
            else
            {
                auxdirecaoordena = direcaoordena;
            }

            if (aprovacao == 0)
            {
                aprovacao = auxaprovacao;
            }
            else
            {
                auxaprovacao = aprovacao;
            }

            if (ordenacao == "0" || ordenacao == "")
            {
                ordenacao = auxordenar;
            }
            else
            {
                auxordenar = ordenacao;
            }

            if (aprovacao == 1)
            {
                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = page,
                    PageSize    = PagingInfoFotografias.TAM_PAGINA,
                    TotalItems  = _context.Fotografia.Count()
                };

                if (direcaoordena == 1)
                {
                    return(View(
                               new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderBy(p => EF.Property <Object>(p, ordenacao))
                                      .Skip((page - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination,
                        aprovacao = aprovacao,
                        direcaoordena = direcaoordena,
                        ordenacao = ordenacao
                    }
                               ));
                }
                else
                {
                    return(View(
                               new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .OrderByDescending(p => EF.Property <Object>(p, ordenacao))
                                      .Skip((page - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination,
                        aprovacao = aprovacao,
                        direcaoordena = direcaoordena,
                        ordenacao = ordenacao
                    }
                               ));
                }
            }
            else
            {
                bool auxaprovado;
                if (aprovacao == 2)
                {
                    auxaprovado = true;
                }
                else
                {
                    auxaprovado = false;
                }

                var pagination = new PagingInfoFotografias
                {
                    CurrentPage = page,
                    PageSize    = PagingInfoFotografias.TAM_PAGINA,
                    TotalItems  = _context.Fotografia
                                  .Where(p => p.Aprovada == auxaprovado)
                                  .Count()
                };

                if (direcaoordena == 1)
                {
                    return(View(
                               new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderBy(p => EF.Property <Object>(p, ordenacao))
                                      .Skip((page - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination,
                        aprovacao = aprovacao,
                        direcaoordena = direcaoordena,
                        ordenacao = ordenacao
                    }
                               ));
                }
                else
                {
                    return(View(
                               new ListaFotografias
                    {
                        Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                      .Where(p => p.Aprovada == auxaprovado)
                                      .OrderByDescending(p => EF.Property <Object>(p, ordenacao))
                                      .Skip((page - 1) * pagination.PageSize)
                                      .Take(pagination.PageSize),
                        pagination = pagination,
                        aprovacao = aprovacao,
                        direcaoordena = direcaoordena,
                        ordenacao = ordenacao
                    }
                               ));
                }
            }

            /*var guardaCulturaContext = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem);
             * return View(await guardaCulturaContext.ToListAsync());*/
        }
        public async Task <IActionResult> Votar(int page = 1, int fotoId = 4, string classificacao = "")
        {
            int classFoto = 0;

            var pagination = new PagingInfoFotografias
            {
                CurrentPage = page,
                PageSize    = PagingInfoFotografias.TAM_PAGINA,
                TotalItems  = _context.Fotografia
                              .Where(p => p.MiradouroId == fotoId).Count()
            };

            try
            {
                classFoto = Int32.Parse(classificacao);
            }
            catch
            {
                ModelState.AddModelError("Longitude_DD", "As coordenadas não são validas, insira apenas valores numericos!");

                return(View("Galeria",
                            new ListaFotografias
                {
                    Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                                  .OrderByDescending(p => p.Classificacao)
                                  .Where(p => p.MiradouroId == fotoId)
                                  .Where(p => p.Aprovada)
                                  .Skip((page - 1) * pagination.PageSize)
                                  .Take(pagination.PageSize),
                    pagination = pagination
                }
                            ));
            }

            Fotografia foto = await _context.Fotografia.FindAsync(fotoId);

            float classFotoAntiga   = foto.Classificacao;
            int   nVotos            = foto.N_Votos;
            float novaclassificacao = 0;
            int   miradouro_id      = foto.MiradouroId;

            novaclassificacao  = (classFotoAntiga * nVotos + classFoto) / (nVotos + 1);
            foto.Classificacao = novaclassificacao;
            foto.N_Votos       = nVotos + 1;

            _context.Update(foto);
            await _context.SaveChangesAsync();

            return(View("Galeria",
                        new ListaFotografias
            {
                Fotografias = _context.Fotografia.Include(f => f.EstacaoAno).Include(f => f.Miradouro).Include(f => f.Pessoa).Include(f => f.TipoImagem)
                              .OrderByDescending(p => p.Classificacao)
                              .Where(p => p.MiradouroId == miradouro_id)
                              .Where(p => p.Aprovada)
                              .Skip((page - 1) * pagination.PageSize)
                              .Take(pagination.PageSize),
                pagination = pagination
            }
                        ));
        }