This code will display two parametric surfaces:
ParametricPlot3D[{ {4 + (3 + Cos[v]) Sin[u], 4 + (3 + Cos[v]) Cos[u], 4 + Sin[v]}, {8 + (3 + Cos[v]) Cos[u], 3 + Sin[v], 4 + (3 + Cos[v]) Sin[u]} }, {u, 0, 2 Pi}, {v, 0, 2 Pi}, PlotStyle -> {Red, Green}] 
How to find minimal distance between these surfaces? (u and v do not need to be the same for both surfaces at the point of minimum; points can be chosen independently on two surfaces; in other words, geometric minimum is needed)
I tried to setup NMinimize[], but didn't get meaningful results.
This is inspired by a couple of similar recent questions (here and here), I wanted to know how to apply similar techniques in different circumstances.
Naturally, I would like the method of the solution to be able to work on many other examples of two surfaces, this is just a fairly simple example... For example, if two surfaces intersect or touch, the method should return 0 as for minimal distance, etc... I appreciate your time and effort!

