using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Web.Mvc;
using AutomatizovanySklad.Core.Entity;
using Microsoft.AspNet.Identity;
using Web.Models;
using Web.Models.Zamestnanec;
using static System.String;


namespace Web.Controllers {
  public class ZamestnanecController : BaseController {

    [Authorize(Roles = "Vedouci")]
    public ActionResult Index() {
      var listZamestnancu = databaze.Zamestnanci.Where(z => z.JeAktivni).ToList();
      var listZamestnancuModel = new ZamestnanecListModel();
      listZamestnancuModel.Zamestnanci = new List<ZamestnanecModel>();
      foreach (Zamestnanec item in listZamestnancu) {
        listZamestnancuModel.Zamestnanci.Add(EntitaToZamestnanec(item));
      }
      listZamestnancuModel.Title = "Seznam zaměstnanců";
      return View(listZamestnancuModel);
    }

    [Authorize(Roles = "Vedouci")]
    public ActionResult Vytvor() {
      var zamestnanecModel = new ZamestnanecModel { };
      zamestnanecModel.Title = "Vytvoř zaměstnance";
      return View(zamestnanecModel);
    }

    [Authorize(Roles = "Vedouci")]
    [HttpPost]
    public ActionResult Vytvor(ZamestnanecModel zamestnanecModel) {
      if (ModelState.IsValid) {
        var zamestnanec = ZamestnanecToEntita(zamestnanecModel);
        zamestnanec.JeAktivni = true;
        zamestnanec = PridejDatumVytvoreni(zamestnanec);
        databaze.Zamestnanci.Add(zamestnanec);
        databaze.SaveChanges();
        Success("Zaměstnanec byl úspěšně vytvořen.", true);
      }
      return RedirectToAction("Index", "Zamestnanec");
    }

    [Authorize(Roles = "Vedouci")]
    public ActionResult Editovat(int id) {
      var zamestnanecZDatabaze = databaze.Zamestnanci.First(z => z.Id == id);
      var zamestnanecModel = EntitaToZamestnanecEdit(zamestnanecZDatabaze);
      zamestnanecModel.Title = "Editovat zaměstnance";
      return View(zamestnanecModel);
    }

    [HttpPost]
    [Authorize(Roles = "Vedouci")]
    public ActionResult Editovat(ZamestnanecEditModel zamestnanecModel) {
      if (ModelState.IsValid) {
        //Najdi zamestnance a preved model na entitu
        var zamestnanec = databaze.Zamestnanci.First(z => z.Id == zamestnanecModel.Id);
        var novyZamestnanec = ZamestnanecEditToEntita(zamestnanecModel);
        var staryTypZamestnance = zamestnanec.TypZamestnance;
        //Porovnej emaily zda jsou rozdilne a jestliže jo nahrad
        if (zamestnanec.TypZamestnance != zamestnanecModel.TypZamestnance & !IsNullOrEmpty(zamestnanec.Email)) {
          novyZamestnanec.TypZamestnance = zamestnanecModel.TypZamestnance;
          ZmenTypZamestnance(zamestnanecModel.TypZamestnance, zamestnanecModel.Email);
        }
        // Předání emailu protože první probíhá update zaměstnance
        var novyEmail = novyZamestnanec.Email;
        var staryEmail = zamestnanec.Email;
        novyZamestnanec = PridejDatumZmeny(novyZamestnanec);
        novyZamestnanec.JeAktivni = true;
        databaze.Zamestnanci.AddOrUpdate(novyZamestnanec);
        databaze.SaveChanges();

        //Vybrání aktuální uživatele
        ApplicationUser uzivatel = _userManager.FindByNameAsync(User.Identity.Name).Result;

        //Pokud ma email řeš roli a změnu emailu
        if (!IsNullOrEmpty(staryEmail)) {
          if (staryEmail == uzivatel.Email && staryEmail != novyEmail && zamestnanecModel.TypZamestnance != staryTypZamestnance) {
            var systemUser = _userManager.FindByEmail(staryEmail);
            if (systemUser != null) {
              systemUser.Email = novyEmail;
              systemUser.UserName = novyEmail;
              _userManager.Update(systemUser);
              ZmenTypZamestnance(zamestnanecModel.TypZamestnance, novyEmail);
              return RedirectToAction("Odlasit", "Account", new { zprava = "Změnil jsi email i svou roli, znovu se přihlaš!" });
            }
          }
          //Pokud aktuální uživatel == uživatelsky email, který se měnil => že je přihlášeny tak potom pro správnost odhlásíme
          if (staryEmail == uzivatel.Email && zamestnanecModel.TypZamestnance != staryTypZamestnance && novyEmail == staryEmail) {
            Warning("Pro správné fungování se znovu přihlaš.");
            //Pro vymazani cookies a nacteni noveho layoutu
            return RedirectToAction("Odlasit", "Account", new { zprava = "Změnil jsi práva pro svou osobu, pro správnou funkčnost se prosím přihlaš." });
            //Pokud je prihlasen a mění se email
          } else if (staryEmail == uzivatel.Email && staryEmail != novyEmail) {
            //Pokud se mění login pod aktuálním uživatelem pro vymazání cookies signOut
            var systemUser = _userManager.FindByEmail(staryEmail);
            if (systemUser != null) {
              systemUser.Email = novyEmail;
              systemUser.UserName = novyEmail;
              _userManager.Update(systemUser);
              return RedirectToAction("Odlasit", "Account", new { zprava = "Pro správné fungování se znovu přihlaš, již pod novým loginem." });
            }
          } else {
            //Jinak je vše ok
            //Nahraď email v ASPNET identity až po změně zaměstnance
            var systemUser = _userManager.FindByEmail(staryEmail);
            if (systemUser != null) {
              systemUser.Email = novyEmail;
              systemUser.UserName = novyEmail;
              _userManager.Update(systemUser);

            }
          }
        }
        Success("Zaměstnanec byl editován úspěšně.", true);
        return RedirectToAction("Index", "Zamestnanec");
      }
      Danger("Něco se nepovedlo. Přesvědčte se zda je vše správně vyplněné!");
      return RedirectToAction("Index", "Zamestnanec");
    }

