private void UpdateStraatnm(StreetNameExtractItemV2 streetName, List <StreetNameName> streetNameNames)
        => UpdateRecord(streetName, record =>
        {
            foreach (var streetNameName in streetNameNames)
            {
                switch (streetNameName.Language)
                {
                case Language.Dutch:
                    streetName.NameDutch = streetNameName.Name;
                    break;

                case Language.French:
                    streetName.NameFrench = streetNameName.Name;
                    break;

                case Language.German:
                    streetName.NameGerman = streetNameName.Name;
                    break;

                case Language.English:
                    streetName.NameEnglish = streetNameName.Name;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(streetName), streetName, null);
                }
            }
        });
        private void UpdateHomoniemtv(StreetNameExtractItemV2 streetName, Language?language, string homonymAddition)
        => UpdateRecord(streetName, record =>
        {
            switch (language)
            {
            case Language.Dutch:
                streetName.HomonymDutch = homonymAddition?.Substring(0, Math.Min(homonymAddition.Length, 5));
                break;

            case Language.French:
                streetName.HomonymFrench = homonymAddition?.Substring(0, Math.Min(homonymAddition.Length, 5));
                break;

            case Language.German:
                streetName.HomonymGerman = homonymAddition?.Substring(0, Math.Min(homonymAddition.Length, 5));
                break;

            case Language.English:
                streetName.HomonymEnglish = homonymAddition?.Substring(0, Math.Min(homonymAddition.Length, 5));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(language), language, null);
            }
        });
        private void UpdateRecord(StreetNameExtractItemV2 municipality, Action <StreetNameDbaseRecord> updateFunc)
        {
            var record = new StreetNameDbaseRecord();

            record.FromBytes(municipality.DbaseRecord, _encoding);

            updateFunc(record);

            municipality.DbaseRecord = record.ToBytes(_encoding);
        }
        public StreetNameExtractProjectionsV2(IOptions <ExtractConfig> extractConfig, Encoding encoding)
        {
            _extractConfig = extractConfig.Value;
            _encoding      = encoding ?? throw new ArgumentNullException(nameof(encoding));

            When <Envelope <StreetNameWasProposedV2> >(async(context, message, ct) =>
            {
                var streetNameExtractItemV2 = new StreetNameExtractItemV2
                {
                    StreetNamePersistentLocalId = message.Message.PersistentLocalId,
                    MunicipalityId = message.Message.MunicipalityId,
                    DbaseRecord    = new StreetNameDbaseRecord
                    {
                        gemeenteid = { Value = message.Message.NisCode },
                        versieid   = { Value = message.Message.Provenance.Timestamp.ToBelgianDateTimeOffset().FromDateTimeOffset() }
                    }.ToBytes(_encoding)
                };
                UpdateStraatnm(streetNameExtractItemV2, message.Message.StreetNameNames);
                await context
                .StreetNameExtractV2
                .AddAsync(streetNameExtractItemV2, ct);
            });

            When <Envelope <MunicipalityNisCodeWasChanged> >(async(context, message, ct) =>
            {
                var streetNames = context
                                  .StreetNameExtractV2
                                  .Local
                                  .Where(s => s.MunicipalityId == message.Message.MunicipalityId)
                                  .Union(context.StreetNameExtractV2.Where(s => s.MunicipalityId == message.Message.MunicipalityId));

                foreach (var streetName in streetNames)
                {
                    UpdateRecord(streetName, i => i.gemeenteid.Value = message.Message.NisCode);
                }
            });
        }
 private void UpdateVersie(StreetNameExtractItemV2 streetName, Instant timestamp)
 => UpdateRecord(streetName, record => record.versieid.SetValue(timestamp.ToBelgianDateTimeOffset()));
 private void UpdateStatus(StreetNameExtractItemV2 streetName, string status)
 => UpdateRecord(streetName, record => record.status.Value = status);