Так как задача довольно объёмная и на этом этапе выплюнуть универсальный рецепт сложно (осторожно многобуков) - предлагаю разделить решение на несколько частей. Рекомендации сугубо мои, не являюсь первоинстанцией, это не рецепт - это подход.
Надо всего лишь перестать грустить!