using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net;
using ITVisions;
using EFCore_Kontext;
using ITVisions.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

// ReSharper disable All

namespace ITVisions.Controllers
{

 public class HomeController : Controller
 {

  Autor Options { get; }
  private IHostingEnvironment _env;

  /// <summary>
  /// Konstruktor
  /// </summary>
  /// <param name="appEnvironment">via DI, siehe Startup.cs</param>
  ///   /// <param name="appEnvironment">via DI, siehe AddOptions in Startup.cs</param>
  //public HomeController(IOptions<Autor> optionsAccessor, IHostingEnvironment env)
  //{

   //if (String.IsNullOrEmpty(this.Options.Name)) Debugger.Break();
   //HttpContext.Session.SetObject("AutorObj", new Autor() { Name = "HS" });
   //HttpContext.Session.GetObjectFromJson<Autor>("AutorObj").Name;
  //}

  private FlugService flugservice1;
  private IFlugService flugservice2;
  public HomeController(IOptions<Autor> optionsAccessor, IHostingEnvironment env, FlugService flugservice1, IFlugService flugservice2)
  {
   this.Options = optionsAccessor.Value;
   _env = env;
   this.flugservice1 = flugservice1;
   this.flugservice2 = flugservice2;
  }


  public IActionResult Cookies()
  {
   const string COOKIENAME = "ASPNETCoreDemo_LetzterAufruf";

   // Cookie lesen und in Tupel speichern
   var letzterAbruf = HttpContext.Request.Cookies[COOKIENAME];
   (string LetzterAbruf, string Jetzt) wert = (letzterAbruf, Jetzt: DateTime.Now.ToString());

   // Cookie setzen
   CookieOptions option = new CookieOptions();
   option.Expires = DateTime.Now.AddMinutes(20); 
   this.Response.Cookies.Append(COOKIENAME, DateTime.Now.ToString(), option);
   
   // Tupel an View übergeben
   return View(wert);
  }

  /// <summary>
  /// Beispiel neues Session-API
  /// </summary>
  public IActionResult Sessions()
  {
   int aufrufe = 0;
   aufrufe = HttpContext.Session.GetInt32("aufrufe") ?? 0;
   HttpContext.Session.SetInt32("aufrufe", ++aufrufe);
   HttpContext.Session.SetObject("AutorObj", new Autor() { Name = "HS" });
   var autor = HttpContext.Session.GetObject<Autor>("AutorObj");
   ViewBag.Aufrufe = aufrufe;
   return View();
  }

  /// <summary>
  /// Beispiel neues Konfiguration-API
  /// </summary>
  public IActionResult Konfiguration()
  {
   var e = "";

   // mehrere Konfigurationsdateien festlegen
   var builder = new ConfigurationBuilder()
    .SetBasePath(_env.WebRootPath) // Console: Directory.GetCurrentDirectory()
    .AddJsonFile(@"Config\Config.json")
    .AddIniFile(@"Config\Config.ini", true)
    .AddXmlFile(@"Config\Config.xml")
    .AddInMemoryCollection()
    .AddEnvironmentVariables();
    //.AddCommandLine(new string[] { "--about:Umgebungen", "Dev" });

   // Gesamtliste aller Konfigurationseinträge erzeugen
   // Bei Dopplungen: Der letzte gewinnt
   IConfigurationRoot configuration = builder.Build();

   // noch einen Eintrag im RAM hinzufügen
   configuration["Impressum:Stand"] = DateTime.Now.ToString();

   // Ausgaben erzeugen
   e = "<h3>Daten aus " + builder.Sources.Count() + " Quellen:</h3>";
   foreach (var p in builder.Sources)
   {
    e += p.ToString() + "<br>";
   }

   e += "<h3>Zugriff auf einzelne Einträge:</h3>";

   // Einträge abrufen
   var connstring = configuration["Data:DefaultConnection:ConnectionString"];
   var author = configuration["Impressum:Autor"];
   var gibtesnicht = configuration["wertdenesnichtgibt"];
   var aktuelleZeit = configuration["Impressum:Stand"];

   e += connstring + "Autor: " + author + "<br>Wert, den es nicht gibt: " + gibtesnicht + "<br>Aktuelle Zeit: " + aktuelleZeit + "<br>";
   
   IConfigurationSection section2 = configuration.GetSection("Impressum");
   e += "<h3>Alle Einträge der Konfigurationssektion 'Impressum':</h3>";
   foreach (var s in section2.GetChildren())
   {
    e += s.Key + "=" + s.Value  + "<br>";
   }

   e += "<h3>Alle Einträge der Konfigurationssektion 'Versionsgeschichte':</h3>";
   e += "1. Versionseintrag: " + configuration["Versionsgeschichte:0:Version"] + "<br>";

   IConfigurationSection section3 = configuration.GetSection("Versionsgeschichte");
   foreach (var geschichte in section3.GetChildren())
   {
    foreach (var geschichtseintrag in geschichte.GetChildren())
    {
     e += geschichtseintrag.Key + "=" + geschichtseintrag.Value + "<br>";
    }
   }

   e += "<h3>Injiziertes Konfigurationsobjekt:</h3>";
   e += "Objekt: " + this.Options.ToString() + "<br>";
   e += "Name: " + this.Options.Name + "<br>";
   e += "Website: " + this.Options.Website + "<br>";

   ViewBag.Content = e;
   return View();
  }

