using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using PersonSport.Models;
using Microsoft.AspNetCore.Http;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Authorization;

namespace PersonSport.Controllers {

    [Authorize]
    public class PersonController : Controller {
        private const int FileNameLength = 8;

        private readonly IWebHostEnvironment Environment;

        public PersonController(IWebHostEnvironment _environment) {
            Environment = _environment;
        }

        public IActionResult Index(string sortOrder) {
            List<Person> personer = new();

            using (var db = new IdrottContext()) {
                personer = sortOrder switch {
                    "PersonId" => db.Personer.OrderBy(p => p.PersonId).ToList(),
                    "PersonNamn" => db.Personer.OrderBy(p => p.PersonNamn).ToList(),
                    "Epost" => db.Personer.OrderBy(p => p.Epost).ToList(),
                    "Alder" => db.Personer.OrderBy(p => p.Alder).ToList(),
                    "StartDatum" => db.Personer.OrderBy(p => p.StartDatum).ToList(),
                    _ => db.Personer.OrderBy(p => p.PersonId).ToList(),
                };
            }

            return View(personer);
        }

        /* *********************************************************
       * Function: Search()
       * -----------------------------------------
       * Sammanfattning: Söker i databasen efter en viss post genom
       * att söka efter namn eller e-postadress.
       * Skapar en lista av personer och sparar undan söksträngen. 
       * Populerar listan genom ett lambda-uttryck som motsvarade söksträngen. 
       * Denna lista av personer skickas slutligen till Vyn.
       * ****************************************************** */
        [HttpPost]
        public IActionResult Search(IFormCollection fc) {
            string search = fc["search"];

            List<Person> personer = new();

            using (var db = new IdrottContext()) {
                personer = db.Personer.Where(p => p.PersonNamn.ToLower().Contains(search.ToLower()) || p.Epost.ToLower().Contains(search.ToLower())).ToList();
            }

            return View(personer);
        }

        [AllowAnonymous]
        [HttpGet]
        public IActionResult Create() {
            return View();
        }

        [AllowAnonymous]
        [HttpPost]
        public IActionResult Create(IFormCollection fc) {
            Person person = new();
            try {
                person.PersonNamn = fc["PersonNamn"];
                person.Epost = fc["Epost"];
                person.Visningsbild = fc["Visningsbild"];
                person.Alder = int.Parse(fc["Alder"]);

                if (person.Visningsbild != "") {
                    person.Visningsbild = Request.Form.Files[0].FileName;
                    IFormFileCollection files = Request.Form.Files;
                    long size = files.Sum(f => f.Length);
                    string BaseURL = this.Environment.WebRootPath + @"\images\userphoto\";

                    foreach (var formFile in files) {
                        string localFileName = DateTime.UtcNow.Ticks.ToString()[FileNameLength..] + ".jpg";
                        var filePath = BaseURL + localFileName;
                        person.Visningsbild = localFileName;

                        // Kontrollerar så att den valda filen är en bildfil
                        if (formFile.ContentType == "image/jpeg" || formFile.ContentType == "image/jpg" || formFile.ContentType == "image/png" || formFile.ContentType == "image/gif") {
                            if (formFile.Length > 0) {
                                using var stream = new FileStream(filePath, FileMode.Create); formFile.CopyTo(stream);
                            }
                            else
                                ViewBag.e = "Där där bilden är 0 bytes. Måste vara lite tråkig eller?";
                        }
                        else
                            ViewBag.e = "Det där var ingen bildfil";
                    }
                }
                else
                    person.Visningsbild = "noimage.jpg";
                if (ModelState.IsValid) {
                    person.StartDatum = DateTime.Now;
                    using (var db = new IdrottContext()) {
                        db.Add(person);
                        db.SaveChanges();
                    }
                    TempData["MeddelandeSuccess"] = "Medlemmen är tillagd i systemet.";
                    return RedirectToAction("Index", "Start");
                }
            }
            catch (Exception) {
                throw;
            }
            TempData["MeddelandeFail"] = "Kunde inte lägga till personen.";
            return NotFound();
        }


        public IActionResult Delete(int id) {
            try {
                var person = new Person() { PersonId = id };

                using (var db = new IdrottContext()) {
                    db.Attach(person);
                    db.Remove(person);
                    db.SaveChanges();
                }
                TempData["MeddelandeSuccess"] = "Medlemmen är borttagen ur systemet.";
                return RedirectToAction(nameof(Index));
            }
            catch (Exception) {
                TempData["MeddelandeFail"] = "Kunde inte ta bort personen.";
                throw;
            }
        }

        [HttpGet]
        public IActionResult Edit(int id) {
            Person p = new();
            try {
                using (var db = new IdrottContext()) {
                    var person = db.Personer.Where(p => p.PersonId == id).FirstOrDefault();
                    p.PersonId = person.PersonId;
                    p.PersonNamn = person.PersonNamn;
                    p.Epost = person.Epost;
                    p.Alder = person.Alder;
                    p.Visningsbild = person.Visningsbild;

                    db.SaveChanges();
                }
                return View(p);
            }
            catch (Exception) {
                throw;
            }
        }

        [HttpPost]
        public IActionResult Edit(IFormCollection fc) {
            Person person = new();
            bool bytaBild = false;

            try {
                person.PersonId = int.Parse(fc["PersonId"]);
                person.PersonNamn = fc["PersonNamn"];
                person.Epost = fc["Epost"];
                person.Visningsbild = fc["Visningsbild"];
                person.Alder = int.Parse(fc["Alder"]);

                if (person.Visningsbild == "")
                    bytaBild = false;
                else
                    bytaBild = true;

                if (bytaBild) {
                    person.Visningsbild = Request.Form.Files[0].FileName;
                    IFormFileCollection files = Request.Form.Files;
                    long size = files.Sum(f => f.Length);
                    string BaseURL = this.Environment.WebRootPath + @"\images\userphoto\";

                    foreach (var formFile in files) {
                        string localFileName = DateTime.UtcNow.Ticks.ToString()[FileNameLength..] + ".jpg";
                        var filePath = BaseURL + localFileName;
                        person.Visningsbild = localFileName;

                        // Kontrollerar så att den valda filen är en bildfil
                        if (formFile.ContentType == "image/jpeg" || formFile.ContentType == "image/jpg" || formFile.ContentType == "image/png" || formFile.ContentType == "image/gif") {
                            if (formFile.Length > 0) {
                                using var stream = new FileStream(filePath, FileMode.Create); 
                                formFile.CopyTo(stream);
                            }
                            else
                                ViewBag.e = "Där där bilden är 0 bytes. Måste vara lite tråkig eller?";
                        }
                        else
                            ViewBag.e = "Det där var ingen bildfil";
                    }
                }
                else
                    person.Visningsbild = "noimage.jpg";

                if (ModelState.IsValid) {
                    using (var db = new IdrottContext()) {
                        var up = db.Personer.Where(p => p.PersonId == person.PersonId).FirstOrDefault();
                        up.PersonId = person.PersonId;
                        up.PersonNamn = person.PersonNamn;
                        up.Epost = person.Epost;
                        up.Alder = person.Alder;
                        if (bytaBild)
                            up.Visningsbild = person.Visningsbild;

                        db.SaveChanges();
                    }
                    TempData["MeddelandeSuccess"] = "Medlemmen är editerat med de nya uppgifterna.";
                    return RedirectToAction(nameof(Index));
                }
            }
            catch (Exception) {
                throw;
            }
            TempData["MeddelandeFail"] = "Kunde inte editera personen.";
            return NotFound();
        }
    }
}


