public async Task <IActionResult> Editar(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            // registo do trilho seleccionado
            Trilho trilho = await _context.Trilhos.SingleOrDefaultAsync(m => m.TrilhoID == id);

            // registo do ultimo EstadoTrilho do trilho seleccionado
            EstadoTrilho ultimoEstadoTrilho = await _context.EstadoTrilhos.SingleOrDefaultAsync(uet => uet.TrilhoID == id &&
                                                                                                uet.DataFim == null);

            //
            if (ultimoEstadoTrilho == null)
            {
                return(NotFound("GET: ultimoEstadoTrilho == null"));
            }

            //
            if (trilho == null)
            {
                return(NotFound("GET: trilho == null"));
            }
            // ViewModel com dados para exibir
            ViewModelTrilho VMTrilho = new ViewModelTrilho
            {
                TrilhoID        = trilho.TrilhoID,
                TrilhoNome      = trilho.Nome,
                TrilhoInicio    = trilho.Inicio,
                TrilhoFim       = trilho.Fim,
                TrilhoDistancia = trilho.Distancia,
                //TrilhoFoto = trilho.Foto,
                TrilhoFoto       = trilho.Foto,
                TrilhoDesativado = trilho.Desativado,
                TrilhoDetalhes   = trilho.Detalhes,
                TrilhoSumario    = trilho.Sumario,
                DificuldadeID    = trilho.DificuldadeID,
                // fica com o Id do ultimo estado inserido para mostrar na view:GET
                EstadoID = ultimoEstadoTrilho.EstadoID
            };

            // passar campos pretendidos (Trilho, Dificuldade e Estado) para a view
            ViewData["DificuldadeID"] = new SelectList(_context.Dificuldades, "DificuldadeID", "Nome", VMTrilho.DificuldadeID);
            ViewData["EstadoID"]      = new SelectList(_context.Estados, "EstadoID", "Nome", VMTrilho.EstadoID);
            return(View(VMTrilho));
        }
        public async Task <IActionResult> Editar(int id, [Bind("TrilhoID,TrilhoNome,TrilhoInicio,TrilhoFim,TrilhoDetalhes," +
                                                               "TrilhoSumario,TrilhoDistancia,TrilhoFoto,TrilhoDesativado,DificuldadeID,EstadoID,TrilhoImagem,ImageFile")] ViewModelTrilho VMTrilho)
        {
            // crio novo trilho a partir dos valores introduzidos no form (ver Bind)
            Trilho trilho = new Trilho
            {
                TrilhoID  = VMTrilho.TrilhoID,
                Nome      = VMTrilho.TrilhoNome,
                Inicio    = VMTrilho.TrilhoInicio,
                Fim       = VMTrilho.TrilhoFim,
                Distancia = VMTrilho.TrilhoDistancia,
                //Foto = VMTrilho.TrilhoFoto,
                Foto          = VMTrilho.TrilhoFoto,
                Desativado    = VMTrilho.TrilhoDesativado,
                Detalhes      = VMTrilho.TrilhoDetalhes,
                Sumario       = VMTrilho.TrilhoSumario,
                DificuldadeID = VMTrilho.DificuldadeID
            };

            if (VMTrilho.ImageFile != null)
            {
                // upload de imagem
                // nota: criado controlador UploadFiles, ver mudanças em ViewModelTrilho e Trilho.cs
                using (var memoryStream = new MemoryStream())
                {
                    await VMTrilho.ImageFile.CopyToAsync(memoryStream);

                    trilho.Foto = memoryStream.ToArray();
                }
            }

            // registo do ultimo EstadoTrilho do trilho seleccionado
            EstadoTrilho ultimoEstadoTrilho = await _context.EstadoTrilhos.SingleOrDefaultAsync(uet => uet.TrilhoID == id &&
                                                                                                uet.DataFim == null);

            //
            if (ultimoEstadoTrilho == null)
            {
                return(NotFound("POST: ultimoEstadoTrilho = NULL"));
            }

            // EstadoTrilho a inserir (se novo Estado)
            EstadoTrilho novoEstadoTrilho = new EstadoTrilho
            {
                Trilho     = trilho,
                EstadoID   = VMTrilho.EstadoID,
                DataInicio = DateTime.Now
            };

            if (id != trilho.TrilhoID)
            {
                return(NotFound("POST: TrilhoID NotFound"));
            }

            if (ModelState.IsValid)
            {
                try
                {
                    // Update dbo.trilhos
                    _context.Update(trilho);

                    // Update + insert dbo.EstadoTrilhos
                    if (ultimoEstadoTrilho.EstadoID != VMTrilho.EstadoID)
                    {
                        ultimoEstadoTrilho.DataFim = DateTime.Now;
                        _context.Update(ultimoEstadoTrilho);
                        _context.Add(novoEstadoTrilho);

                        //return NotFound("POST: VMTrilho.EstadoIdAnterior != VMTrilho.EstadoID");
                    }

                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TrilhoExists(trilho.TrilhoID))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction("Index"));
            }
            // se modelo inválido fica na mma view com os dados introduzidos no form
            ViewData["DificuldadeID"] = new SelectList(_context.Dificuldades, "DificuldadeID", "Nome", VMTrilho.DificuldadeID);
            ViewData["EstadoID"]      = new SelectList(_context.Estados, "EstadoID", "Nome", VMTrilho.EstadoID);
            return(View(VMTrilho));
        }
        public async Task <IActionResult> Criar([Bind("TrilhoID,TrilhoNome,TrilhoInicio,TrilhoFim,TrilhoDetalhes,TrilhoSumario," +
                                                      "TrilhoDistancia,TrilhoFoto, TrilhoDesativado,DificuldadeID,EstadoID,ImageFile")] ViewModelTrilho trilhoVM)
        {
            // Colocar registos da dbo.Trilhos numa lista
            var trilhos = _context.Trilhos
                          .Include(t => t.Dificuldade);

            ListaTrilhosBD = trilhos.ToListAsync().Result;

            // se existir um trilho com o mesmo Nome, mostra msg ErroNomeTrilho e reinsere dados introduzidos na mma View
            // ** fazer com query á B.D. (se houver tempo)
            foreach (var et in ListaTrilhosBD)
            {
                if (et.Nome.Equals(trilhoVM.TrilhoNome))
                {
                    ViewData["ErroNomeTrilho"] = "*Já existe um trilho com esse nome!";
                    ViewData["DificuldadeID"]  = new SelectList(_context.Dificuldades, "DificuldadeID", "Nome", trilhoVM.DificuldadeID);
                    ViewData["EstadoID"]       = new SelectList(_context.Estados, "EstadoID", "Nome", trilhoVM.EstadoID);
                    return(View(trilhoVM));
                }
            }

            if (ModelState.IsValid)
            {
                // crio novo trilho a partir dos valores introduzidos no form (ver Bind)
                Trilho trilho = new Trilho
                {
                    Nome      = trilhoVM.TrilhoNome,
                    Inicio    = trilhoVM.TrilhoInicio,
                    Fim       = trilhoVM.TrilhoFim,
                    Distancia = trilhoVM.TrilhoDistancia,
                    //Foto = trilhoVM.TrilhoFoto,
                    Desativado    = trilhoVM.TrilhoDesativado,
                    Detalhes      = trilhoVM.TrilhoDetalhes,
                    Sumario       = trilhoVM.TrilhoSumario,
                    DificuldadeID = trilhoVM.DificuldadeID
                };

                if (trilhoVM.ImageFile != null)
                {
                    // upload de imagem
                    // nota: criado controlador UploadFiles, ver mudanças em ViewModelTrilho e Trilho.cs
                    using (var memoryStream = new MemoryStream())
                    {
                        await trilhoVM.ImageFile.CopyToAsync(memoryStream);

                        trilho.Foto = memoryStream.ToArray();
                    }
                }

                // coloco trilho na tabela dbo.Trilhos
                _context.Add(trilho);

                EstadoTrilho estadoTrilho = new EstadoTrilho
                {
                    Trilho     = trilho,
                    EstadoID   = trilhoVM.EstadoID,
                    DataInicio = DateTime.Now
                };

                // coloco estadoTrilho na tabela dbo.EstadoTrilhos
                _context.Add(estadoTrilho);
                await _context.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            // se modelo inválido fica na mma view com os dados introduzidos no form
            ViewData["DificuldadeID"] = new SelectList(_context.Dificuldades, "DificuldadeID", "Nome", trilhoVM.DificuldadeID);
            ViewData["EstadoID"]      = new SelectList(_context.Estados, "EstadoID", "Nome", trilhoVM.EstadoID);
            return(View(trilhoVM));
        }