    [Authorize(Roles = "Vedouci")]
    public ActionResult Deaktivovat(int id) {
      var zamestnanec = databaze.Zamestnanci.FirstOrDefault(z => z.Id == id);
      if (zamestnanec.Email != null) {
        var systemUser = _userManager.FindByEmail(zamestnanec.Email);
        if (systemUser != null) {
          _userManager.Delete(systemUser);
        }
        zamestnanec.JeAktivni = false;
        databaze.Zamestnanci.AddOrUpdate(zamestnanec);
      } else {
        zamestnanec.JeAktivni = false;
        databaze.Zamestnanci.AddOrUpdate(zamestnanec);
      }

      databaze.SaveChanges();
      Success("Zaměstnanec byl úspěšně deaktivován.", true);
      return RedirectToAction("Index", "Zamestnanec");
    }

    [Authorize(Roles = "Vedouci")]
    public ActionResult Detail(int id) {
      var zamestnanecZDatabaze = databaze.Zamestnanci.First(z => z.Id == id);
      var zamestnanecModel = EntitaToZamestnanec(zamestnanecZDatabaze);
      zamestnanecModel.Title = "Detail zaměstnance.";
      return View(zamestnanecModel);
    }

    public JsonResult ExistujeEmailVytvoreni(string email) {
      return Json(!databaze.Zamestnanci.Where(x => x.JeAktivni).Any(x => x.Email == email), JsonRequestBehavior.AllowGet);
    }

    public JsonResult ExistujeEmailEditace(string email, int id) {
      return Json(!databaze.Zamestnanci.Where(x => x.JeAktivni).Where(x => x.Id != id).Any(x => x.Email == email), JsonRequestBehavior.AllowGet);
    }

    [Authorize(Roles = "Vedouci,Skladnici")]
    public ActionResult OsobniDetail() {
      var user = _userManager.FindById(User.Identity.GetUserId());
      var zamestnanec = databaze.Zamestnanci.FirstOrDefault(z => z.Email == user.Email);
      var zamestnanecModel = EntitaToZamestnanec(zamestnanec);
      return View(zamestnanecModel);
    }

    [Authorize(Roles = "Vedouci,Skladnici")]
    public ActionResult ZmenitHeslo() {
      return View(new HesloModel());
    }

    [HttpPost]
    [Authorize(Roles = "Vedouci,Skladnici")]
    public ActionResult ZmenitHeslo(HesloModel hesloModel) {
      var user = _userManager.FindById(User.Identity.GetUserId());
      user.PasswordHash = _userManager.PasswordHasher.HashPassword(hesloModel.Password);
      var result = _userManager.Update(user);
      if (!result.Succeeded) {
        Danger("Nastala chyba!");
      }
      Success("Heslo změněno!");
      //Kvůli cookies
      _userManager.UpdateSecurityStamp(user.Id);
      return RedirectToAction("Index", "Home");
    }

  }
}