using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System.Linq;
using EFCore_Kontext;
using Microsoft.AspNetCore.Mvc.Rendering;
using ITVisions.Code;
using EFC_GO;
using Microsoft.Net.Http.Headers;
using DotnetThoughts.AspNetCore;
using ITVisions.AspNetCore;
using Microsoft.EntityFrameworkCore;
using ASPNETCore_NETCore.BL;
//using Microsoft.AspNetCore.Session;

namespace ITVisions.Controllers
{
 public class WWWingsController : Controller
 {
  private FlugManager fm;

  // werden injiziert
  //Application app;
  private WWWingsContext ctx; // = new WWWingsContext();

  //[Activate]
  Application app { get; set; }

  //public WWWingsController()
  //{ 
  // app = new Application();
  //}
  public WWWingsController(WWWingsContext ctx, Application app, FlugManager fm)
  {
   this.fm = fm;
   this.ctx = ctx;
   this.app = app;
   System.Diagnostics.Debug.WriteLine("FlugController: Kontextinstanz #" + ctx.ID);
   System.Diagnostics.Debug.WriteLine("App: IsDebug=" + app.IsDebug);
  }

  public IActionResult About()
  {
   int aufrufe = 0;
   // aufrufe = this.Context.Session.GetInt("aufrufe") ?? 0;
   //this.Context.Session.SetInt("aufrufe", ++aufrufe);
   ViewBag.Aufrufe = aufrufe;
   ViewBag.app = app;
   return View();
  }

  public IActionResult Zerteilt()
  {
   return View();
  }

  public IActionResult Zerteilt2()
  {
   return ViewComponent("FlugTabelle",
    new { Ort = "Essen/Mülheim", Anzahl = 5 });
  }

  [MiddlewareFilter(typeof(HtmlMinificationPipeline))]
  public IActionResult Index()
  {
   this.HttpContext.Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue()
   {
    Public = true,
    MaxAge = TimeSpan.FromSeconds(10)
   };
   this.HttpContext.Response.Headers[HeaderNames.Vary] = new string[] { "Accept-Encoding" };
   ViewBag.Stand = DateTime.Now;
   ViewBag.GesamtAnzahl = ctx.Flug.Count();
   int aufrufe = 0;

   aufrufe = HttpContext.Session.GetInt32("aufrufe") ?? 0;
   HttpContext.Session.SetInt32("aufrufe", ++aufrufe);
   ViewBag.Aufrufe = aufrufe;

   var fluege = ctx.Flug.Take(10).ToList();
   return View(fluege);
  }


  [BindProperty]
  public int Aufrufe { get; set; }
  [BindProperty]
  public DateTime Stand { get; set; }
  [BindProperty]
  public int GesamtAnzahl { get; set; }
  [BindProperty]
  public List<Flug> Flugset { get; set; }

  public IActionResult IndexBinding()
  {
   this.Stand = DateTime.Now;
   this.GesamtAnzahl = ctx.Flug.Count();
   int aufrufe = 0;

   aufrufe = HttpContext.Session.GetInt32("aufrufe") ?? 0;
   HttpContext.Session.SetInt32("aufrufe", ++aufrufe);
   this.Aufrufe = aufrufe;

   this.Flugset = ctx.Flug.Take(10).ToList();
   return View();
  }

  

  // Aufruf: http://localhost:12345/WWWings/Rom/10/20
  [Route("/WWWings/{abflugort}/{von:int}/{bis:int}")]
  public IActionResult Index2(string abflugort, int von, int bis)
  {
   ViewBag.GesamtAnzahl = ctx.Flug.Count();
   //var flugSet = ctx.Flug
   // .Where(x => x.Abflugort == abflugort)
   // .Skip(von).Take(bis - von).ToList();

   var flugSet = fm.GetFlugSet(abflugort, von, bis);
   return View("Index", flugSet);
  }

  [Route("/wwwings/GetFluegeAPI")]
  public List<Flug> GetFluegeAPI()
  {
   var fluege = ctx.Flug.Take(10).ToList();
   return fluege;
  }

  [Route("/wwwings/PlaetzeAendern/{FlugNr}/{anzahl}")]
  //[Route("/wwwings/PlaetzeAendern?FlugNr={FlugNr}&Anzahl={anzahl}")]
  public IActionResult PlaetzeAendern(int FlugNr, short anzahl)
  {
   var flug = ctx.Flug.FirstOrDefault(x => x.FlugNr == FlugNr);
   if (flug == null) throw new Exception("Flug nicht gefunden: " + FlugNr);
   flug.FreiePlaetze += anzahl;
   ctx.SaveChanges();
   TempData["LetzteAenderung"] = $"Letzte Änderung: Flug {FlugNr}: {flug.FreiePlaetze} freie Plätze";
   return RedirectToAction("Index");
  }

  [HttpGet("/wwwings/PlaetzeAendernAPI/{FlugNr}/{anzahl}")]
  public short PlaetzeAendernAPI(int FlugNr, short anzahl)
  {
   var flug = ctx.Flug.FirstOrDefault(x => x.FlugNr == FlugNr);
   if (flug == null) throw new Exception("Flug nicht gefunden: " + FlugNr);
   flug.FreiePlaetze += anzahl;
   ctx.SaveChanges();
   return flug.FreiePlaetze.GetValueOrDefault();
  }

  public IActionResult Neu()
  {
   var flug = new Flug();
   flug.FlugNr = ctx.Flug.OrderByDescending(x => x.FlugNr).Take(1).FirstOrDefault().FlugNr + 1;
   return View(flug);
  }

