public Sentence ShuffleSentence(Sentence sentence)
        {
            if (!sentence.Texts.Any(text => text.IsMDBK()))
            {
                return(sentence);
            }

            var mdbkSentenceDecorator = new MdbkSentenceDecorator(sentence);

            var mdbkUnitUpToVbVbaPastPresBkp =
                mdbkSentenceDecorator.MdbkUnitUpToVbVbaPastPresBkp();

            if (mdbkUnitUpToVbVbaPastPresBkp.Any(text => text.IsModifier))
            {
                ApplyMdShufflingRules(
                    sentence, mdbkSentenceDecorator.MdbkPosition, mdbkSentenceDecorator);
            }
            else
            {
                if (mdbkUnitUpToVbVbaPastPresBkp.Any(text => text.IsNN))
                {
                    int lastNnPosition =
                        mdbkSentenceDecorator.LastNNPositionAfter(mdbkUnitUpToVbVbaPastPresBkp);

                    InsertDeParticleAtPosition(sentence, lastNnPosition + 1);

                    UnderlineMdbkToDe(sentence, mdbkSentenceDecorator.MdbkPosition);
                }
            }

            if (mdbkSentenceDecorator.NnUnitBeforeMdbk(
                    sentence, mdbkSentenceDecorator.MdbkPosition))
            {
                int nnPosition =
                    mdbkSentenceDecorator.NNPositionBeforeMdbk();

                if (mdbkSentenceDecorator.ByBeforeNN(sentence, nnPosition))
                {
                    return(sentence);
                }

                if (mdbkSentenceDecorator.PrenBeforeNN(sentence, nnPosition))
                {
                    MoveMdbkbeforePren(
                        sentence, nnPosition, mdbkSentenceDecorator.MdbkPosition, mdbkSentenceDecorator);
                }
                else if (mdbkSentenceDecorator.AdjBeforeNN(sentence, nnPosition))
                {
                    MoveMdbkBeforeAdj(
                        sentence, nnPosition, mdbkSentenceDecorator.MdbkPosition, mdbkSentenceDecorator);
                }
                else
                {
                    MoveMdbkBeforeUnit(
                        sentence, mdbkSentenceDecorator.MdbkPosition, nnPosition);
                }
            }

            return(sentence);
        }
        private void MoveMdbkBeforeAdj(
            Sentence sentence, int nnPosition, int mdbkPosition, MdbkSentenceDecorator mdbkSentenceDecorator)
        {
            //2.1.2.2.If PREN is not found, search for an ADJ unit.If found, move MDBK to before ADJ.
            int adjPosition =
                mdbkSentenceDecorator.GetTextsUpToNN(sentence, nnPosition).ToList().FindLastIndex(
                    text => text.IsType(UnitTypes.ADJ_Adjective));

            MoveMdbkBeforeUnit(sentence, mdbkPosition, adjPosition);
        }
        private static void MoveMdbkbeforePren(
            Sentence sentence, int nnPosition, int mdbkPosition, MdbkSentenceDecorator mdbkSentenceDecorator)
        {
            // 2.1.2.1.	If PREN is found, move MDBK to before PREN
            int prenPosition =
                mdbkSentenceDecorator.GetTextsUpToNN(sentence, nnPosition).ToList().FindLastIndex(
                    text => text.IsPren);

            MoveMdbkBeforeUnit(sentence, mdbkPosition, prenPosition);
        }
        private static void ApplyMdShufflingRules(
            Sentence sentence, int mdbkPosition, MdbkSentenceDecorator mdbkSentenceDecorator)
        {
            // 1.1.1
            int modifierPosition =
                mdbkSentenceDecorator.ModifierPositionAfterMdbk;

            InsertDeParticleAtPosition(
                sentence, modifierPosition);

            modifierPosition++;

            var mdSentenceDecorator =
                new MdSentenceDecorator(sentence);

            //*1.1.2.Move the MD unit to after the MDBK unit:
            MoveMdUnitAfterMdbk(
                sentence, mdSentenceDecorator, modifierPosition, mdbkPosition);

            // 1.1.3.Underline MDBK all the way to and including ‘de’ to form one MDBK unit:*/
            UnderlineMdbkToDe(sentence, mdbkPosition);
        }