  public IActionResult Index()
  {
   ViewBag.Version = DateTime.Now.ToString();
   return View();
  }

  public ActionResult RazorSyntax()
  {
   ViewBag.Version = DateTime.Now.ToString();
   return View();
  }

  public IActionResult Datenuebergabe()
  {
   var w = new WebsiteInfo("Holger Schwichtenberg", 2016, new Version(1, 0));
   ViewBag.Datum = DateTime.Now.ToString();
   ViewData["Datum"] = DateTime.Now.ToString();
   TempData["Datum"] = DateTime.Now.ToString();

   HttpContext.Session.SetString("Datum", DateTime.Now.ToString());
   return View(w);
  }

  const string sessionKey = "WebsiteInfo";

  public IActionResult Eingabemaske()
  {
   var wsi = HttpContext.Session.GetObject<WebsiteInfo>(sessionKey);
   if (wsi == null) wsi = new WebsiteInfo("Holger Schwichtenberg", 2016, new Version(1, 0, 0, 0));
   return View(wsi);
  }

  [HttpPost]
  // [FromBody] WebsiteInfo wsi
  public IActionResult EingabemaskeSpeichern1(string Autor, [Range(2016, 2099)] int Jahr, string Version)
  {
   if (Jahr >= 2015)
   {
    //if (await this.TryUpdateModelAsync(wsi, typeof(WebsiteInfo), ""))
    //{
    var wsi = new WebsiteInfo(Autor, Jahr, new Version(Version));
    TempData["Nachricht"] = "Speichern1: " + wsi.Autor + "/" + wsi.Jahr + "/" + wsi.Version;
    ViewBag.Nachricht = TempData["Nachricht"];
    HttpContext.Session.SetObject(sessionKey, wsi);
   }
   else
   {

    ViewData.ModelState.AddModelError("Jahr", "muss >= 2016 sein!");
   }
   //}
   //else
   //{
   // ViewBag.Nachricht = "Keine Daten empfangen!";
   //}
   return View("Eingabemaske"); ;

  }

  [HttpPost]
  public IActionResult EingabemaskeSpeichern2([FromForm] WebsiteInfo wsi)
  {
   if (ModelState.IsValid)
   {
    TempData["Nachricht"] = "Speichern2: " + wsi.Autor + "/" + wsi.Jahr + "/" + wsi.Version;
    ViewBag.Nachricht = TempData["Nachricht"];
    HttpContext.Session.SetObject(sessionKey, wsi);

   }
   return View("Eingabemaske");
  }

  [HttpGet]
  public IActionResult EingabemaskeSpeichern3(WebsiteInfo wsi)
  {
   if (ModelState.IsValid)
   {
    TempData["Nachricht"] = "Speichern3: " + wsi.Autor + "/" + wsi.Jahr + "/" + wsi.Version;
    ViewBag.Nachricht = TempData["Nachricht"];
    HttpContext.Session.SetObject(sessionKey, wsi);
   }

   return View("Eingabemaske");
  }

  public IActionResult TagHelper()
  {
   var Orte = new List<SelectListItem>();
   Orte.Add(new SelectListItem() { Text = "Rom" });
   Orte.Add(new SelectListItem() { Text = "Berlin" });
   Orte.Add(new SelectListItem() { Text = "Paris" });
   Orte.Add(new SelectListItem() { Text = "London" });
   ViewBag.Orte = Orte;

   return View();
  }


  public IActionResult TagHelperEigene()
  {
   ViewBag.WebsiteInfo = new WebsiteInfo("Holger Schwichtenberg", 2015, new Version(0, 7, 0, 0));
   var flug = new WWWingsContext().Flug.FirstOrDefault();
   return View(flug);
  }
  public IActionResult About()
  {
   ViewBag.Message = "Dies ist eine Demo-Awendung!";

   return View();
  }

  public IActionResult Contact()
  {
   ViewBag.Message = "Your contact page.";

   return View();
  }


  public IActionResult Paketmanager()
  {
#if DNX451
   ViewBag.Datum = DateTime.Now.ToLongDateString();
#endif
#if DNXCORE50
    ViewBag.Datum = $"{DateTime.Now:D}";

#endif
   return View();
  }


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