/// <summary>
        /// Krijg de basislijst. Dus alle set namen.
        /// En indien gewenst ook de inhoud van de 'common' set.
        /// </summary>
        private IList <IZoekresultaat> ZoekBasisDatabaseLijst(ZoekRestricties zoekRestricties)
        {
            var alleDatabases = Enumerable.Empty <IZoekresultaat>();

            // zoekrestricties toepassen
            if (zoekRestricties.ZoekInBijbel && !zoekRestricties.ZoekInLiederen)
            {
                alleDatabases = _databaseZoek.KrijgAlleSetNamenInBijbelDb();
            }
            else if (!zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen)
            {
                alleDatabases = _databaseZoek.KrijgAlleSetNamenInNormaleDb();
            }
            else if (zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen)
            {
                alleDatabases = _databaseZoek.KrijgAlleSetNamen();
            }

            // Alle slide templates zoals amen, votum, bidden etc)
            if (zoekRestricties.ZoekInCommon)
            {
                alleDatabases = alleDatabases.Concat(_databaseZoek.KrijgAlleFragmentenUitNormaleDb(FileEngineDefaults.CommonFilesSetName));
            }

            return(alleDatabases.ToList());
        }
        private IList <IZoekresultaat> ZoekFragmenten(ZoekRestricties zoekRestricties, string setNaam)
        {
            var alleFragmenten = Enumerable.Empty <IZoekresultaat>();

            // zoekrestricties toepassen
            if (zoekRestricties.ZoekInBijbel && !zoekRestricties.ZoekInLiederen)
            {
                alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitBijbelDb(setNaam);
            }
            else if (!zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen)
            {
                alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitNormaleDb(setNaam);
            }
            else if (zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen)
            {
                alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitAlleDatabases(setNaam);
            }

            return(alleFragmenten.ToList());
        }
 private IEnumerable <IVrijZoekresultaatMogelijkheid> KrijgBasisDatabaseLijst(ZoekRestricties zoekRestricties, bool cached)
 {
     if (!cached)
     {
         return(ZoekBasisDatabaseLijst(zoekRestricties)
                .Select(t => new ZoekresultaatItem()
         {
             Weergave = t.Resultaat.Weergave,
             VeiligeNaam = t.Resultaat.VeiligeNaam,
             UitDatabase = t.Database.Weergave,
         })
                .Distinct().ToList());
     }
     else
     {
         if (_onderdelenLijstCache == null || !zoekRestricties.Equals(_onderdelenLijstRestrictiesCache))
         {
             _onderdelenLijstCache            = KrijgBasisDatabaseLijst(zoekRestricties, false);
             _onderdelenLijstRestrictiesCache = zoekRestricties;
         }
         return(_onderdelenLijstCache);
     }
 }
        /// <summary>
        /// Dit maakt een lijst van resultaten die voldoen aan de zoektekst. Filteren gebeurd hier niet maar in de UI zelf.
        /// We helpen de UX beleving door de UI niet direct alle mogelijkheden meteen terug te geven, alleen te verdiepen waar de gebruiker
        /// echt naar zoekt.
        /// Verder wordt aangegeven welke zoekresultaten veranderd zijn zodat de UI de verwijderde of toegevoegde elementen kan animeren
        /// of iets dergelijks.
        /// </summary>
        public IVrijZoekresultaat VrijZoeken(string zoekTekst, bool alsBijbeltekst = false, IVrijZoekresultaat vorigResultaat = null)
        {
            var veiligeZoekTekst   = (zoekTekst ?? "").TrimStart();
            var veranderingGemaakt = vorigResultaat == null;
            var zoekRestricties    = new ZoekRestricties(alsBijbeltekst);
            var aanname            = vorigResultaat?.Aanname;
            var laatsteZoektekenIsFragmentWissel = veiligeZoekTekst.Length > 0 ? LiturgieInterpretator.LiturgieTekstNaarObject.BenamingDeelScheidingstekens.Contains(veiligeZoekTekst.Last()) : false;

            var onderdeelLijst       = KrijgBasisDatabaseLijst(zoekRestricties, true);
            var fragmentLijst        = Enumerable.Empty <IVrijZoekresultaatMogelijkheid>();
            var vorigeZoektermSplit  = _liturgieTekstNaarObject.VanTekstregel(vorigResultaat == null ? "" : vorigResultaat.ZoekTerm);
            var huidigeZoektermSplit = _liturgieTekstNaarObject.VanTekstregel(veiligeZoekTekst);

            // Wisselen tussen bijbeltekst vinkje of niet geeft natuurlijk grote wijziging
            if (vorigResultaat != null && vorigResultaat.AlsBijbeltekst != alsBijbeltekst)
            {
                veranderingGemaakt = true;
            }

            // Let op: Omdat de UI zelf filtert detecteren we hier alleen overgangen.

            // Kijk of er in de zoektekst een spatie is gebruikt, dan komt er nu een overgang aan
            if ((veiligeZoekTekst.Length > 0 && laatsteZoektekenIsFragmentWissel) || (string.IsNullOrWhiteSpace(vorigeZoektermSplit.Deel) && !string.IsNullOrWhiteSpace(huidigeZoektermSplit.Deel)))
            {
                // Fragment is er bij gekomen
                veranderingGemaakt = true;
                fragmentLijst      = ZoekFragmenten(zoekRestricties, huidigeZoektermSplit.Benaming).Select(t => new ZoekresultaatItem()
                {
                    Weergave    = $"{huidigeZoektermSplit.Benaming} {t.Resultaat.Weergave}",
                    UitDatabase = t.Database.Weergave,
                }).ToList();

                // Geen aannames meer
                aanname = null;
            }
            // Zo gauw je de spatie weghaald is de overgang weer weg
            else if ((veiligeZoekTekst.Length == 0 || !laatsteZoektekenIsFragmentWissel) && string.IsNullOrWhiteSpace(huidigeZoektermSplit.Deel) && (vorigResultaat != null && vorigResultaat.ZoekTerm.Length > 0 && LiturgieInterpretator.LiturgieTekstNaarObject.BenamingDeelScheidingstekens.Contains(vorigResultaat.ZoekTerm.Last())))
            {
                // Fragment is weer weg gehaald
                veranderingGemaakt = true;
            }

            // Bepaal het nieuwe zoekresultaat
            var nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt);

            if (vorigResultaat == null)
            {
                return(nieuwResultaat);
            }

            // Het kan zijn dat bij het vorige zoekresultaat nog meerdere opties mogelijk waren, maar dat er nu nog maar 1 optie mogelijk is,
            // terwijl je nog wel een paar tekens moet typen. Dat kan handiger,  we maken de aanname dat je deze ene optie bedoelt:
            if (!laatsteZoektekenIsFragmentWissel && vorigResultaat.Aanname == null && VoorspelZoekresultaat(vorigResultaat.AlleMogelijkheden, vorigResultaat.ZoekTerm).Count() > 1 && VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).Count() == 1)
            {
                veranderingGemaakt = true;
                aanname            = VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).First().Weergave;

                // Fragment toevoegen op basis van aanname
                fragmentLijst = ZoekFragmenten(zoekRestricties, aanname).Select(t => new ZoekresultaatItem()
                {
                    Weergave    = $"{aanname} {t.Resultaat.Weergave}",
                    UitDatabase = t.Database.Weergave,
                }).ToList();

                nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt);
            }
            // Als de aanname niet meer gemaakt kan worden
            else if (!string.IsNullOrEmpty(vorigResultaat.Aanname) && VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).Count() > VoorspelZoekresultaat(vorigResultaat.AlleMogelijkheden, vorigResultaat.ZoekTerm).Count())
            {
                veranderingGemaakt = true;
                aanname            = null;

                nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt);
            }

            return(nieuwResultaat);
        }