  // Formulareinsendung mit POST
  [HttpPost]
  public IActionResult Neu([FromForm] Flug flug)
  {
   if (String.IsNullOrEmpty(flug.Abflugort)) flug.Abflugort = "Essen";
   if (String.IsNullOrEmpty(flug.Zielort)) flug.Zielort = "Essen";
   flug.Plaetze = 100;
   flug.FreiePlaetze = 100;
   flug.Datum = DateTime.Now;

   if (ModelState.IsValid)
   {
    ctx.Flug.Add(flug);
    ctx.SaveChanges();
   }
   // weiter mit Home() in Controller Menu
   return RedirectToAction("Index", "Home");
  }

  public IActionResult IndexTagHelper()
  {
   var fluege = ctx.Flug.Take(5).ToList();
   return View(fluege);
  }

  public IActionResult Count()
  {
   return PartialView("~/views/shared/FlugAnzahl.cshtml", 111);
  }

  //[Route("FluglisteNachAbflugort/{ort}")]
  public IActionResult FluglisteNachAbflugort(string ort)
  {
   ViewBag.Ort = ort;
   ViewBag.Stand = DateTime.Now;
   ViewBag.GesamtAnzahl = ctx.Flug.Count();
   ViewBag.Orte = ctx.Flug.Select(x => x.Abflugort).Distinct().ToList();
   IQueryable<Flug> q = ctx.Flug;
   if (!String.IsNullOrEmpty(ort)) q = q.Where(f => f.Abflugort == ort);

   return View(q.Take(20).ToList());
  }

  public class FluglisteNachAbflugort2Result
  {
   public string Ort { get; set; }
   public List<Flug> FlugSet { get; set; }
   public int GesamtAnzahl { get; set; }
   public List<string> Orte { get; set; }

   public DateTime Stand { get; set; }
  }
  //[Route("FluglisteNachAbflugort2/{ort}")]
  public IActionResult FluglisteNachAbflugort2(string ort)
  {
   var ergebnis = new FluglisteNachAbflugort2Result();
   ergebnis.Ort = ort;
   ergebnis.Stand = DateTime.Now;
   ergebnis.GesamtAnzahl = ctx.Flug.Count();
   ergebnis.Orte = ctx.Flug.Select(x => x.Abflugort).Distinct().ToList();
   IQueryable<Flug> q = ctx.Flug;
   if (!String.IsNullOrEmpty(ort)) q = q.Where(f => f.Abflugort == ort);
   ergebnis.FlugSet = q.Take(20).ToList();
   return View(ergebnis);
  }

  public class BuchungsmaskeVM
  {
   public byte Schritt { get; set; }
   public string Abflugort { get; set; }
   public string Zielort { get; set; }
   public string Passagiername { get; set; }

   public int FlugNr { get; set; }
   public int PassagierID { get; set; }
   public List<string> Abflugorte { get; set; }
   public List<string> Zielorte { get; set; }
   public List<Flug> FlugSet { get; set; } = new List<Flug>();
   public List<Passagier> PassagierSet { get; set; } = new List<Passagier>();
  }

  public IActionResult Buchen(byte schritt, string Abflugort, string Zielort, string Passagiername, int FlugNr, int PassagierID)
  {
   BuchungsmaskeVM vm = HttpContext.Session.GetObject<BuchungsmaskeVM>("BuchungsmaskeVM");
   if (vm == null || schritt == 0) vm = new BuchungsmaskeVM();
   if (FlugNr > 0) vm.FlugNr = FlugNr;
   if (PassagierID > 0) vm.PassagierID = PassagierID;
   vm.Schritt = schritt;

   if (!String.IsNullOrEmpty(Abflugort)) vm.Abflugort = Abflugort;
   if (!String.IsNullOrEmpty(Zielort)) vm.Zielort = Zielort;
   if (!String.IsNullOrEmpty(Passagiername)) vm.Passagiername = Passagiername;

   if (schritt == 0) vm.Abflugorte = ctx.Flug.Select(x => x.Abflugort).Distinct().ToList();

   if (schritt == 1 && !String.IsNullOrEmpty(Abflugort)) vm.Zielorte = ctx.Flug.Where(x => x.Abflugort == vm.Abflugort).Select(x => x.Zielort).Distinct().ToList();

   if (schritt == 2)
   {
    vm.FlugSet = ctx.Flug.Where(x => x.Abflugort == vm.Abflugort.Trim() && x.Zielort == vm.Zielort.Trim()).ToList();
    //HttpContext.Response.WriteAsync(schritt.ToString() +";" + vm.FlugSet.Count);
   }
   if (!String.IsNullOrEmpty(Passagiername))
   {
    vm.PassagierSet = ctx.Passagier.Include(x => x.Person).Where(x => (x.Person.Vorname.ToLower() + " " + x.Person.Name.ToLower()).Contains(vm.Passagiername.ToLower())).ToList();
    vm.Schritt = 4;
   }

   if (schritt == 5)
   {
    // nix tun
   }

   if (schritt == 6)
   {
    var b = new FlugPassagier();
    b.FlugFlugNr = vm.FlugNr;
    b.PassagierPersonId = vm.PassagierID;
    ctx.FlugPassagier.Add(b);
   }

   HttpContext.Session.SetObject("BuchungsmaskeVM", vm);
   return View(vm);
  }
 }
}



