public GebruikerKlantViewModel GebruikerKlantViewModel(Gebruiker gebruiker)
        {
            GebruikerKlantViewModel gkvm = new GebruikerKlantViewModel();

            if(gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    gkvm.setDepartementen(uow.DepartementRepository.All);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    gkvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return gkvm;
        }
        public UurRegistratieViewModel UurRegistratieViewModel(Gebruiker gebruiker, bool gefactureerd)
        {
            UurRegistratieViewModel gkvm = new UurRegistratieViewModel();
            gkvm.Gefactureerd = gefactureerd;

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    gkvm.setDepartementen(uow.DepartementRepository.All);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR || gebruiker.Rol == Rol.USER)
                {
                    gkvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return gkvm;
        }
        public KlantViewModel KlantViewModel(Gebruiker gebruiker)
        {
            KlantViewModel kvm = new KlantViewModel();
            kvm.Klant = new Klant(); 

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    IEnumerable<Departement> alleDepartementen = uow.DepartementRepository.All;
                    kvm.setDepartementen(alleDepartementen);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    kvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return kvm;
        }
        public IEnumerable<Klant> AlleKlanten(Gebruiker gebruiker)
        {
            List<Klant> alleKlanten = new List<Klant>();

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    alleKlanten = uow.KlantRepository.All.ToList();
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    foreach (Departement dep in gebruiker.Departementen())
                    {
                        alleKlanten.AddRange(dep.Klanten());
                    }
                }
            }

            return alleKlanten;
        }
        public IEnumerable<Departement> AlleMogelijkeDepartementen(Gebruiker gebruiker)
        {
            List<Departement> departementen = new List<Departement>();
            IEnumerable<DepartementKlant> alleDepartementKlanten = uow.DepartementKlantRepository.All;

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    departementen.AddRange(alleDepartementKlanten.Select(dk => dk.Departement).Distinct());
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    IEnumerable<Departement> depsVanGebruiker = gebruiker.Departementen();
                    departementen.AddRange(
                        alleDepartementKlanten.Select(dk => dk.Departement)
                                              .Where(d => depsVanGebruiker.Contains(d))
                                              .Distinct());
                }
            }

            return departementen;
        }
        public void OntkoppelDepartementVanKlant(int departementId, int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);
            Departement departement = uow.DepartementRepository.Find(departementId);

            if (klant == null || departement == null)
            {
                throw new Exception("Klant of departement onbekend");
            }
            if (klant.DepartementKlanten.Count < 2)
            {
                throw new Exception("Een klant moet minstens aan één departement gekoppeld zijn");
            }
            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                if (!gebruiker.Departementen().Contains(departement))
                {
                    throw new Exception("Als departement administrator kan je enkel klanten ontkoppelen van je eigen departementen");
                }
            }

            DepartementKlant ontkoppeld = klant.OntkoppelVanDepartement(departement);
            uow.DepartementKlantRepository.Delete(ontkoppeld.Id);
            uow.saveChanges();
        }
        public void Delete(int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);
            if (klant == null)
            {
                throw new Exception("Geen klant gevonden");
            }
            if (!klant.Verwijderbaar())
            {
                throw new Exception("De Klant is niet verwijderbaar omdat er al uurregistraties en/of facturen aan gekoppeld zijn");
            }

            List<DepartementKlant> departementKlanten = klant.DepartementKlanten.ToList();
            List<GebruikerKlant> gebruikerKlanten = klant.GebruikerKlanten();

            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                IEnumerable<Departement> klantDepartementen = departementKlanten.Select(dk => dk.Departement);
                IEnumerable<Departement> gebruikerDepartementen = gebruiker.Departementen();
                if (klantDepartementen.Except(gebruikerDepartementen).Count() > 0)
                {
                    throw new Exception("Als departement administrator kan je geen klanten verwijderen die koppelingen hebben met departementen waar je niet voor bevoegd bent");
                }
            }

            gebruikerKlanten.Select(gk => gk.Id).ToList().ForEach(
                id => uow.GebruikerKlantRepository.Delete(id)
                );

            departementKlanten.Select(dk => dk.Id).ToList().ForEach(
                id => uow.DepartementKlantRepository.Delete(id)
                );

            uow.KlantRepository.Delete(klantId);
            uow.saveChanges();
        }
        public IEnumerable<Departement> MogelijkeDepartementenKlantGebruiker(int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);

            if (klant == null || gebruiker == null)
            {
                throw new Exception("Klant of gebruiker onbekend");
            }

            IEnumerable<Departement> result = null;

            IEnumerable<Departement> alleDepartementen = uow.DepartementRepository.All;
            IEnumerable<Departement> klantDepartementen = klant.Departementen();

            if (gebruiker.Rol == Rol.ADMINISTRATOR)
            {
                result = alleDepartementen.Except(klantDepartementen);
            }
            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                IEnumerable<Departement> gebruikerDepartementen = gebruiker.Departementen();
                result = gebruikerDepartementen.Except(klantDepartementen);
            }

            return result;
        }